开发者社区> 问答> 正文

Jupyter笔记本,pyspark,hadoop-aws问题

我正在尝试一起使用Jupyter,PySpark和S3文件(通过s3a协议)。我需要org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider,因为我们需要使用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中。

火花conf显示:

[('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')]
所以罐子正在提交。

在带有hadoop 3.0.0安装的独立spark-without-hadoop(2.3.1)集群上,当在命令行上使用spark-submit时,这非常有效。但是,在Jupyter笔记本中,它似乎没有找到所需的类,因此代码(以及尝试从s3a:// bucket / prefix / key读取数据的代码)失败。

知道为什么 - 包jars在jupyter中不可见?

UPDATE
所以,我试着简化。我创建了一个conda env,通过pip安装了pyspark 2.4.0(python 3)。然后尝试:

pyspark --packages org.apache.hadoop:hadoop-aws:3.0.0
在已启动的终端中,我尝试了上面的代码。启动时,我看到它下载了jar,但是它仍然没有找到该类。

更新2
所以,我手动将jar复制到/home/ashic/.conda/envs/pyspark/lib/python3.7/site-packages/pyspark/jars ,并在命令行上运行pyspark。它“刚刚奏效”。但是,将jar放入文件夹并使用--driver-class-path甚至--jars都不起作用。看起来pyspark没有像预期的那样使用jar。

展开
收起
社区小助手 2018-12-12 18:20:20 2634 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    在Hadoop版本中混合使用JAR注定要失败。即使hadoop- * JAR排队,你也会发现版本问题。让类路径正确是整个ASF大数据堆栈的永恒难点之一

    最简单的方法可能是将AWS类复制到您自己的库中,修复它直到它工作并针对Hadoop 2.8运行它。

    您可能需要将呼叫替换为S3AUtils.lookupPassword(conf, key, ...)with conf.getTrimmed(key, '"),它将获取会话密码; 该lookupPassword代码是一个比较复杂的,因为它设计用于处理加密的文件JCEKS藏秘密。

    2019-07-17 23:20:15
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Apache Hadoop 3.0: What’s new in YARN & MapReduce 立即下载
Welcome to Apache Hadoop’s Tee 立即下载
Apache Hadoop 3.0: What’s newi 立即下载

相关实验场景

更多