从本地 spark 实例读取 google 存储 gs:// 文件系统

Reading from google storage gs:// filesystem from local spark instance

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

读取

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

  1. 下载 google 云存储连接器:gs-connector 并将其存储在 $SPARK/jars/ 文件夹中(勾选 备选方案 1在底部)

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

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

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

  5. 从 Google (Google Console-> API-Manager-> Credentials) 的相应页面创建一个 OAUTH2 密钥。

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

备选方案 1:不是将文件复制到 $SPARK/jars 文件夹,而是可以将 jar 存储在任何文件夹中,然后将该文件夹添加到 spark 类路径中。一种方法是在 spark-env.sh``folder butSPARK_CLASSPATH` 中编辑 SPARK_CLASSPATH 现在已弃用。因此,可以查看 如何在 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>

在我的 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
    

一切正常。

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

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

    如果你在 Linux/Mac OS 你可以使用 export VAR=DIR,其中 VAR 是可变的,DIR 是位置,或者如果你想永久设置它们,你可以添加他们到 ~/.bash_profile 或 ~/.zshrc 文件。 对于WindowsOS用户,在cmd中写set VAR=DIR进行shell相关操作,或者setx VAR DIR永久保存变量。

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

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

尝试使用 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")