需求:将云服务器上的hbase数据迁移到本地物理服务器。
云服务器环境:Linux 2.6.32-696.1.1.el6.x86_64 Hadoop 2.6.0-cdh5.11.0(集群) HBase 1.2.0-cdh5.11.0
物理服务器环境:Linux 3.10.0-957.el7.x86_64 Hadoop 2.7.6(单机) HBase 2.0.4
总数据量大约46T
- 在hdfs上建立copy临时目录
hadoop fs -mkdir /copy
- 用MR方法将hbase数据库dt_gpsdata里的数据导入/copy/dt_gpsdata目录下
hbase org.apache.hadoop.hbase.mapreduce.Export dt_gpsdata /copy/dt_gpsdata(针对较小的数据表使用)
注:数据量较大时强烈建议在使用hbase的 export以及import工具时使用时间区间+ key前缀,对集群造成的压力会比较小。
Usage: Export [-D <property=value>]* <tablename> <outputdir> [<versions> [<starttime> [<endtime>]] [^[regex pattern] or [Prefix] to filter]]
例:从dt_gpsdata表中导出2018-01-01至2018-02-01的数据(中间记得加上version)
hbase org.apache.hadoop.hbase.mapreduce.Export dt_gpsdata /copy/dt_gpsdata 1 1514736000000 1517414400000
- 将dt_gpsdata表文件从hdfs下载到本地(数据量较大时找个空间充足的目录,不然get的时候报错)
hadoop fs -get /copy/dt_gpsdata
如遇到以下情况,表示文件太大,所在的服务器内存空间不足:
- 在目标服务器执行(scp命令),将文件拷贝到本地服务器
scp -r /mdata/hdfs/dt_gpsdata root@60.12.8.151:/data/hdfs/dt_gpsdata
- 将dt_gpsdata表文件从本地上传到hdfs
hadoop fs -put dt_gpsdata /copy/dt_gpsdata
- 用MR方法将hbase数据库dt_gpsdata里表文件导入dt_gpsdata表中(将表提前创建,注意表结构要一致,否则导入异常)
hbase org.apache.hadoop.hbase.mapreduce.Import dt_gpsdata /copy/dt_gpsdata
- 进入hbase的shell页面,查看dt_gpsdata表数据
OK,数据成功导入。迁移数据中可能用到的命令:
hadoop dfs -mkdir /copy 创建目录
hadoop dfs -ls /copy 查看目录
hadoop dfs -rm -r -skipTrash /copy 删除目录不经回收站
hbase shell 进入hbase shell命令
create 'dt_gpsdata',{NAME=>'gpsdata',VERSIONS=>1} hbase创建表
truncate 'dt_gpsdata' hbase清空表