我的目标是拥有一个支持 pyspark 和 s3/s3a 的工作 jupyter notebook。我已经到了让 pyspark 工作的地步,但无论我用多少谷歌搜索,我似乎都无法让它支持 s3 或 s3a。大部分信息是针对 unix/linux 的,或者假设太多。请帮忙。以下是我迄今为止采取的步骤。
关注 https://medium.com/@naomi.fridman/install-pyspark-to-run-on-jupyter-notebook-on-windows-4ec2009de21f
接下来是让 pyspark 在 Jupyter 中工作
findspark.init()
findspark.find()
import pyspark
findspark.find()
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
conf = pyspark.SparkConf().setAppName('appName').setMaster('local')
sc = pyspark.SparkContext(conf=conf)
spark = SparkSession(sc)
万岁,pyspark 在 Jupyter 下运行,但我需要这个自动运行作为内核的一部分,其中我现在只有 python3 的选项。
这是我卡住的地方。主要问题是我无法通过 spark.read.load("s3:/xx") 命令访问 s3/s3a/s3n,我也无法运行 %%configure -f 之类的东西,但这是一个较小的问题。
我已经通过 boto3 阅读了解决方案,但这是否允许 spark.read.load 直接从 s3?听起来不像。我可能是错的
另一个涉及从 maven 下载 aws-java-sdk-1.7.4.jar 和 hadoop-aws-2.7.1.jar 在某处(或 2 个不同的地方)添加这些行。这应该给我想要的结果。
spark.executor.extraClassPath C:\spark\maven\aws-java-sdk-1.7.4.jar;C:\spark\maven\hadoop-aws-2.7.1.jar
spark.driver.extraClassPath C:\spark\maven\aws-java-sdk-1.7.4.jar;C:\spark\maven\hadoop-aws-2.7.1.jar
hadoop_conf = spark.sparkContext._jsc.hadoopConfiguration()
hadoop_conf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
hadoop_conf.set("fs.s3a.access.key", "aKey")
hadoop_conf.set("fs.s3a.secret.key", "sKey"
谁能帮我?我想我必须创建自己的“C:\spark\spark-2.4.4-bin-hadoop2.7\conf\spark-defaults.conf”并在其中添加 spark.driver 代码,但它不起作用,我来自 Jupyter 的错误仍然存在,大多数在线答案似乎都在引用 linux 路径,但在这里我需要指定驱动器,不是吗?
Py4JJavaError:调用 o84.csv 时出错。
:java.lang.RuntimeException:java.lang.ClassNotFoundException:类org.apache.hadoop.fs.s3a.S3AFileSystem找不到
从
C:\spark\spark-2.4.4-bin-hadoop2.7\python\lib\py4j-0.10.7-src.zip\py4j\protocol.py in get_return_value(answer, gateway_client, target_id, name)
最佳答案
我找到了我的答案。除了 Jupyter 的配置文件/内核部分。
我发现并关注
https://medium.com/@sivachaitanya/accessing-aws-s3-from-pyspark-standalone-cluster-6ef0580e3c08
我还从 spark-defaults.conf 中回溯并删除了 maven jar 及其行,它仍然有效。看来我只需要将以下内容添加到 00-pyspark-setup.py 文件中
import os
os.environ['PYSPARK_SUBMIT_ARGS'] = "--packages=org.apache.hadoop:hadoop-aws:2.7.3 pyspark-shell"
import findspark
findspark.init()
findspark.find()
import pyspark
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
conf = pyspark.SparkConf().setAppName('appName').setMaster('local')
sc=SparkContext(conf=conf)
sc.setSystemProperty("com.amazonaws.services.s3.enableV4", "true")
hadoopConf = sc._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.endpoint", "s3-ap-northeast-1.amazonaws.com")
hadoopConf.set("com.amazonaws.services.s3a.enableV4", "true")
spark = SparkSession(sc)
import configparser
config = configparser.ConfigParser()
config.read(os.path.expanduser("~/.aws/credentials"))
access_id = config.get("default", "aws_access_key_id")
access_key = config.get("default", "aws_secret_access_key")
spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.access.key", access_id)
spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.secret.key", access_key)
除了将端点更改为我所在的区域。然后,
spark.read.csv("s3a:/myBucket/*").show()
工作!
关于windows - 如何让 Anaconda Pyspark Jupyter 在 Windows 下使用 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60092354/