Я пытаюсь использовать файлы 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 не использует банки, как ожидалось.