Как загрузить RDD из файлов S3 из spark-shell? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть текстовый файл в S3, который я хотел бы загрузить в RDD с spark-shell.

Я скачал Spark 2.3.0 для Hadoop .Наивно, я ожидал бы, что мне просто нужно установить настройки hadoop, и я буду установлен.

val inFile = "s3a://some/path"
val accessKey = "some-access-key"
val secretKey = "some-secret-key"

sc.hadoopConfiguration.set("fs.s3a.access.key", accessKey)
sc.hadoopConfiguration.set("fs.s3a.secret.key", secretKey)

sc.textFile(inFile).count()

println(run())

Вызов последней строки возвращает:

Failure(java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found)

Это, кажется, спрашиваетчто я предоставляю библиотеку, которая включает в себя S3AFileSystem.Нет проблем - я загружаю соответствующий jar-файл и добавляю эту строку в начало скрипта.

:require C:\{path-to-jar}\hadoop-aws-3.1.0.jar

Теперь запуск скрипта завершается неудачно в последней строке с рядом ошибок, подобных этой:

error: error while loading Partition, class file 'C:\spark\spark-2.3.0-bin-hadoop2.7\jars\spark-core_2.11-2.3.0.jar(org/apache/spark/Partition.class)' has location not matching its contents: contains class Partition

В этот момент я заблудился - очевидно, у него не было проблем с определением метода run раньше.

Я могу получить прямой доступ к классу Разделения, но что-то происходит выше, что мешаеткод доступа к разделу.

scala> new org.apache.spark.Partition {def index = 3}
res6: org.apache.spark.Partition = $anon$1@3

Любопытно, что запуск последней строки скрипта приводит к другой ошибке при последующих вызовах.

scala> sc.textFile(inFile).count()
java.lang.NoClassDefFoundError: org/apache/hadoop/fs/StreamCapabilities
  at java.lang.ClassLoader.defineClass1(Native Method)
  ...

документация претензийэто часть hadoop 3.1.0, которую я использую, но при исследовании hadoop-aws-3.1.0.jar я не вижу никаких следов StreamCapabilities.

Есть ли другой jar, который я должен использовать?Я пытаюсь решить эту проблему неправильно?Или я попал в ловушку проблемы XY?

Ответы, которые я пытался

  • Официальные документы предполагают, что я запускаю сценарий в кластере.Но я запускаю spark-shell локально.
  • Этот другой вопрос StackOverflow предназначен для более старой проблемы.В результате я использую s3a, но столкнулся с другой проблемой.
  • Я также пытался использовать каждую банку Hadoop от 2.6 до 3.1, но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

org.apache.hadoop.fs.StreamCapabilities находится в hadoop-common-3.1.jar. Вы, вероятно, смешиваете версию Jad-файлов Hadoop, которые, как указано в документах по устранению неполадок s3a, обречены.

Оболочка Sparkотлично работает с правильными JAR-файлами. Но выпуски ASF Spark пока не работают с Hadoop 3.x из-за некоторых нерешенных проблем.Придерживайтесь Hadoop 2.8.x, и вы получите хорошую производительность S3 без особой боли.

0 голосов
/ 19 мая 2018

Я нашел путь, который устранил проблему, , но я понятия не имею, почему .

  1. Создать проект SBT IntelliJ
  2. Включите следующие зависимости и переопределения
  3. Запустите скрипт (sans require оператор) из sbt console

    scalaVersion := "2.11.12"
    
    libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0"
    libraryDependencies += "org.apache.hadoop" % "hadoop-aws" % "3.1.0"
    libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "3.1.0"
    
    dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-core" % "2.8.7"
    dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.7"
    dependencyOverrides += "com.fasterxml.jackson.module" % "jackson-module-scala_2.11" % "2.8.7"
    

Ключевая часть, естественно, переопределяет зависимости Джексона.

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