背景
测试环境数据缺失,需从开发环境同步数据过去,考虑采用Hadoop自带的数据迁移工具
分析
迁移数据评估
开发环境数据比较杂乱,不是所有数据都需要迁移,且全部迁移即浪费时间,又没有价值,根据时间情况按库(甚至按表)进行迁移
迁移工具
使用Hadoop自带数据迁移工具Distcp,只需要简单的命令即可完成数据迁移。
hadoop distcp hdfs://nn1:8020/dir1 hdfs://nn2:8020/dir2
如果dir2目录不存在,按照dir1的目录创建
如果dir2目录存在,则在dir2目录下创建dir1的目录,即变为dir2/dir1,也可以通过指定 -overwrite强制覆盖,来保持dir1与dir2一致
Distcp的本质是一个MapReduce任务,只有Map阶段,没有Reduce阶段,具备分布式执行的特性。在Map任务中从老集群读取数据,然后写入新集群,以此来完成数据迁移。
该命令在任一集群运行即可,如果在新集群上执行就向新集群的Yarn申请资源,老集群只有数据读取和网络传输的消耗。
Distcp提供了 -m 参数来设置map任务的最大数量(默认20),以提高并发性。注意这里要结合最大网络传输速率来设置。
Distcp提供了-bandwidth 参数来控制单个Map任务的最大带宽,单位是MB。
Distcp提供了-p 参数来在新集群里保留状态(rbugpcaxt)(复制,块大小,用户,组,权限,校验和类型,ACL,XATTR,时间戳)。如果没有指定-p 参数,权限是执行MapReduce任务的用户权限,迁移完成以后需要手动执行chown命令变更。
Distcp在任务启动的时候就会将需要copy的文件列表从源HDFS读取出来。如果迁移期间新增了文件,新增的文件会被漏掉。删除文件会导致改文件copy失败,可以通过 -i参数忽略失败。
Distcp提供了-overwrite 参数来覆盖已存在的文件,-append参数将源HDFS文件的数据追加写入。