一、hadoop 集群间拷贝数据:
迁移之前需要把两个集群的所有节点都互通/etc/hosts文件(重要,包括各个数据节点)
两个集群版本不相同
hadoop distcp hftp://192.168.57.73:50070/hive3/20171008 /hive3/
如果两个集群的版本相同,则可以使用hdfs协议,命令如下:
hadoop distcp hdfs://namenodeip:9000/foo hdfs://namenodeip:9000/foo
对于增量数据同步的需求,在DistCp中也得到了很好的实现.
update: 解决了新增文件目录的同步;
append: 第二参数,解决已存在文件的增量更新同步;
diff: 第三个参数解决删除或重命名文件的同步.
相同hadoop版本同步数据
hadoop distcp -skipcrccheck -update -m 20 hdfs://dchadoop002.dx:8020/user/dc/warehouse/test /user/dc/warehouse/test
不同hadoop版本同步数据
hadoop distcp -skipcrccheck -update -m 20 hftp://ns1/user/test /user/dc/test
参数:
-m 表示并发数
-skipcrccheck 跳过hdfs校验
-update 更新文件
数据直接拷贝和update之间的区别
原数据
hdfs://nn1:8020/source/first/1
hdfs://nn1:8020/source/first/2
hdfs://nn1:8020/source/second/10
hdfs://nn1:8020/source/second/20
当不使用-update或-overwrite选项时,DistCp默认会在/target下创建/first和/second目录。
hadoop distcp hdfs://nn1:8020/source/first hdfs://nn1:8020/source/second hdfs://nn2:8020/target
上述命令将在/target中生成以下内容:
hdfs://nn2:8020/target/first/1
hdfs://nn2:8020/target/first/2
hdfs://nn2:8020/target/second/10
hdfs://nn2:8020/target/second/20
当指定-update或-overwrite时,源目录的内容将复制到目标,而不是源目录本身。
distcp -update hdfs://nn1:8020/source/first hdfs://nn1:8020/source/second hdfs://nn2:8020/target
上述命令将在/ target中生成以下内容:
hdfs://nn2:8020/target/1
hdfs://nn2:8020/target/2
hdfs://nn2:8020/target/10
hdfs://nn2:8020/target/20
二、hive数据迁移
1.hive数据export到hdfs
export table hm2.helper to ‘/tmp/export/hm2/helper’;
2.集群间数据复制
需要保证原始集群目录有读权限,新的集群复制保存目录有写权限:
两个集群都要赋权
hdfs dfs -chmod -R 777 /tmp/export/*
hdfs dfs -chmod -R 777 /tmp/export/*
数据复制
hadoop distcp hdfs://qcloud-test-hadoop01:9000/tmp/export/hm2 /tmp/export
3.数据导入hive
import table hm2.helper from ‘/tmp/export/hm2/helper’;
4.只导出某一个分区
导出数据
export table hm2.helper partition(dt=‘2017-12-16’) to ‘/tmp/export/helper_2017-12-16’ ;
数据复制
hadoop distcp hdfs://dc1.xx.com:8020/tmp/export/ hdfs://dc2.xx.com:8020/tmp/export
数据导入
import table hm2.helper partition(dt=‘2017-12-16’) from ‘/tmp/export/helper_2017-12-16’
与load data [local] inpath path path2 剪切数据不同,import命令其实是从目标/tmp/export/hm2/helper复制到/user/hive/warehouse/hm2.db/helper,这时候可以把/tmp/export/hm2/helper目录删掉了。
三、hbase数据迁移
HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分为以下几类:
Export/Import方式
源(测试)集群每个节点可以识别目标集群每个节点
源集群hbase执行
hbase org.apache.hadoop.hbase.mapreduce.Export 'hm2:test' hdfs://qcloud-hadoop02:9000/tmp/hbase_export/test
注意:这里路径需要带hdfs://nameser/path ,否则就export 到本地了,下同。
目标集群hbase执行
hbase org.apache.hadoop.hbase.mapreduce.Import 'hm2:test' hdfs://qcloud-hadoop02:9000/tmp/hbase_export/test
同步元数据
因为分区信息发生了改变,元信息没有同步。
数据导入到指定的文件夹之后,修复分区和表的元信息,(没有使用rbuy的各种脚本,0.9之后就D了,)
hbase hbck -fixTableOrphans 'hm2:test'
hbase hbck -fixMeta 'hm2:test'
hbase hbck -fixAssignments 'hm2:test'
hbase hbck -repair 'hm2:test'
总结
DistCp: 文件层的数据同步,也是我们常用的
CopyTable: 这个涉及对原表数据Scan,然后直接Put到目标表,效率较低
Export/Import: 类似CopyTable, Scan出数据放到文件,再把文件传输到目标集群作Import
Snapshot: 比较常用 , 应用灵活,采用快照技术,效率比较高
具体应用时,要结合自身表的特性,考虑数据规模、数据读写方式、实时数据&离线数据等方面,再选择使用哪种。