Проблемы с ноутбуком Jupyter, pyspark, hadoop-aws - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь использовать файлы Jupyter, PySpark и S3 (по протоколу s3a) вместе.Мне нужен org.apache.hadoop.fs.s3a.TeoraryAWSCredentialsProvider, так как нам нужно использовать токены сессии s3.Это было добавлено в hadoop-aws 2.8.3+.Я пытаюсь следующий код:

import os
from pyspark.sql import SparkSession

os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages org.apache.hadoop:hadoop-aws:3.0.0 pyspark-shell'
spark = SparkSession.builder.appName('abc2').getOrCreate()
sc = spark.sparkContext
res = sc._jvm.java.lang.Class.forName("org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider")

Это не с

Py4JJavaError: An error occurred while calling z:java.lang.Class.forName.
: java.lang.ClassNotFoundException: org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)

Однако этот класс определенно существует в hadoop-aws 3.0.0.

Спарк-конф показывает:

[('spark.driver.port', '34723'),
 ('spark.executor.id', 'driver'),
 ('spark.driver.host', 'HeartyX'),
 ('spark.jars',
  'file:///home/ashic/.ivy2/jars/org.apache.hadoop_hadoop-aws-3.0.0.jar,file:///home/ashic/.ivy2/jars/com.amazonaws_aws-java-sdk-bundle-1.11.199.jar'),
 ('spark.submit.pyFiles',
  '/home/ashic/.ivy2/jars/org.apache.hadoop_hadoop-aws-3.0.0.jar,/home/ashic/.ivy2/jars/com.amazonaws_aws-java-sdk-bundle-1.11.199.jar'),
 ('spark.repl.local.jars',
  'file:///home/ashic/.ivy2/jars/org.apache.hadoop_hadoop-aws-3.0.0.jar,file:///home/ashic/.ivy2/jars/com.amazonaws_aws-java-sdk-bundle-1.11.199.jar'),
 ('spark.rdd.compress', 'True'),
 ('spark.serializer.objectStreamReset', '100'),
 ('spark.app.id', 'local-1542373156862'),
 ('spark.master', 'local[*]'),
 ('spark.submit.deployMode', 'client'),
 ('spark.app.name', 'abc2'),
 ('spark.ui.showConsoleProgress', 'true'),
 ('spark.files',
  'file:///home/ashic/.ivy2/jars/org.apache.hadoop_hadoop-aws-3.0.0.jar,file:///home/ashic/.ivy2/jars/com.amazonaws_aws-java-sdk-bundle-1.11.199.jar')]

Итак, баночки отправляются.

В автономном кластере spark-without-hadoop (2.3.1) с установкой hadoop 3.0.0 при использовании spark-submit в командной строке это работает отлично.Однако в Jupyter Notebooks кажется, что он не находит требуемый класс, и поэтому код (и код, который пытается прочитать данные из s3a: // bucket / prefix / key) не работает.

Есть идеи, почему баночки --packages не видны в jupyter?

ОБНОВЛЕНИЕ

Итак, я попытался упростить.Я создал conda env, установил pyspark 2.4.0 (python 3) через pip.Потом попробовал:

pyspark --packages org.apache.hadoop:hadoop-aws:3.0.0

В запущенном терминале я попробовал код выше.При запуске я вижу, что он загружает банки, но затем все равно не находит класс.

ОБНОВЛЕНИЕ 2

Итак, я скопировал банки вручную в /home/ashic/.conda/envs/pyspark/lib/python3.7/site-packages/pyspark/jars, изапускал pyspark в командной строке.Это "просто сработало".Однако помещение jar-файлов в папку и использование --driver-class-path или даже --jars не работает.Похоже, Pyspark не использует банки, как ожидалось.

1 Ответ

0 голосов
/ 18 ноября 2018

Смешивание JAR-файлов в версиях Hadoop обречено на провал.Даже после того, как JAR-файлы hadoop- * выстроятся в линию, вы обнаружите проблемы с версией.Правильное получение путей к классам - это одна из вечных проблем всего стека больших данных ASF

Самый простой способ - это, вероятно, скопировать класс AWS в свою собственную библиотеку, исправить ее, пока она не заработаети запустить его против Hadoop 2.8.

Вам, вероятно, придется заменить вызовы на S3AUtils.lookupPassword(conf, key, ...) на conf.getTrimmed(key, '"), и он подберет секреты сеанса;код lookupPassword немного сложнее, поскольку он предназначен для обработки секретов, спрятанных в зашифрованных файлах JCEKS.

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