web-dev-qa-db-ja.com

Hadoop 2.9.2、Spark 2.4.0アクセスAWS s3aバケット

数日が経ちましたが、Spark :(

spark-Shellコマンドは次のとおりです。

spark-Shell  --master yarn
              -v
              --jars file:/usr/local/hadoop/share/hadoop/tools/lib/hadoop-aws-2.9.2.jar,file:/usr/local/hadoop/share/hadoop/tools/lib/aws-Java-sdk-bundle-1.11.199.jar
              --driver-class-path=/usr/local/hadoop/share/hadoop/tools/lib/hadoop-aws-2.9.2.jar:/usr/local/hadoop/share/hadoop/tools/lib/aws-Java-sdk-bundle-1.11.199.jar

アプリケーションが起動し、シェルがプロンプトを待機しています:

   ____              __
  / __/__  ___ _____/ /__
 _\ \/ _ \/ _ `/ __/  '_/
/___/ .__/\_,_/_/ /_/\_\   version 2.4.0
   /_/

Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_191)
Type in expressions to have them evaluated.
Type :help for more information.

scala> val data1 = sc.textFile("s3a://my-bucket-name/README.md")

18/12/25 13:06:40 INFO MemoryStore: Block broadcast_0 stored as values in memory (estimated size 242.1 KB, free 246.7 MB)
18/12/25 13:06:40 INFO MemoryStore: Block broadcast_0_piece0 stored as bytes in memory (estimated size 24.2 KB, free 246.6 MB)
18/12/25 13:06:40 INFO BlockManagerInfo: Added broadcast_0_piece0 in memory on hadoop-Edge01:3545 (size: 24.2 KB, free: 246.9 MB)
18/12/25 13:06:40 INFO SparkContext: Created broadcast 0 from textFile at <console>:24
data1: org.Apache.spark.rdd.RDD[String] = s3a://my-bucket-name/README.md MapPartitionsRDD[1] at textFile at <console>:24

scala> data1.count()

Java.lang.NoClassDefFoundError: org/Apache/hadoop/fs/StorageStatistics
at Java.lang.Class.forName0(Native Method)
at Java.lang.Class.forName(Class.Java:348)
at org.Apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.Java:2134)
at org.Apache.hadoop.conf.Configuration.getClassByName(Configuration.Java:2099)
at org.Apache.hadoop.conf.Configuration.getClass(Configuration.Java:2193)
at org.Apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.Java:2654)
at org.Apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.Java:2667)
at org.Apache.hadoop.fs.FileSystem.access$200(FileSystem.Java:94)
at org.Apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.Java:2703)
at org.Apache.hadoop.fs.FileSystem$Cache.get(FileSystem.Java:2685)
at org.Apache.hadoop.fs.FileSystem.get(FileSystem.Java:373)
at org.Apache.hadoop.fs.Path.getFileSystem(Path.Java:295)
at org.Apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.Java:97)
at org.Apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.Java:80)
at org.Apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.Java:206)
at org.Apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.Java:315)
at org.Apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:204)
at org.Apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
at org.Apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
at scala.Option.getOrElse(Option.scala:121)
at org.Apache.spark.rdd.RDD.partitions(RDD.scala:251)
at org.Apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:49)
at org.Apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
at org.Apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
at scala.Option.getOrElse(Option.scala:121)
at org.Apache.spark.rdd.RDD.partitions(RDD.scala:251)
at org.Apache.spark.SparkContext.runJob(SparkContext.scala:2126)
at org.Apache.spark.rdd.RDD.count(RDD.scala:1168)
... 49 elided
Caused by: Java.lang.ClassNotFoundException: 
org.Apache.hadoop.fs.StorageStatistics
  at Java.net.URLClassLoader.findClass(URLClassLoader.Java:382)
  at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)
  at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:349)
  at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
  ... 77 more

scala>
  1. ここで説明するように、すべてのAWSキー、秘密キーはhadoop/core-site.xmlで設定されました: Hadoop-AWSモジュール:Amazon Web Servicesとの統合
  2. バケットは公開されています-誰でもダウンロードできます(curl -Oでテスト済み)
  3. ご覧のように、すべての.jarは/usr/local/hadoop/share/hadoop/tools/lib/フォルダーからHadoop自体によって提供されました
  4. spark-defaults.confには追加の設定はありません-コマンドラインで送信されたもののみ
  5. 両方のjarはこのクラスを提供しません:

    jar tf /usr/local/hadoop/share/hadoop/tools/lib/hadoop-aws-2.9.2.jar | grep org/Apache/hadoop/fs/StorageStatistics
    (no result)
    
    jar tf /usr/local/hadoop/share/hadoop/tools/lib/aws-Java-sdk-bundle-1.11.199.jar | grep org/Apache/hadoop/fs/StorageStatistics
    (no result)
    

私は何をすべきか ?別のjarを追加するのを忘れましたか? hadoop-awsおよびaws-Java-sdk-bundleの正確な構成は何ですか?バージョン?

6
Jasper

うーん…。問題が見つかりました、ついに..

主な問題はSparkは、Hadoop用にプリインストールされています。Hadoop2.7以降用のv2.4.0プレビルドです。これは、私の闘争を見ると少し誤解を招くタイトルです。実際にはSpark付属のdifferentバージョンのhadoop jarファイル。/usr/local/からのリスト。 spark/jars /は以下を持っていることを示します:

hadoop-common-2.7.3.jar
hadoop-client-2.7.3.jar
....

欠落しているのは:hadoop-awsおよびaws-Java-sdkです。 Mavenリポジトリを少し掘り下げます: hadoop-aws-v2.7. とその依存関係: aws-Java-sdk-v1.7.4 と出来上がり!それらのjarをダウンロードし、パラメーターとしてthemをSparkに送信します。このような:

スパークシェル
-マスターヤーン
-v
-jarsファイル:/home/aws-Java-sdk-1.7.4.jar,file:/home/hadoop-aws-2.7.3.jar
-driver-class-path =/home/aws-Java-sdk-1.7.4.jar:/home/hadoop-aws-2.7.3.jar

仕事をしました!!!

Hadoopのすべてのjar(およびそれらすべてを--jarsおよび--driver-class-pathのパラメーターとして送信する)が追いつかなかったのはなぜかと思っています。 Sparkどういうわけか私が送信したものではなく自動的にjarを選択します

14
Jasper

私はあなたがしたことをしないことをお勧めします。ビルド済みspark with hadoop 2.7.2 jar上のhadoop 2.9.2そして、hadoop 2.7.3バージョンは問題を解決します。

あなたがすべきことは、「hadoop free」で作業することですsparkバージョン-そして、次のリンクで見ることができるように、構成によってhadoopファイルを提供します- https:// spark .Apache.org/docs/2.4.0/hadoop-provided.html

主な部品:

conf/spark-env.sh

hadoopバイナリがPATHにある場合

export SPARK_DIST_CLASSPATH=$(hadoop classpath)

hadoopバイナリへの明示的なパス付き

export SPARK_DIST_CLASSPATH=$(/path/to/hadoop/bin/hadoop classpath)

Hadoop構成ディレクトリを渡す

export SPARK_DIST_CLASSPATH=$(hadoop --config /path/to/configs classpath) 
4
zszohar stiro