从本地spark实例的谷歌存储gs://文件系统中读取

时间:2016-11-21 08:52:52

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

问题很简单:你有一个本地的spark实例(无论是集群还是仅以本地模式运行它),你想要读取gs://

3 个答案:

答案 0 :(得分:4)

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

  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文件。

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

答案 1 :(得分:2)

考虑到上次回答以来已经有一段时间了,尽管我会分享我最近的解决方案。请注意,以下说明适用于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安装的位置。
    b。 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进行与外壳程序相关的操作,或者编写setx VAR DIR永久存储变量。

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

* Spark可在Java 8上运行,因此其某些功能可能与最新的Java Development Kit不兼容。

答案 2 :(得分:1)

就Spark 2.4.3而言,我需要执行以下操作才能从Spark local启用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
    

一切正常。