模拟线上需求:数据不断有写入,需要搭建一个该表的slave供离线分析。1
2create 'testtable', {NAME => 'c1'}
for i in '1'..'10000' do for j in '1'..'10000' do for k in '0'..'9' do put 'testtable',"row#{i}","c1:#{j}{k}","#{j}#{k}" end end end
数据量 10000* 10000,保证执行的时间足够长。
步骤:
使用snapshotExport将线上的数据全量导入新集群 记录时间点T1.
设置replication,来同步之后的数据。 记录时间点T2.
使用copyTable将 <T1,T2>之间的数据同步。 (startTime可以记录为T1之前的值)
演练:
事先配置yarn并hbase-site.xml 开启复制参数和快照,滚动重启RS生效配置。1
2
3
4
5
6
7
8<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>
步骤1 ExportSnapshot
源集群:
创建snapshot1
2
3hbase(main):003:0> snapshot 'testtable','testtable_snapshot'
0 row(s) in 0.6990 seconds
hbase(main):004:0> exit
执行ExportSnapshot1
2[hadoop@hostname /home/q/hbase/q_hbase/bin]$ ./hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot
-snapshot 'testtable_snapshot' -copy-to hdfs://hostname:8020/hbase/haas_test -mappers 16 -bandwidth 200
执行list_snapshots查看时间,记录为T1
date -d ‘2017-03-17 17:24:04’ +%s 方式转化为时间戳。
1 | [hadoop@hostname /home/q/hbase/q_hbase/bin]$ date -d '2017-03-21 15:00:58' +%s |
1490079658
目的端hostname 进行表恢复。1
2hbase(main):001:0> restore_snapshot 'testtable_snapshot'
0 row(s) in 1.8920 seconds
hbase(main):002:0> list_snapshots
步骤2 Replication
源端创建复制通道并开启复制.1
2
3
4
5
6
7
8
9
10 hbase(main):026:0> disable 'testtable'
hbase(main):028:0* alter 'testtable', {NAME => 'c1',REPLICATION_SCOPE => '1'}
hbase(main):029:0> enable 'testtable'
hbase(main):032:0>add_peer '2',"hostname:2181:/hbase/haas_test"
0 row(s) in 0.0120 seconds
hbase(main):033:0> set_peer_tableCFs '2','testtable' 开启复制
0 row(s) in 0.0060 seconds
开启复制后,记录时间为T2.
1 | [hadoop@hostname /home/q/hbase/q_hbase/bin]$ date |
步骤3 CopyTable,拷贝<T1,T2>时间段内的变量数据。1
2
3[hadoop@hostname /home/q/hbase/q_hbase/bin]$ ./hbase org.apache.hadoop.hbase.mapreduce.CopyTable
--peer.adr=hostname:2181:/hbase/haas_test
--starttime=1489718120 --endtime=1489718187 --new.name=testtable testtable
完成配置,等待脚本执行完成验证源端和目的端数据是否一致。
两边执行count ,行数一致。1
2
3hbase(main):006:0> count 'testtable'
23 row(s) in 0.0360 seconds
=> 23
问题
问题1:复制不会同步ddl,开发新建表如果需要复制则该表都得重新搭建复制。
源端执行truncate1
2
3
4
5
6
7
8
9
10hbase(main):003:0> truncate_preserve 'testtable'
Truncating 'testtable' table (it may take a while):
- Disabling table...
- Dropping table...
- Creating table with region boundaries...
0 row(s) in 2.4070 seconds
hbase(main):004:0> scan 'testtable'
ROW COLUMN+CELL
0 row(s) in 0.0590 seconds
目的端scan数据依旧存在
1 | row1 column=c1:9999{k}, timestamp=1490081458186, value=99999 |