INCONSISTENT status
SYSTEM.FUNCTION表损坏
1 | 15/12/16 19:16:14 DEBUG client.ConnectionManager$HConnectionImplementation: |
修复元数据,SYSTEM.FUNCTION表在HBase中不一致性
1 | [qihuang.zheng@spark047213 bin]$ hbase hbck -fixMeta -fixAssignments |
HBase启动的时候, 用hbase shell的list是看不到任何table的. 启动sqlline后, phoenix会创建上面的四张系统表.
下面的第一行SYSTEM.FUNCTION标记为红色的. 正常的话如果表没有损坏,是不会出现Regions in Transition
解决方式: 删除ZooKeeper中的/hbase文件夹, 并重启HBase集群.
1 | [qihuang.zheng@spark047213 ~]$ hbase zkcli |
注意只是删除FUNCTION表貌似不起作用. delete /hbase/table/SYSTEM.FUNCTION
, 要删除整个目录.
节点假死
检测到一个节点当掉了,但是在master页面看这个RS是没有问题的.
1 | hbase(main):003:0> scan 'hbase:meta' |
hbase hbck
检查:
1 | ERROR: RegionServer: spark047209,16020,1450843709733 Unable to fetch region information. org.apache.hadoop.hbase.regionserver.RegionServerStoppedException: org.apache.hadoop.hbase.regionserver.RegionServerStoppedException: Server spark047209,16020,1450843709733 not running, aborting |
修复hbase hbck -fix
失败:
1 | ERROR: Region { meta => data.md5_id2,e4f02e929cd2c7bf53d63e6645904dcf,1450579287871.01431d11f5dfb2c318209ac2bb397340., hdfs => hdfs://tdhdfs/hbase/data/default/data.md5_id2/01431d11f5dfb2c318209ac2bb397340, deployed => } not deployed on any region server. |
解决方式: 还是rm /hbase并重启集群.
建表失败
1 | hbase(main):001:0> create 'data.md5_id2', 'id', {NUMREGIONS => 16, SPLITALGO => 'HexStringSplit'} |
后台RegionServer报错(跟这么应该没关系,因为所有RegionServer节点都报这个错误):
1 | 0 [ReplicationExecutor-0] ERROR org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper - ZooKeeper multi failed after 4 attempts |
解决方式: 还是rm /hbase并重启集群. 最后每个节点都会deployed.
因为集群只有14个RegionServer,而Region数量是16个,所以会有两个节点的Region数为2.
hdfs fsck /hbase
由于hdfs的块损坏,在启动hbase的时候, 会出现Region in transition...failed open
.
1 | [qihuang.zheng@spark047213 ~]$ hbase hbck -fixMeta -fixAssignments |
RegionSplit
第一次导入了一部分数据, 虽然建表时指定了16个Region, 在导入HTable后, Region数量增加了.
BulkLoad没有移动而是复制和Split文件
http://chxt6896.github.io/hbase/2013/06/06/hbase-bulkload.html
BulkLoad只是移动文件, 会很快. 但是实际中在第一次导入一个文件夹很快, 导入第二个文件夹时,就出问题了:
不同集群会复制
http://blackwing.iteye.com/blog/1991901这里说到没有使用同一个集群,会被认为不同的文件系统,就会拷贝,而不是移动.
1 | HADOOP_CLASSPATH=`hbase-1.0.2/bin/hbase classpath` /usr/install/hadoop/bin/hadoop jar hbase-1.0.2/lib/hbase-server-1.0.2.jar completebulkload hdfs://tdhdfs/user/tongdun/id_hbase/id_hbase2_7 data.md5_id2 |
虽然添加了完整的前缀,但是还是会在_tmp下出现文件,说明还是在拷贝.但是这个时候是属于同一个HDFS集群的.
1 | public static void testSameHDFS() throws Exception{ |
在运行上面命令的时候并没有打印日志信息,因为slf4j冲突.
1 | SLF4J: Class path contains multiple SLF4J bindings. |
把hbase的slf4j和phoenix暂时移出去. 日志就出来了.
1 | 15/12/23 11:00:58 WARN mapreduce.LoadIncrementalHFiles: Skipping non-directory hdfs://tdhdfs/user/tongdun/id_hbase/id_hbase2_7/_SUCCESS |
这就导致了上面我看到的_tmp下的文件是以128M递增, 因为有些文件很大,不能放入一个Region中,所以就要进行split.
hbase.hregion.max.filesize默认的大小是10G(107374182400),而我们的HFile有些超过10G,为了不Split,可以设置为50G=53687091200.
1 | <property> |
Split Retry Many Times
But Still Not Work!!! Ask for help…
I Have a HFile generate by importtsv, the file is really large, from 100mb to 10G.
I have changed hbase.hregion.max.filesize to 50GB(53687091200). also specify src CanonicalServiceName same with hbase.
1 | hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://tdhdfs/user/tongdun/id_hbase/1 data.md5_id2 |
But both completebulkload and LoadIncrementalHFiles did’t just mv/rename hfile expected.
but instead copy and split hfile happening, which take long time.
the log Split occured while grouping HFiles, retry attempt XXX
will create child _tmp dir one by one level.
1 | 2015-12-23 15:52:04,909 INFO [LoadIncrementalHFiles-0] hfile.CacheConfig: CacheConfig:disabled |
even though the process finished, original hfile did’t delete. I was wondering why mv/rename command not happend.
1 | [qihuang.zheng@spark047213 ~]$ hadoop fs -du -h /user/tongdun/id_hbase/1/id/ |
A:This is because the table region changes, not match with the regions when you get the HFiles
Why Split
http://chengjianxiaoxue.iteye.com/blog/2229591
http://koven2049.iteye.com/blog/982831
http://www.cnblogs.com/shitouer/archive/2013/02/20/hbase-hfile-bulk-load.html
If the region boundaries have changed during the course of bulk load preparation, or between the preparation and completion steps, the completebulkload utility will automatically split the data files into pieces corresponding to the new boundaries. This process is not optimally efficient, so users should take care to minimize the delay between preparing a bulk load and importing it into the cluster, especially if other clients are simultaneously loading data through other means.
BulkLoad的限制条件: 仅适合初次数据导入,即表内数据为空,或者每次入库表内都无数据的情况
Hfile批量入Hbase,LoadIncrementalHFiles会检查HFILE的目录(结构是主目录->列族目录->hfile),把需要批量导入的Hfile放到一个列表中,依次执行。导入每一个Hfile,系统会判断hfile是否再某个region中还是跨了region(通过前面说的startkey,endkey进行判断)。如果在一个region中,就是进行导入,系统会通过rpc调用regionserver的方法,先把HFILE复制Region所在的文件系统中(如果处于不同的FS),然后直接将HFILE直接改名为Region的一个StoreFile,并更新该Region的Storefile列表,这样该HFILE就入库。如果在HFILE跨的region,那么需要对Hfile进行split(分成.top和.bottom两个文件,每个文件单属于一个region,也是Hfile格式的,放在_tmp下,),接下来把split之后的文件进行入库
如果数据特别大,而表中原来就有region,那么会执行切分工作,查找数据对应的region并装载
回到我们的场景中, 因为我们原始文件有多个, 所以每次MR生成的HFile虽然都是有序的.
但是最后所有文件夹都导入时(每个文件夹是由一个MR作业生成),也需要保证每个HFile有序, 就会发生Split!!
如果一开始只读取一个文件夹内的所有文件, 虽然reduce会慢点,但是能保证输出的HFile是全局有序的!
问:HFILE为什么需要排序?
答:那是应为REGION中的storefile是有序的,只有hfile有序,才能通过简单的拆分和rename来转换为storefile,而实现入库。
问:有时Hfile入库成功后,原Hfile会被移除,有时又不是?
答:如果Hfile的key属于单个region时,直接通过rename导入的,所以原文件不见了。而如果key跨了region,那么需要split到_tmp下,最终入库的的split后的文件,原hfile没有动,所以需要人工去删它。
问:如果HFILE跨域多个region,会不会有问题?
答:每次split都是分成两个文件,前一个文件肯定是属于单个region的,后一个文件就不一定了,所以,处理split后的文件时会做同样的判断,确保跨region的hfile不断的split。
1 | hbase(main):008:0> truncate "data.md5_id2" |
清空表之后, Region只剩一个了. 所以最好要删掉表, 并重建表.