AWS EMR クラスターで S3DistCp を使用する方法を見つけるのに苦労しています。
s3distcp を EMR ステップとして追加する方法を示すいくつかの古い例でelastic-mapreduce
は、もう使用されていないコマンドを使用しています。
s3-dist-cp
他のいくつかの情報源は、現在の EMR クラスターには見られないコマンドを使用することを提案しています。公式ドキュメント (オンラインおよび EMR 開発者ガイド 2016 pdf) でさえ、次のような例を示しています。
aws emr add-steps --cluster-id j-3GYXXXXXX9IOK --steps Type=CUSTOM_JAR,Name="S3DistCp step",Jar=/home/hadoop/lib/emr-s3distcp-1.0.jar,Args=["--s3Endpoint,s3-eu-west-1.amazonaws.com","--src,s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","--dest,hdfs:///output","--srcPattern,.*[azA-Z,]+"]
しかし、パスlib
にフォルダーがありません。/home/hadoop
このフォルダにいくつかの Hadoop ライブラリが見つかりました:が、どこからも/usr/lib/hadoop/lib
見つけることができません。s3distcp
次に、いくつかの S3 バケットで利用可能なライブラリがいくつかあることがわかりました。たとえば、この質問から、次のパスを見つけました: s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar
。これらのパラメーターを使用して AWS インターフェースから実行中の EMR クラスターに新しいステップを追加すると、ステップが開始されましたが (以前の試行では開始されませんでした)、約 15 秒後に失敗したため、これは正しい方向へのステップのように見えました。
JAR location: s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar
Main class: None
Arguments: --s3Endpoint s3-eu-west-1.amazonaws.com --src s3://source-bucket/scripts/ --dest hdfs:///output
Action on failure: Continue
これにより、次のエラーが発生しました。
Exception in thread "main" java.lang.RuntimeException: Unable to retrieve Hadoop configuration for key fs.s3n.awsAccessKeyId
at com.amazon.external.elasticmapreduce.s3distcp.ConfigurationCredentials.getConfigOrThrow(ConfigurationCredentials.java:29)
at com.amazon.external.elasticmapreduce.s3distcp.ConfigurationCredentials.<init>(ConfigurationCredentials.java:35)
at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.createInputFileListS3(S3DistCp.java:85)
at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.createInputFileList(S3DistCp.java:60)
at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:529)
at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:216)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
at com.amazon.external.elasticmapreduce.s3distcp.Main.main(Main.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
これは、S3 の場所 (エンドポイントと同じ) の非互換性と、us-east からの s3distcp スクリプトの場所が原因である可能性があると考えました。eu-west-1 に置き換えても、認証に関して同じエラーが発生します。同様のセットアップを使用して scala スクリプトを実行しました (「command-runner.jar」スクリプトを使用したカスタム jar タイプと最初の引数「spark-submit」を使用して、spark ジョブを実行しましたが、これは機能します。認証前。
S3 から EMR クラスターにファイルをコピーする最も簡単な方法は何ですか? AWS SDK (Go lang 用) を使用して追加の EMR ステップを追加するか、何らかの形で Scala spark スクリプト内に追加しますか? またはAWS EMRインターフェイスからですが、自動化する必要があるためCLIからではありません。