gpt4 book ai didi

amazon-web-services - Jupyter notebook、pyspark、hadoop-aws 问题

转载 作者:可可西里 更新时间:2023-11-01 14:50:57 25 4
gpt4 key购买 nike

我正在尝试结合使用 Jupyter、PySpark 和 S3 文件(通过 s3a 协议(protocol))。我需要 org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider ,因为我们需要使用 s3 session token 。这是添加到 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 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')]

所以 jars 正在提交。

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

知道为什么 --packages jar 在 jupyter 中不可见吗?

更新

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

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

在启动的终端中,我尝试了上面的代码。启动时,我看到它下载了 jar,但仍然找不到类。

更新 2

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

最佳答案

跨 Hadoop 版本混合 JAR 注定要失败。即使 hadoop-* JAR 排列好,您也会发现版本问题。正确设置类路径是整个 ASF 大数据栈永恒的痛点之一

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

您可能需要将对 S3AUtils.lookupPassword(conf, key, ...) 的调用替换为 conf.getTrimmed(key, '") 并且它将获取 session secret ;lookupPassword 代码稍微复杂一些,因为它旨在处理隐藏在加密 JCEKS 文件中的 secret 。

关于amazon-web-services - Jupyter notebook、pyspark、hadoop-aws 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53340092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com