【问题标题】:How do I access a MinIO storage bucket from a Jupyter Pyspark notebook?如何从 Jupyter Pyspark 笔记本访问 MinIO 存储桶?
【发布时间】:2019-06-19 07:49:24
【问题描述】:

我有 MinIO 和 Jupyter Pyspark 笔记本的实例在不同的 docker 容器上本地运行。我可以使用 minio Python 包查看 MinIO 中的存储桶和对象,但是当我尝试使用 Pyspark 从存储桶加载镶木地板时,我得到以下信息:

代码:

salesDF_path = 's3a://{}:{}/data/sales/example.parquet'.format(host, port)
df = spark.read.load(salesDF_path)

错误:

Py4JJavaError: An error occurred while calling o22.load.
: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195)
    at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2654)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$org$apache$spark$sql$execution$datasources$DataSource$$checkAndGlobPathIfNecessary$1.apply(DataSource.scala:547)
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$org$apache$spark$sql$execution$datasources$DataSource$$checkAndGlobPathIfNecessary$1.apply(DataSource.scala:545)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
    at scala.collection.immutable.List.foreach(List.scala:392)
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
    at scala.collection.immutable.List.flatMap(List.scala:355)
    at org.apache.spark.sql.execution.datasources.DataSource.org$apache$spark$sql$execution$datasources$DataSource$$checkAndGlobPathIfNecessary(DataSource.scala:545)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:359)
    at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:223)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2101)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193)
    ... 30 more

我正在尝试编写一个脚本来启动这些容器,运行一些测试,然后将它们拆除。我需要在某处包含一些配置吗?

【问题讨论】:

    标签: python docker apache-spark pyspark jupyter-notebook


    【解决方案1】:

    请按照以下步骤操作:

    相关的aws jars

    确保您已安装以下jars:

    您可以运行pyspark 应用程序,例如:

    pyspark --jars "aws-java-sdk-1.7.4.jar,hadoop-aws-2.7.3 (或来自码头工人CMD

    在 notebook 中,配置“hadoop 配置”

    sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", "access_key")
    sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "secret_key")
    sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.host", "minio")
    sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "minio")
    sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.port", "9000")
    sc._jsc.hadoopConfiguration().set("fs.s3a.path.style.access", "true")
    sc._jsc.hadoopConfiguration().set("fs.s3a.connection.ssl.enabled", "false")
    sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    

    请查看s3a client configuration 查看完整的参数列表

    现在应该可以从minio查询数据了,例如:

    sc.textFile("s3a://<file path>")

    【讨论】:

      【解决方案2】:

      您能否展示一下您是如何安装和初始化 Spark 的?看来您必须下载 org.apache.hadoop.fs.s3a.S3AFileSystem 的 Java 库。你能确定你安装了hadoop-awsaws-java-sdk JARS 吗?我使用http://central.maven.org/maven2/org/apache/hadoop/hadoop-aws/2.7.3/hadoop-aws-2.7.3.jarhttp://central.maven.org/maven2/com/amazonaws/aws-java-sdk/1.7.4/aws-java-sdk-1.7.4.jar

      【讨论】:

        【解决方案3】:

        在此处查看此评论:https://github.com/jupyter/docker-stacks/issues/272#issuecomment-244278586

        具体来说:

        import os
        os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk:1.10.34,org.apache.hadoop:hadoop-aws:2.6.0,com.databricks:spark-csv_2.11:1.4.0 pyspark-shell'
        

        这有助于摆脱该类未找到错误

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-24
          • 1970-01-01
          相关资源
          最近更新 更多