【发布时间】:2017-04-04 14:31:28
【问题描述】:
问题很简单:你有一个本地 spark 实例(集群或者只是在本地模式下运行)并且你想从 gs://
【问题讨论】:
标签: apache-spark google-cloud-storage google-cloud-platform
问题很简单:你有一个本地 spark 实例(集群或者只是在本地模式下运行)并且你想从 gs://
【问题讨论】:
标签: apache-spark google-cloud-storage google-cloud-platform
在我的 Spark 2.4.3 上,我需要执行以下操作才能从 Spark 本地启用 GCS 访问。我使用的是 JSON 密钥文件,而不是上面建议的 client.id/secret。
在$SPARK_HOME/jars/ 中,使用此处的阴影gcs-connector jar:http://repo2.maven.org/maven2/com/google/cloud/bigdataoss/gcs-connector/hadoop2-1.9.17/,否则我会因传递依赖而出现各种故障。
(可选)给我的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")
在$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
一切正常。
【讨论】:
我在这里提交我通过结合不同资源提出的解决方案:
下载谷歌云存储连接器:gs-connector并将其存储在$SPARK/jars/文件夹中(勾选底部的Alternative 1)
从here 下载core-site.xml 文件,或从下方复制。这是hadoop使用的配置文件(spark使用的)。
将core-site.xml 文件存储在一个文件夹中。我个人创建了$SPARK/conf/hadoop/conf/ 文件夹并将其存储在那里。
在 spark-env.sh 文件中通过添加以下行来指明 hadoop conf 文件夹:export HADOOP_CONF_DIR=
=</absolute/path/to/hadoop/conf/>
从 Google 的相应页面创建 OAUTH2 密钥 (Google Console-> API-Manager-> Credentials)。
将凭据复制到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>
【讨论】:
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 2.4.4。
确保为 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 开发工具包不兼容。
【讨论】:
尝试使用 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")
【讨论】: