windows - 如何让 Anaconda Pyspark Jupyter 在 Windows 下使用 S3

标签 windows apache-spark hadoop anaconda jupyter

我的目标是拥有一个支持 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

  • 已安装 JAVA 8(Windowsx64 版本)
  • 根据上述站点设置 JAVA_HOME 变量并添加 PATH 变量(使用较新版本的路径)
  • 已下载 Apache Spark 2.4.4(2019 年 8 月 30 日)PreBuilt for Apache Hadoop 2.7
  • 解压到 C:\Spark (得到 spark-2.4.4-bin-hadoop2.7.ta​​r)
  • 将其解压缩到 C:\Spark(获取文件夹 spark-2.4.4-bin-hadoop2.7)
  • 设置更多环境变量并将 bin 文件夹添加到 PATH 变量中,根据上面的站点
  • 根据上面的站点下载了 Windows 64 位 winutils.exe 文件,运行它告诉我运行的 cmd 命令。我在 C:\Spark\spark-2.4.4-bin-hadoop2.7 文件夹及其 bin 文件夹中留下了一份副本。
  • 运行和测试 Anaconda spark - 成功

  • 接下来是让 pyspark 在 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 的选项。
  • 所以我用谷歌搜索,发现我需要在“C:\ProgramData\Anaconda3\share\jupyter\kernels”下创建一个目录,所以我复制并重命名现有的 python3 文件夹,然后将“display_name”:更改为“pyspark” ,我应该能够在那里添加一行像“--profile = myCustomProfile”但是一直失败(没有找到模块?)所以我放弃了配置文件(这里也有帮助吗?)
  • 然后我在“C:\Users\Admin.ipython\profile_default\startup”下创建了一个 00-pyspark-setup.py 文件,我读到它是一种 autoexec.bat 之类的东西,所以我将上面的 findspark 和 sparkContext 代码放入那里


  • 这是我卡住的地方。主要问题是我无法通过 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/

    相关文章:

    hadoop - 如何在 Hive 中存储特殊字符?

    hadoop - oozie可以在hdfs目录中监视目录中是否有新文件吗?

    c++ - 关闭 fstream 是否保证文件系统同步?

    无法在 Windows 7 上使用管理员帐户创建原始套接字

    windows - 无法加载 DLL 'e_sqlite3' : The specified module could not be found

    java - 如何使用 StopWordsRemover 转换 json 对象的 Dataframe?

    hadoop - 如何为 Multi-Tenancy 配置 Hive Impala/Spark?

    hadoop - 如何在嵌套的 FOREACH 中使用 DESCRIBE 和 DUMP

    hadoop - 在不安全的 YARN 集群中运行 Spark 时访问安全的 Hive

    c++ - 如何使用 LoadIcon 的 c++ win32 api 在 vi​​sual studio 2017 中将图标设置为 exe