Hadoop 2.9.2, Spark 2.4.0, доступ к AWS s3a bucket - PullRequest
0 голосов
/ 25 декабря 2018

Прошло несколько дней, но я не смог загрузить из общедоступного Amazon Bucket с помощью 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, как вы можете видеть, были предоставлены самой Hadoop из папки /usr/local/hadoop/share/hadoop/tools/lib/
  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)
    

Чтоя должен сделать? Я забыл добавить еще одну банку? Какова точная конфигурация hadoop-aws и aws-java-sdk-bundle? версии?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Я советую вам не делать то, что вы сделали.Вы запускаете предварительно собранную искру с hadoop 2.7.2 банками на hadoop 2.9.2, и вы добавили в classpath еще несколько банок для работы с s3 из версии hadoop 2.7.3 для решения проблемы.

Что вам следует сделать, так это работать с искровой версией "hadoop free" - и предоставить файл hadoop по конфигурации, как вы можете видеть по следующей ссылке - https://spark.apache.org/docs/2.4.0/hadoop-provided.html

Основные части:

in conf/spark-env.sh

Если в вашей переменной PATH есть hadoop бинарный файл

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) 
0 голосов
/ 25 декабря 2018

Мммм .... Я нашел проблему, наконец-то ..

Основная проблема в том, что у меня Spark предустановлен для Hadoop.Это «v2.4.0 pre-build для Hadoop 2.7 и более поздних версий».Это немного вводящий в заблуждение заголовок, как вы видите мою борьбу с ним выше.На самом деле Spark поставляется с другой версией баночек с хрупом.Список из / 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.3 и его зависимость: aws-java-sdk-v1.7.4 и вуаля!Скачайте эти файлы и отправьте их в качестве параметров в Spark.Вот так:

spark-shell
- мастер пряжи
-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

Сделал работу !!!

Мне просто интересно, почему все jar от Hadoop (и я отправляю их все как параметр в --jars и --driver-класс-путь) не догнал.Spark как-то автоматически выбирает именно банки, а не те, которые я посылаю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...