如何让anacondapyspark jupyter在windows下使用s3

5sxhfpxr  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(544)

我的目标是拥有一个支持pyspark和s3/s3a的jupyter笔记本。不知何故,我已经到了让pyspark工作的地步,但我似乎无法让它支持s3或s3a,无论我在google上搜索了多少。大多数信息是针对unix/linux的,或者假设太多。请帮忙。以下是我迄今所采取的步骤。
跟随https://medium.com/@naomi.fridman/install-pyspark-to-run-on-jupyter-notebook-on-windows-4ec2009de21f
已安装java 8(windowsx64版本)
根据上述站点设置java\u home变量和添加的path变量(使用较新版本的path)
下载了ApacheSpark 2.4.4(2019年8月30日),它是为ApacheHadoop2.7预先构建的
解压缩到c:\spark(获得spark-2.4.4-bin-hadoop2.7.tar)
将其解压缩到c:\spark(获得spark-2.4.4-bin-hadoop2.7文件夹)
根据上述站点设置更多环境变量并将bin文件夹添加到路径变量
根据上面的站点下载了windows 64位winutils.exe文件,并运行了cmd命令。我在c:\spark\spark-2.4.4-bin-hadoop2.7文件夹及其bin文件夹中留了一份。
运行并测试了anaconda spark-成功
下一步是让Pypark在jupyter工作
在anaconda提示符中,我安装了findspark“conda install-c conda forge findspark”
运行后

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。
所以我在google上搜索了一下,发现我需要在“c:\programdata\anaconda3\share\jupyter\kernels”下创建一个dir,所以我复制并重命名了现有的python3文件夹,只需将“display\u name”:改为“pyspark”,我应该可以在那里添加一行,比如“--profile=mycustomprofile”,但是一直失败(没有找到模块?),所以我放弃了profiles(这里也有帮助plz?)
然后我在“c:\users\admin.ipython\profile\u default\startup”下创建了一个00-pyspark-setup.py文件,我知道这是一个类似autoexec.bat的东西,所以我把上面的findspark和sparkcontext代码放在里面
这就是我被困住的地方。主要问题是我无法通过spark.read.load(“s3:/xx”)命令访问s3/s3a/s3n,我也无法运行%%configure-f之类的操作,但这是一个较小的问题。
我已经通过boto3读取了解决方案,但这是否允许直接从s3加载spark.read.load?听起来不像。我可能错了
另一个涉及从maven下载aws-java-sdk-1.7.4.jar和hadoop-aws-2.7.1.jar,添加这些行到某处(或两个不同的地方)。这会给我想要的结果。

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:class 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中找到get\u return\u value(answer,gateway\u client,target\u id,name)

gajydyqb

gajydyqb1#

我找到了答案。除了jupyter的profile/kernel部分。
我发现并跟踪https://medium.com/@sivachaitanya/accessing-aws-s3-from-pyspark-standalone-cluster-6ef0580e3c08标准
我还从spark-defaults.conf中回溯并删除了maven jars及其行,它仍然有效。似乎我只需要在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()

工作!

相关问题