web-dev-qa-db-ja.com

Apache Sparkからs3a://ファイルにアクセスする方法は?

Hadoop 2.6はすぐに使用できるs3aをサポートしていないため、次のような一連のソリューションと修正を試しました。

hadoop-awsおよびaws-Java-sdkでデプロイ=>資格情報の環境変数を読み取れないhadoop-awsをmavenに追加=>さまざまな推移的な依存関係の競合

誰かが両方の仕事を成功させましたか?

46
tribbloid

S3aとs3nの違いを直接経験した-s3aで転送された7.9GBのデータは約7分でしたが、s3nの7.9GBのデータは73分かかりました[残念ながら両方のケースでus-east-1からus-west-1。 RedshiftとLambdaは現時点でus-east-1である]これはスタックを修正するための非常に重要な部分であり、フラストレーションに値する。

2015年12月現在の主要部分は次のとおりです。

  1. Sparkクラスターには、Hadoopバージョン2.x以降が必要です。 Spark EC2セットアップスクリプトを使用していて見逃している可能性がある場合、1.0以外を使用するための切り替えは、--hadoop-major-version 2(この記事の執筆時点でCDH 4.2を使用)を指定することです。

  2. 2.7.1(安定)以降のHadoopのバージョンには、最初は古くなっているように見えるAWS SDKライブラリ(2014年にバージョン1.7.4としてビルド)を含める必要があります:aws-Java-sdk 1.7 .4。 1.10.8向けの特定のAWS SDK JARとともにこれを使用することでわかる限り、何も壊れていません。

  3. また、クラスパスにhadoop-aws 2.7.1 JARが必要です。このJARにはクラスorg.Apache.hadoop.fs.s3a.S3AFileSystemが含まれています。

  4. 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
    

私が書いた投稿 についてこのリストを詳しく説明しました。さらに、私は途中でヒットしたすべての例外ケースと、それぞれの原因であると信じるものと、それらを修正する方法をカバーしました。

44
cfeduke

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

16
mrsrinivas

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に投稿を書いてくれてありがとう。とても助かりました。

9
Kyle Burke

Spark Summit EUで発表された2016年10月現在の詳細を以下に示します。 Apache Spark and Object Stores

キーポイント

  • 直接出力コミッターは、データ破損のリスク/経験により、Spark 2.0から削除されました。
  • FileOutputCommitterには、名前の変更を減らすための設定がありますが、それらを排除することはありません
  • 私は同僚と協力してO(1)コミッターを行い、Apache Dynamoを使用して必要な一貫性を実現しています。
  • S3aを使用するには、クラスパスを正しく取得します。
  • そして、Hadoop 2.7.zに参加してください。 2.6.xにはいくつかの問題があり、それまでに解決されました HADOOP-11571
  • SPARK-7481の下には、自分で作成したsparkディストリビューションにすべてを取り込むためのPRがあります。そうでない場合は、バイナリに提供する人に作業を依頼してください。
  • Hadoop 2.8では、パフォーマンスが大幅に改善されます HADOOP-11694

製品の配置:HADOOP-11694の読み取りパフォーマンス側はHDP2.5に含まれています。 SparkおよびS3のドキュメント 興味があるかもしれません-特にチューニングオプション。

7
Steve Loughran

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環境変数へ。

4
richvt2k

あなたが言ったように、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

4
chutium

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データにアクセスできません

3
Sam Malayek

これが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
2
raul ferreira