【问题标题】:Reading from google storage gs:// filesystem from local spark instance从本地 spark 实例中读取 google storage gs:// 文件系统
【发布时间】:2017-04-04 14:31:28
【问题描述】:

问题很简单:你有一个本地 spark 实例(集群或者只是在本地模式下运行)并且你想从 gs://

【问题讨论】:

    标签: apache-spark google-cloud-storage google-cloud-platform


    【解决方案1】:

    在我的 Spark 2.4.3 上,我需要执行以下操作才能从 Spark 本地启用 GCS 访问。我使用的是 JSON 密钥文件,而不是上面建议的 client.id/secret

    1. $SPARK_HOME/jars/ 中,使用此处的阴影gcs-connector jar:http://repo2.maven.org/maven2/com/google/cloud/bigdataoss/gcs-connector/hadoop2-1.9.17/,否则我会因传递依赖而出现各种故障。

    2. (可选)给我的build.sbt 添加:

      "com.google.cloud.bigdataoss" % "gcs-connector" % "hadoop2-1.9.17"
          exclude("javax.jms", "jms")
          exclude("com.sun.jdmk", "jmxtools")
          exclude("com.sun.jmx", "jmxri")
      
    3. $SPARK_HOME/conf/spark-defaults.conf,添加:

      spark.hadoop.google.cloud.auth.service.account.enable       true
      spark.hadoop.google.cloud.auth.service.account.json.keyfile /path/to/my/keyfile
      

    一切正常。

    【讨论】:

    • 感谢您的回答。是否可以添加 JSON 密钥文件的示例?
    • 密钥文件应该只是通常的服务帐户密钥,如下所述:cloud.google.com/iam/docs/…
    【解决方案2】:

    我在这里提交我通过结合不同资源提出的解决方案:

    1. 下载谷歌云存储连接器:gs-connector并将其存储在$SPARK/jars/文件夹中(勾选底部的Alternative 1

    2. here 下载core-site.xml 文件,或从下方复制。这是hadoop使用的配置文件(spark使用的)。

    3. core-site.xml 文件存储在一个文件夹中。我个人创建了$SPARK/conf/hadoop/conf/ 文件夹并将其存储在那里。

    4. 在 spark-env.sh 文件中通过添加以下行来指明 hadoop conf 文件夹:export HADOOP_CONF_DIR= =</absolute/path/to/hadoop/conf/>

    5. 从 Google 的相应页面创建 OAUTH2 密钥 (Google Console-&gt; API-Manager-&gt; Credentials)。

    6. 将凭据复制到core-site.xml 文件。

    替代方案 1:您可以将 jar 存储在任何文件夹中并将该文件夹添加到 spark 类路径中,而不是将文件复制到 $SPARK/jars 文件夹。一种方法是在 spark-env.sh``folder butSPARK_CLASSPATH` 中编辑 SPARK_CLASSPATH 现在已弃用。因此,可以查看here 了解如何在 spark 类路径中添加 jar

    <configuration>
        <property>
            <name>fs.gs.impl</name>
            <value>com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem</value>
            <description>Register GCS Hadoop filesystem</description>
        </property>
        <property>
            <name>fs.gs.auth.service.account.enable</name>
            <value>false</value>
            <description>Force OAuth2 flow</description>
         </property>
         <property>
            <name>fs.gs.auth.client.id</name>
            <value>32555940559.apps.googleusercontent.com</value>
            <description>Client id of Google-managed project associated with the Cloud SDK</description>
         </property>
         <property>
            <name>fs.gs.auth.client.secret</name>
            <value>fslkfjlsdfj098ejkjhsdf</value>
            <description>Client secret of Google-managed project associated with the Cloud SDK</description>
         </property>
         <property>
            <name>fs.gs.project.id</name>
            <value>_THIS_VALUE_DOES_NOT_MATTER_</value>
            <description>This value is required by GCS connector, but not used in the tools provided here.
      The value provided is actually an invalid project id (starts with `_`).
          </description>
       </property>
    </configuration>
    

    【讨论】:

    • 我按照所有步骤操作,但在 pyspark 中出现以下错误:Py4JJavaError: An error occurred while calling z:org.apache.hadoop.fs.FileSystem.get. : java.io.IOException: No FileSystem for scheme: gs 我担心 pyspark 无法运行 spark-env.cmd(我使用的是 Windows)。检查 core-site.xml 是否被拾取会有所帮助,但我不知道如何......
    • 可能 spark-instance 找不到驱动。
    【解决方案3】:

    考虑到距离上一个答案已经有一段时间了,我想分享一下我最近的解决方案。请注意,以下说明适用于 Spark 2.4.4。

    1. 为您从here 获得的 Spark/Hadoop 类型下载“gcs-connector”。搜索“其他 Spark/Hadoop 集群”主题。
    2. 将“gcs-connector”移动到 $SPARK_HOME/jars。在下面查看有关 $SPARK_HOME 的更多信息。
    3. 确保为 Spark 应用程序运行正确设置了所有环境变量。这是:
      一种。 SPARK_HOME 指向您保存 Spark 安装的位置。
      湾。 GOOGLE_APPLICATION_CREDENTIALS 指向 json 键所在的位置。如果您刚刚下载它,它将在您的 ~/Downloads
      C。 JAVA_HOME 指向您拥有 Java 8*“Home”文件夹的位置。

      如果您使用的是 Linux/Mac OS,则可以使用 export VAR=DIR,其中 VAR 是变量,DIR 是位置,或者如果您想永久设置它们,您可以将它们添加到 ~/.bash_profile 或 ~/。 zshrc 文件。 对于 Windows 操作系统用户,在 cmd 中写入 set VAR=DIR 用于 shell 相关操作,或 setx VAR DIR 以永久存储变量。

    这对我有用,我希望它也能帮助其他人。

    * Spark 在 Java 8 上运行,因此它的某些功能可能与最新的 Java 开发工具包不兼容。

    【讨论】:

      【解决方案4】:

      尝试使用 PySpark 进行以下配置。 JARS_PATH 是一个字符串变量,包含 jar 文件的绝对路径。请务必设置所需的环境变量。

      from pyspark.sql import SparkSession
          
      JARS_PATH = '/LOCATION-TO-JARS/gcs-connector-hadoop3-latest.jar,/LOCATION-TO-JARS/spark-bigquery-latest_2.12.jar'
      
      spark = sparkSession.builder.appName(SPARK_APP_NAME).config('spark.jars’,JARS_PATH).getOrCreate()
          spark._jsc.hadoopConfiguration().set('fs.gs.impl', 'com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem')
          spark._jsc.hadoopConfiguration().set('fs.gs.auth.service.account.enable', 'ture')
          spark._jsc.hadoopConfiguration().set('fs.gs.project.id', ‘MY-GCP-PROJECT-ID’)
          spark._jsc.hadoopConfiguration().set("fs.AbstractFileSystem.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-22
        • 2015-03-03
        • 2018-01-25
        • 2016-11-02
        • 1970-01-01
        • 2018-02-07
        • 2018-11-20
        • 2019-11-17
        相关资源
        最近更新 更多