У меня есть текстовый файл в 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, но безрезультатно.