我尝试复制 400+ GB 和一个数据大小为 35.6 GB 的 distcp 作业,但它们都花了将近 2 -3 小时才能完成。
我们在集群中确实有足够的资源。
但是当我检查了容器日志时,我发现复制小文件需要很多时间。有问题的文件是一个小文件。
2019-10-23 14:49:09,546 INFO [main] org.apache.hadoop.tools.mapred.CopyMapper:复制 hdfs://service-namemode-prod-ab/abc/xyz/ava/abc/hello/GRP_part -00001-.snappy.parquet 到 s3a://bucket-name/Data/abc/xyz/ava/abc/hello/GRP_part-00001-.snappy.parquet 2019-10-23 14:49:09,940 信息 [主要] org.apache.hadoop.tools.mapred.RetriableFileCopyCommand:创建临时文件:s3a://bucket-name/Data/.distcp.tmp.attempt_1571566366604_9887_m_000010_0
那么可以做些什么来使用 distcp 来改进这一点,以使复制更快呢?
注意:同一集群上的相同数据副本到对象存储(内部存储)不是 AWS S3,但类似于 S3,需要 4 分钟才能获得 98.6 GB。
命令 :
hadoop distcp -Dmapreduce.task.timeout=0 -Dfs.s3a.fast.upload=true -Dfs.s3a.fast.buffer.size=157286400 -Dfs.s3a.multipart.size=314572800 -Dfs.s3a.multipart.threshold =1073741824 -Dmapreduce.map.memory.mb=8192 -Dmapreduce.map.java.opts=-Xmx7290m -Dfs.s3a.max.total.tasks=1 -Dfs.s3a.threads.max=10 -带宽 1024 /abc /xyz/ava/ s3a://bucket-name/Data/
这里的价值可以优化什么?
我的集群规格如下,
分配内存(累积) - 1.2T
可用内存 - 5.9T
分配的 VCores(累积) - 119T
可用的 VCore - 521T
配置容量 - 997T
使用的HDFS - 813T
使用非 HDFS - 2.7T
任何人都可以提出一个解决这个问题的解决方案,并建议一个最佳的 distcp conf 用于将800 GB - 1 TB文件通常从 HDFS 传输到对象存储。