Hadoop 2.6はすぐに使用できるs3aをサポートしていないため、次のような一連のソリューションと修正を試しました。
hadoop-awsおよびaws-Java-sdkでデプロイ=>資格情報の環境変数を読み取れないhadoop-awsをmavenに追加=>さまざまな推移的な依存関係の競合
誰かが両方の仕事を成功させましたか?
S3aとs3nの違いを直接経験した-s3aで転送された7.9GBのデータは約7分でしたが、s3nの7.9GBのデータは73分かかりました[残念ながら両方のケースでus-east-1からus-west-1。 RedshiftとLambdaは現時点でus-east-1である]これはスタックを修正するための非常に重要な部分であり、フラストレーションに値する。
2015年12月現在の主要部分は次のとおりです。
Sparkクラスターには、Hadoopバージョン2.x以降が必要です。 Spark EC2セットアップスクリプトを使用していて見逃している可能性がある場合、1.0以外を使用するための切り替えは、--hadoop-major-version 2
(この記事の執筆時点でCDH 4.2を使用)を指定することです。
2.7.1(安定)以降のHadoopのバージョンには、最初は古くなっているように見えるAWS SDKライブラリ(2014年にバージョン1.7.4としてビルド)を含める必要があります:aws-Java-sdk 1.7 .4。 1.10.8向けの特定のAWS SDK JARとともにこれを使用することでわかる限り、何も壊れていません。
また、クラスパスにhadoop-aws 2.7.1 JARが必要です。このJARにはクラスorg.Apache.hadoop.fs.s3a.S3AFileSystem
が含まれています。
spark.properties
では、おそらく次のような設定が必要です。
spark.hadoop.fs.s3a.impl=org.Apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key=ACCESSKEY
spark.hadoop.fs.s3a.secret.key=SECRETKEY
私が書いた投稿 についてこのリストを詳しく説明しました。さらに、私は途中でヒットしたすべての例外ケースと、それぞれの原因であると信じるものと、それらを修正する方法をカバーしました。
S3A from Spark 2.0.1 on Hadoop 2.7.でファイルにアクセスするためにこの回答を書いています
デフォルトでHadoopに同梱されたAWS jars(hadoop-aws-2.7.3.jar
およびaws-Java-sdk-1.7.4.jar
)をコピーします
ヒント: jarの場所が不明な場合は?特権ユーザーとしてfindコマンドを実行すると役立つ場合があります。
find / -name hadoop-aws*.jar
find / -name aws-Java-sdk*.jar
into spark classpathこれはすべてのspark jarを保持します
ヒント:ディストリビューションとLinuxフレーバーの一般的な回答を作成するため、場所を直接指定することはできません(プロパティファイルにある必要があります)。 spark classpathは、以下のfindコマンドで識別できます
find / -name spark-core*.jar
spark-defaults.conf
ヒント:(ほとんどの場合、/etc/spark/conf/spark-defaults.conf
に配置されます)
#make sure jars are added to CLASSPATH
spark.yarn.jars=file://{spark/home/dir}/jars/*.jar,file://{hadoop/install/dir}/share/hadoop/tools/lib/*.jar
spark.hadoop.fs.s3a.impl=org.Apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key={s3a.access.key}
spark.hadoop.fs.s3a.secret.key={s3a.secret.key}
#you can set above 3 properties in hadoop level `core-site.xml` as well by removing spark prefix.
sparkで送信必要に応じてaws-Java-sdk
でjar(hadoop-aws
および--driver-class-path
)をインクルードします。
spark-submit --master yarn \
--driver-class-path {spark/jars/home/dir}/aws-Java-sdk-1.7.4.jar \
--driver-class-path {spark/jars/home/dir}/hadoop-aws-2.7.3.jar \
other options
注:
エラーを防ぐために
find
コマンドを実行する前に、Linuxユーザーが読み取り権限を持っていることを確認してくださいPermission denied
Mesosでspark 1.6.1を使用しており、sparkからS3への書き込みで多くの問題が発生していました。 cfedukeの回答に感謝します。私が行ったわずかな変更は、maven座標をspark-defaults.confファイルのspark.jar構成に追加することでした。 hadoop-aws:2.7.2で試しましたが、まだ多くのエラーが発生していたため、2.7.1に戻りました。以下は、私たちのために機能しているspark-defaults.confの変更点です。
spark.jars.packages net.Java.dev.jets3t:jets3t:0.9.0,com.google.guava:guava:16.0.1,com.amazonaws:aws-Java-sdk:1.7.4,org.Apache.hadoop:hadoop-aws:2.7.1
spark.hadoop.fs.s3a.impl org.Apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key <MY ACCESS KEY>
spark.hadoop.fs.s3a.secret.key <MY SECRET KEY>
spark.hadoop.fs.s3a.fast.upload true
Cfedukeに投稿を書いてくれてありがとう。とても助かりました。
Spark Summit EUで発表された2016年10月現在の詳細を以下に示します。 Apache Spark and Object Stores 。
キーポイント
製品の配置:HADOOP-11694の読み取りパフォーマンス側はHDP2.5に含まれています。 SparkおよびS3のドキュメント 興味があるかもしれません-特にチューニングオプション。
Hadoop 2.6で事前構築されたSpark 1.4.1を使用して、Sparkスタンドアロンクラスターにデプロイするときにhadoop-awsおよびawsを追加することでs3a://を動作させることができます-Hadoop 2.7.1ディストリビューション(Hadoop 2.7.1の$ HADOOP_HOME/share/hadoop/tools/libにある)のJava-sdk jarファイルから$ SPARK_HOME/conf/spark-env.shファイルのSPARK_CLASSPATH環境変数へ。
あなたが言ったように、hadoop 2.6はs3aをサポートせず、最新のsparkリリース1.6.1はhadoop 2.7をサポートしませんが、spark 2.0はhadoop 2.7とs3aでは間違いなく問題ありません。
spark 1.6.xの場合、EMRのs3ドライバーを使用してダーティーハックを作成しました...このドキュメントをご覧ください: https://github.com/zalando/spark -appliance#emrfs-support
それでもspark 1.6.xでs3aを使用しようとする場合は、こちらの回答を参照してください: https://stackoverflow.com/a/37487407/5630352
spark-defaults.conf
を使用して、S3A依存関係をクラスパスに追加することもできます。
例:
spark.driver.extraClassPath /usr/local/spark/jars/hadoop-aws-2.7.5.jar
spark.executor.extraClassPath /usr/local/spark/jars/hadoop-aws-2.7.5.jar
spark.driver.extraClassPath /usr/local/spark/jars/aws-Java-sdk-1.7.4.jar
spark.executor.extraClassPath /usr/local/spark/jars/aws-Java-sdk-1.7.4.jar
あるいは単に:
spark.jars /usr/local/spark/jars/hadoop-aws-2.7.5.jar,/usr/local/spark/jars/aws-Java-sdk-1.7.4.jar
AWS SDKのバージョンとHadoopのバージョンを一致させてください。これについての詳細は、次の回答をご覧ください。 Spark 2.2を使用してS3データにアクセスできません
これがpysparkのソリューションです(プロキシを使用する場合があります):
def _configure_s3_protocol(spark, proxy=props["proxy"]["Host"], port=props["proxy"]["port"], endpoint=props["s3endpoint"]["irland"]):
"""
Configure access to the protocol s3
https://sparkour.urizone.net/recipes/using-s3/
AWS Regions and Endpoints
https://docs.aws.Amazon.com/general/latest/gr/rande.html
"""
sc = spark.sparkContext
sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.Apache.hadoop.fs.s3a.S3AFileSystem")
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", os.environ.get("AWS_ACCESS_KEY_ID"))
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", os.environ.get("AWS_SECRET_ACCESS_KEY"))
sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.Host", proxy)
sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.port", port)
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", endpoint)
return spark