distcp介绍
distcp是分布式系统中,用于复制数据的工具。它的功能是将一个Hadoop集群中的数据复制到另一个Hadoop集群中,或者在同一个集群的不同目录之间复制数据。
distcp运用了分布式系统的一些特性和计算框架,其基本原理,是通过在源集群和目标集群之间启动多个并行的MapReduce任务来实现数据的复制。源集群上的每个源文件或目录都会被分配给一个Map任务,这些Map任务将数据分块并复制到目标集群上的对应位置。这种并行复制的方式可以加快数据复制的速度。
为了保证数据在传输前后数据一致性和一定程度的容错度,distcp同步时加入了以下机制:
- 校验和校验:在复制数据之前,distcp会计算源文件的校验和,并在目标集群上进行校验和校验。如果校验和不一致,表示复制过程中出现错误,distcp会重新复制这部分数据,以确保数据一致性。
- 原子性操作:distcp将复制过程分解为多个小任务,并确保每个小任务都是原子性的操作。如果某个小任务复制失败,distcp会回滚已经复制成功的数据,以保持源集群和目标集群的数据一致性。
- 重试机制:如果某个小任务复制失败,distcp会进行重试,直到复制成功或达到最大重试次数。这样可以确保即使在复制过程中出现网络故障或其他错误,distcp也能尽可能地完成数据的复制。
以下是一些示例:
复制单个文件:
hadoop distcp hdfs://source-cluster/path/to/source/file.txt hdfs://target-cluster/path/to/target/
复制整个目录:
hadoop distcp -update hdfs://source-cluster/path/to/source/directory hdfs://target-cluster/path/to/target/
复制到本地文件系统(也可以支持部分对象存储):
hadoop distcp hdfs://source-cluster/path/to/source/file.txt file:///path/to/target/
请根据实际情况替换<源路径>和<目标路径>为您要复制的路径,并根据需要添加适当的选项。
除此之外,distcp的主要参数有:
| 参数名 | 参数说明 |
|---|---|
| -p, --preserve | 保留文件权限、时间戳和所有者信息 |
| -update | 仅复制源路径中修改时间较新的文件 |
| -delete | 在目标路径上删除与源路径不匹配的文件 |
| -i, --ignore-errors | 忽略错误并继续进行数据复制 |
| -m , --max-concurrent-mappers | 设置并行复制的最大映射器数量 |
| -bandwidth | 设置复制带宽限制,限制每秒复制的字节数 |
| -overwrite | 覆盖目标路径上的已存在的文件 |
| -skipcrccheck | 跳过校验和校验,加快复制速度 |
| -strategy | 设置复制策略,可选值为uniformsize(均匀大小)或dynamic(动态策略) |
| -filelimit | 设置每个任务复制的最大文件数 |
| -sizelimit | 设置每个任务复制的最大数据量(以字节为单位) |
| -log | 将日志输出到指定的路径 |
值得注意的是,对于在执行完distcp之后源文件发生变化的情况,distcp无法保证两边文件一致,需要重新发起distcp任务。
问题1:连接超时failed on socket timeout exception
1.1问题描述
跨集群起distcp服务时报错,查看mr日志发现如下内容:
23/10/07 17:30:55 INFO mapreduce.Job: Job job_1689848968195_578797 failed with state FAILED due to: Job commit failed: org.apache.hadoop.net.ConnectTimeoutException: Call From host01 to host02:8020 failed on socket timeout exception: org.apache.hadoop.net.ConnectTimeoutException: 20000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=host02:8020]; For more details see: wiki.apache.org/hadoop/Sock… Caused by: org.apache.hadoop.net.ConnectTimeoutException: 20000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=host02:8020] at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:589) at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:700) at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:812) at org.apache.hadoop.ipc.Client$Connection.access$3800(Client.java:413) at org.apache.hadoop.ipc.Client.getConnection(Client.java:1636) at org.apache.hadoop.ipc.Client.call(Client.java:1452) ... 34 more
1.2原因分析
根据日志内容,判断为actived namenode之间的通信异常,考虑该场景是跨网区同步的情况,有可能未开通相应的网络。可以登录源集群的host01(参考日志,日志中已省略真实的host名,以host1代替),执行命令:telnet host2:8020,发现网络确实不通。
1.3 解决办法
开通namenode之间的网络,问题解决。
问题2:下载和解压缩包MR代码包失败
2.1 问题描述
distcp任务在起MR的时候报错:
Failing this attempt.Diagnostics: [2021-03-19 15:48:16.291]Failed to download resource { { hdfs://nameservice1/user/yarn/mapreduce/mr-framework/3.1.1.7.1.4.0-203-mr-framework.tar.gz, 1610694147172, ARCHIVE, null },pending,[(container_e10_1616127542033_0014_02_000001)],623212709171527,DOWNLOADING} org.apache.hadoop.yarn.exceptions.YarnException: Download and unpack failed
2.2 原因分析
查看日志中文件3.1.1.7.1.4.0-203-mr-framework.tar.gz的权限,权限无异常,解压缩包失败,可能原始的jar包损坏,可重新生成jar包。
出现这种情况一般出现在新搭集群的时候,当前的yarn已经默认使用tez引擎,因为在发起MR任务时,需要将mr执行的Jar包分发并解压缩到每台节点上,当分发的jar包出现异常的时候,就会有上述报错。
2.3 解决办法
重新生成mr及相关的包:
进入yarn界面,执行下列操作:
- 安装 YARN MapReduce 框架 JAR
- Install YARN Services Dependencies
问题3:Container exited with a non-zero exit code 143
3.1 问题描述
distcp作业执行失败,查看报错信息,发现有部分container执行失败,且重试次数大于最大重试次数(mapred.map.max.attempts),报错内容:Container exited with a non-zero exit code 143
3.2 原因分析
查看yarn上失败的container信息,发现如下内容:
[2023-05-16 10:19:37.073]Container [pid=56797,containerID=container_e23_1677143681637_250835_01_000008] is running 132124672B beyond the 'PHYSICAL' memory limit. Current usage: 3.1 GB of 3 GB physical memory used; 5.8 GB of 6.3 GB virtual memory used. Killing container. Dump of the process-tree for container_e23_1677143681637_250835_01_000008 : |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE |- 56797 56794 56797 56797 (bash) 0 0 115900416 305 /bin/bash -c /usr/java/jdk1.8.0_232-cloudera/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Djava.net.preferIPv4Stack=true -Xmx2458m -Djava.io.tmpdir=/cdh/data9/yarn/nm/usercache/hdw_user/appcache/application_1677143681637_250835/container_e23_1677143681637_250835_01_000008/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/cdh/data5/yarn/container-logs/application_1677143681637_250835/container_e23_1677143681637_250835_01_000008 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Dhadoop.root.logfile=syslog org.apache.hadoop.mapred.YarnChild 10.58.80.39 44989 attempt_1677143681637_250835_m_000006_0 25288767438856 1>/cdh/data5/yarn/container-logs/application_1677143681637_250835/container_e23_1677143681637_250835_01_000008/stdout 2>/cdh/data5/yarn/container-logs/application_1677143681637_250835/container_e23_1677143681637_250835_01_000008/stderr |- 56801 56797 56797 56797 (java) 1939 465 6061531136 818384 /usr/java/jdk1.8.0_232-cloudera/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Djava.net.preferIPv4Stack=true -Xmx2458m -Djava.io.tmpdir=/cdh/data9/yarn/nm/usercache/hdw_user/appcache/application_1677143681637_250835/container_e23_1677143681637_250835_01_000008/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/cdh/data5/yarn/container-logs/application_1677143681637_250835/container_e23_1677143681637_250835_01_000008 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Dhadoop.root.logfile=syslog org.apache.hadoop.mapred.YarnChild 10.58.80.39 44989 attempt_1677143681637_250835_m_000006_0 25288767438856 [2023-05-16 10:19:37.081]Container killed on request. Exit code is 143 [2023-05-16 10:19:37.081]Container exited with a non-zero exit code 143.
发现作业时报的原因是资源不足。
3.2 解决办法
调大相应的资源再重试(由于distcp只涉及map任务,只需要调整map任务的内存大小即可)
添加参数: -Dmapreduce.map.memory.mb=6144
参考文档:
hadoop.apache.org/docs/r1.0.4… hadoop.apache.org/docs/curren…