从本地 spark 实例读取 google 存储 gs:// 文件系统
Reading from google storage gs:// filesystem from local spark instance
问题很简单:你有一个本地 spark 实例(集群或者只是 运行 它处于本地模式)并且你想从 gs://
读取
我在这里提交我结合不同资源得出的解决方案:
下载 google 云存储连接器:gs-connector 并将其存储在 $SPARK/jars/
文件夹中(勾选 备选方案 1在底部)
从here下载core-site.xml
文件,或从下面复制。这是hadoop使用的配置文件,(spark使用的)。
将 core-site.xml
文件存储在文件夹中。我个人创建了 $SPARK/conf/hadoop/conf/
文件夹并将其存储在那里。
在 spark-env.sh 文件中,通过添加以下行指示 hadoop conf fodler:export HADOOP_CONF_DIR=
=</absolute/path/to/hadoop/conf/>
从 Google (Google Console-> API-Manager-> Credentials
) 的相应页面创建一个 OAUTH2 密钥。
将凭据复制到 core-site.xml
文件。
备选方案 1:不是将文件复制到 $SPARK/jars
文件夹,而是可以将 jar 存储在任何文件夹中,然后将该文件夹添加到 spark 类路径中。一种方法是在 spark-env.sh``folder but
SPARK_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
。
在 $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
一切正常。
考虑到距离上次回答已经有一段时间了,我想分享一下我最近的解决方案。请注意,以下说明适用于 Spark 2.4.4。
- 从 here 下载 Spark/Hadoop 类型的 "gcs-connector"。搜索 "Other Spark/Hadoop clusters" 主题。
- 将"gcs-connector"移动到$SPARK_HOME/jars。请参阅下面有关 $SPARK_HOME 的更多信息。
确保为您的 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")
问题很简单:你有一个本地 spark 实例(集群或者只是 运行 它处于本地模式)并且你想从 gs://
读取我在这里提交我结合不同资源得出的解决方案:
下载 google 云存储连接器:gs-connector 并将其存储在
$SPARK/jars/
文件夹中(勾选 备选方案 1在底部)从here下载
core-site.xml
文件,或从下面复制。这是hadoop使用的配置文件,(spark使用的)。将
core-site.xml
文件存储在文件夹中。我个人创建了$SPARK/conf/hadoop/conf/
文件夹并将其存储在那里。在 spark-env.sh 文件中,通过添加以下行指示 hadoop conf fodler:
export HADOOP_CONF_DIR= =</absolute/path/to/hadoop/conf/>
从 Google (
Google Console-> API-Manager-> Credentials
) 的相应页面创建一个 OAUTH2 密钥。将凭据复制到
core-site.xml
文件。
备选方案 1:不是将文件复制到 $SPARK/jars
文件夹,而是可以将 jar 存储在任何文件夹中,然后将该文件夹添加到 spark 类路径中。一种方法是在 spark-env.sh``folder but
SPARK_CLASSPATH` 中编辑 SPARK_CLASSPATH
现在已弃用。因此,可以查看
<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
。
在
$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
一切正常。
考虑到距离上次回答已经有一段时间了,我想分享一下我最近的解决方案。请注意,以下说明适用于 Spark 2.4.4。
- 从 here 下载 Spark/Hadoop 类型的 "gcs-connector"。搜索 "Other Spark/Hadoop clusters" 主题。
- 将"gcs-connector"移动到$SPARK_HOME/jars。请参阅下面有关 $SPARK_HOME 的更多信息。
确保为您的 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")