hbase表导入导出之export/import

  数据迁移
内容纲要

概要说明


面对一些重要数据,很多场景下都需要将数据仓库进行复制,这可以是整个数据库的更广泛级别,也可以是较小的级别。本案例将演示Export/Import 的方式导入导出 hbase 数据。

该方法hbase同版本、不同版本之间都可以迁移数据,但最好是在同版本之间迁移数据。
该方法适用于数据量较小的hbase表。

详细说明


本案例介绍使用 Export/Import 的方式导入导出 hbase 数据,该方法只需要3步:

  1. 在源集群上执行export 将数据文件copy到 HDFS 路径
  2. 将数据文件copy 到目标集群并上传到HDFS
  3. 在目标集群创建一样结构的表
  4. 在目标集群上 Import 到hbase 表

与inceptor的Export/Import导出导入数据不同,hbase不会同步导出导入表的元数据信息,所以需要在目标集群手动创建一样结构的表。

注意:

  1. 以下所有操作必须是 hbase 用户来执行,如果是开了安全的集群,需要kinit hbase获取认证信息,如果是没开安全的集群,执行命令之前需要加上 sudo -u hbase
  2. 以下操作需要准备好TDH客户端,参考:准备TDH客户端环境

1、在源集群上执行export 将数据文件copy到 HDFS 路径

hbase org.apache.hadoop.hbase.mapreduce.Driver export sqlbulkload_test_hbase /tmp/mll/sqlbulkload_test_hbase

注意:
上述命令中的/tmp/mll/sqlbulkload_test_hbase必须是hdfs上 不存在 的路径

file

2、将数据文件copy 到目标集群并上传到HDFS

将数据目录和文件 scp 到目标集群,并上传到 HDFS 上,本案例中以同一个的集群的不同表来模拟同版本之间数据迁移。

hdfs dfs -cp /tmp/mll/sqlbulkload_test_hbase/part-m-00001  /tmp/mll/hbase_qianyi/

file

3、在目标集群上创建和源表结构一样的表

本案例建表语句如下

create table hbase_qianyi(key STRING,name STRING ,sex STRING ,nation STRING,b_date BIGINT ,phone STRING ,email STRING,addr STRING ) row format delimited FIELDS TERMINATED BY ','
collection items terminated by '\001' MAP KEYS TERMINATED BY '\003' LINES TERMINATED BY '\n' stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  tblproperties( 'hbase.table.splitkey'='220401200912310147,350430199001015281,43062119900101526X,513337199501015183', 'COMPRESSION'='SNAPPY', 'hbase.table.name'='hbase_qianyi');

4、在目标集群上 Import 到hbase 表

  • 同版本之间,执行 Import 导入数据

    hbase org.apache.hadoop.hbase.mapreduce.Driver import hbase_qianyi /tmp/mll/hbase_qianyi/
  • 不同版本之间,执行 Import 导入数据时,需要指定目标集群hbase的版本号,本次案例是将TDH524的数据迁移到TDH621版本中,TDH621中hbase的版本是1.3。

    hbase -Dhbase.import.version=1.3 org.apache.hadoop.hbase.mapreduce.Driver import hbase_qianyi /tmp/mll/hbase/

5、同步后确认数据是否导入成功

file

6、FAQ

  1. 数据量很大的表在export导出的时候报错:ERROR: java heap space
    file

    解决方案
    导出命令中增加参数 -Dhbase.export.scanner.batch=2000 ,导出时可以限制scanner.batch的大小。

  2. 数据量很大的表(千万级别的数据量)在import导入的时候报错超时:
    Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 2882 actions: Operation Timeout: 2882 times, servers with issues: mll03,60020,1587435476220
    Caused by: org.apache.hadoop.hbase.DoNotRetryIOException: Operation Timeout

    file

    解决方案:
    以下方法可以全部都尝试,也可以尝试其中一种。

    • yarn资源调整
      如果资源充裕,可以调大 yarn 服务的 yarn.nodemanager.resource.memory-mb 的配置,如果数据量真的很大,这个方法一般都不起作用。
      调整配置之后,需要配置服务,重启yarn服务。
      file

    • 关闭WAL日志
      在开了WAL之后,整体hbase负载很低,IO因素会比较高,且单行字节数越高,WAL影响越大。
      当regionserver宕机时,关闭WAL会存在丢数据的风险,所以迁移完数据之后,需要打开WAL(在inceptor中删除添加的自定义参数,配置服务并重启inceptor服务)。
      通过在inceptor中添加自定义参数 hive.hbase.wal.enabled=false 来关闭WAL的写入,添加自定义参数之后,需要配置服务,并重启inceptor服务。
      file

    • 调大flush的阈值
      当Memstore中数据大小达到一定阈值(128M)之后,系统会异步将Memstore中数据flush到HDFS形成HFile小文件。
      在manager管理页面中把hyperbase服务的 hbase.hregion.memstore.flush.size 该参数调整为 268435456 , 即flush调到256MB。
      该参数的值在数据迁移完成之后需要还原到默认值。
      在hyperbase中修改默认值,然后配置服务重启hyperbase服务。
      file

    • 调整compact文件合并
      hyperbase中 hbase.hstore.blockingStoreFiles 该值默认是30,调大该值。
      该参数的值在数据迁移完成之后需要还原到默认值。
      在hyperbase中修改默认值,然后配置服务重启hyperbase服务。
      file

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。