我正在尝试使用Jupyter,PySpark和S3文件(通过s3a协议)进行工作。我们需要使用s3会话令牌,因此需要org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider。该组件已添加到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配置显示:
[('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')]
所以这些jar包正在被提交。
在一个独立的没有安装hadoop的spark集群上(版本为2.3.1),当使用命令行上的spark-submit时,它可以完美地运行。然而,在Jupyter Notebooks中,似乎找不到所需的类,因此那段代码(以及试图从s3a://bucket/prefix/key读取数据的代码)会失败。
有任何想法为什么--packages jars在jupyter中不可见吗?
更新
所以,我尝试了简化的方法。我创建了一个conda环境,通过pip安装了pyspark 2.4.0(python 3)。然后尝试:
pyspark --packages org.apache.hadoop:hadoop-aws:3.0.0
在启动的终端中,我尝试了上面的代码。在启动时,我看到它下载了jars,但是它仍然找不到类。
更新2
所以,我手动将jars复制到/home/ashic/.conda/envs/pyspark/lib/python3.7/site-packages/pyspark/jars,然后在命令行上运行pyspark。它“只是工作了”。然而,将jars放入文件夹并使用--driver-class-path或者--jars也都不起作用。看起来pyspark没有按预期使用这些jars。
hadoop-aws-3.0.0.jar
吗?还是我需要所有的hadoop-*-3.0.0.jar
文件? - sid-kap