在clone_snapshot之后:clone_snapshot \'snapshot_test\',\'new_test\',在/hbase/archive/data/default目录,有对原表的link目录,目录名只是在原HFile的文件名基础上加了个links-前缀,这样我们可以通过这个来定位到原表的HFile,如下所示:
hbaseuser:~> hadoop fs -ls /hbase/archive/data/default/test/d8340c61f5d77345b7fa55e0dfa9b492/i Found 1 items drwxr-xr-x - hbaseuser supergroup 0 2017-12-01 12:34 /hbase/archive/data/default/test/d8340c61f5d77345b7fa55e0dfa9b492/i/.links-55c5de40f58f4d07此时,再执行合并操作:major_compact \'new_test\',会发现/hbase/archive/data/default/目录已经变成了实际表的数据文件,上面图中/hbase/archive/data/default/test/d8340c61f5d77345b7fa55e0dfa9b492/i/.links-55c5de40f58f4d07这个已经不在了,取而代之的是如下所示文件:
hbaseuser:~> hadoop fs -ls /hbase/archive/data/default/new_test/7e8636a768cd0c6141a3bb45b4098910/i Found 1 items -rw-r--r-- 1 hbaseuser supergroup 0 2017-12-01 12:48 /hbase/archive/data/default/new_test/7e8636a768cd0c6141a3bb45b4098910/i/test=d8340c61f5d77345b7fa55e0dfa9b492-55c5de40f58f4d07aed767c5d250191c在实际的/hbase/data/default/new_test目录也是实际的原表的数据文件,这样完成了表数据的迁移。
3.3.3 snapshot数据迁移snapshot的应用场景和上面CopyTable描述差不多,我们这里主要考虑的是数据迁移部分。数据迁移主要有以下几个步骤:
A.创建快照:在原集群上,用snapshot命令创建快照,命令如下:
hbase> snapshot \'src_table\', \'snapshot_src_table\' #查看创建的快照,可用list_snapshots命令 hbase> list_snapshots #如果快照创建有问题,可以先删除,用delete_snapshot命令 hbase >delete_snapshot \'snapshot_src_table\'创建完快照后在/hbase根目录会产生一个目录:
/hbase/.hbase-snapshot/snapshot_src_table #子目录下有如下几个文件 /hbase/.hbase-snapshot/snapshot_src_table/.snapshotinfo /hbase/.hbase-snapshot/snapshot_src_table/data.manifestB.数据迁移: 在上面创建好快照后,使用ExportSnapshot命令进行数据迁移,ExportSnapshot也是HDFS层的操作,本质还是利用MR进行迁移,这个过程主要涉及IO操作并消耗网络带宽,在迁移时要指定下map数和带宽,不然容易造成机房其它业务问题,如果是单独的MR集群,可以在MR集群上使用如下命令:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \ -snapshot snapshot_src_table \ -copy-from hdfs://src-hbase-root-dir/hbase \ -copy-to hdfs://dst-hbase-root-dir/hbase \ -mappers 20 \ -bandwidth 20上面这些流程网上很多资料都有提到,对于我们业务来说,还有一种场景是要同步的表是正在实时写的,虽然用上面的也可以解决,但考虑到我们表数据规模很大,几十个T级别,同时又有实时业务在查的情况下,直接在原表上就算只是拷贝HFile,也会影响原集群机器性能,由于我们机器性能IO/内存方面本身就比较差,很容易导致机器异常,所以我们采用的其它一种方案,流程图如下:
图5.新的snapshot迁移方案为什么要采用这种方案呢,主要考虑的是直接对原表snapshot进行Export会影响集群性能,所以采用折中的方案,即先把老表clone成一个新表,再对新表进行迁移,这样可以避免直接对原表操作。
四、总结上文把HBase数据迁移过程中常用的一些方法作了一个大概介绍,总结起来就四点:
DistCp: 文件层的数据同步,也是我们常用的
CopyTable: 这个涉及对原表数据Scan,然后直接Put到目标表,效率较低
Export/Import: 类似CopyTable, Scan出数据放到文件,再把文件传输到目标集群作Import
Snapshot: 比较常用 , 应用灵活,采用快照技术,效率比较高
具体应用时,要结合自身表的特性,考虑数据规模、数据读写方式、实时数据&离线数据等方面,再选择使用哪种。
参考: