Hadoop DistCp(分布式复制)是一个用于大型集群间或集群内数据复制的工具,通过MapReduce实现复制过程中数据的分发、错误处理、恢复及报告。本文为您介绍Hadoop DistCp与Jindo DistCp的区别、Hadoop DistCp使用方法以及常见问题。

说明 Hadoop DistCp的功能和使用方法等详细信息,请参见Hadoop社区的DistCp使用文档

Hadoop DistCp和Jindo DistCp的区别

DistCp类型 功能 使用场景
Hadoop DistCp 开源Hadoop内置的DistCp工具,用于大型集群间或集群内数据的复制。 HDFS到HDFS间的数据复制。
Jindo DistCp JindoFS的数据迁移工具,支持OSS、OSS-HDFS服务、兼容S3接口的对象存储的数据源。
  • 导入HDFS数据至OSS或OSS-HDFS服务。
  • 导入S3数据至OSS或OSS-HDFS服务。

使用方法

Hadoop DistCp最常见的调用是集群间拷贝,例如将nn1集群的/foo/bar目录下的数据拷贝至nn2集群的/bar/foo目录下:
hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo

更多使用说明,请参见Hadoop社区的DistCp使用文档

常见问题

如何使用Hadoop DistCp迁移HDFS数据到另一个HDFS集群?

集群之间的HDFS数据迁移需要先确保网络的打通,然后再使用Hadoop DistCp工具进行迁移,具体操作请参见E-MapReduce数据迁移方案

出现ACLs not supported on at least one file system异常,如何处理?

具体报错:org.apache.hadoop.tools.CopyListing$AclsNotSupportedException: ACLs not supported for file system: hdfs://xx.xx.xx.xx:8020

建议按照以下方式排查解决:
  1. 检查旧集群是否有ACL规则要同步。

    如果有ACL规则要同步,DistCp参数后要加-p同步权限参数。如果DistCp操作提示“xx集群不支持ACL”,说明对应集群没有配置ACL规则。如果新集群没有配置ACL规则,可以修改配置并重启NameNode。如果是提示旧集群不支持ACL,说明旧集群没有ACL方面的设置,也不需要同步,去掉-a参数即可。

  2. 检查新旧集群的dfs.permissions.enableddfs.namenode.acls.enabled的配置是否一致。

    如果不一致,需要将新旧集群的这两个参数的值修改成一致或者不同步ACL。

DistCp运行出现Out of Memory异常,如何处理?

开源DistCp会把要复制的Path列表存储在客户端内存,如果文件量超过一定阈值或者文件名较长,例如文件量达到一百万条,会出现Out of Memory异常,此时可通过以下命令在客户端设置更多内存。
export HADOOP_CLIENT_OPTS="-Xmx1024m"
hadoop distcp /source /target