java コードを使用して、hdfs に存在するファイルを s3 バケットにコピーしたいと考えています。私の Java コードの実装は次のようになります。
import org.apache.hadoop.tools.DistCp;
import org.apache.hadoop.tools.DistCpOptions;
import org.apache.hadoop.tools.OptionsParser;
import org.apache.hadoop.conf.Configuration;
private void setHadoopConfiguration(Configuration conf) {
conf.set("fs.defaultFS", hdfsUrl);
conf.set("fs.s3a.access.key", s3AccessKey);
conf.set("fs.s3a.secret.key", s3SecretKey);
conf.set("fs.s3a.endpoint", s3EndPoint);
conf.set("hadoop.job.ugi", hdfsUser);
System.setProperty("com.amazonaws.services.s3.enableV4", "true");
}
public static void main(String[] args){
Configuration conf = new Configuration();
setHadoopConfiguration(conf);
try {
DistCpOptions distCpOptions = OptionsParser.parse(new String[]{srcDir, dstDir});
DistCp distCp = new DistCp(conf, distCpOptions);
distCp.execute();
}
catch (Exception e) {
logger.info("Exception occured while copying file {}", srcDir);
logger.error("Error ", e);
}
}
このコードは正常に実行されますが、問題は、yarn クラスターで distcp ジョブを起動しないことです。ローカル ジョブ ランナーを起動するため、大きなファイル コピーの場合はタイムアウトになります。
[2020-08-23 21:16:53.759][LocalJobRunner Map Task Executor #0][INFO][S3AFileSystem:?] Getting path status for s3a://***.distcp.tmp.attempt_local367303638_0001_m_000000_0 (***.distcp.tmp.attempt_local367303638_0001_m_000000_0)
[2020-08-23 21:16:53.922][LocalJobRunner Map Task Executor #0][INFO][S3AFileSystem:?] Delete path s3a://***.distcp.tmp.attempt_local367303638_0001_m_000000_0 - recursive false
[2020-08-23 21:16:53.922][LocalJobRunner Map Task Executor #0][INFO][S3AFileSystem:?] Getting path status for s3a://*** .distcp.tmp.attempt_local367303638_0001_m_000000_0 (**.distcp.tmp.attempt_local367303638_0001_m_000000_0)
[2020-08-23 21:16:54.007][LocalJobRunner Map Task Executor #0][INFO][S3AFileSystem:?] Getting path status for s3a://****
[2020-08-23 21:16:54.118][LocalJobRunner Map Task Executor #0][ERROR][RetriableCommand:?] Failure in Retriable command: Copying hdfs://*** to s3a://***
com.amazonaws.SdkClientException: Unable to execute HTTP request: Read timed out
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1189)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1135)
distcp ジョブがローカルではなくクラスターで実行されるように糸構成を構成する方法を理解するのを手伝ってください