本地运行 spark 作业时出现“Scheme 没有文件系统:gs”

Posted

技术标签:

【中文标题】本地运行 spark 作业时出现“Scheme 没有文件系统:gs”【英文标题】:"No Filesystem for Scheme: gs" when running spark job locally 【发布时间】:2015-03-03 04:28:32 【问题描述】:

我正在运行一个 Spark 作业(版本 1.2.0),输入是 Google Clous Storage 存储桶中的一个文件夹(即 gs://mybucket/folder)

在我的 Mac 机器上本地运行作业时,我收到以下错误:

5932 [main] 错误 com.doit.customer.dataconverter.Phase1 - 日期:2014_09_23 的作业失败并出现错误:方案没有文件系统:gs

我知道需要做两件事才能支持 gs 路径。一种是安装 GCS 连接器,另一种是在 Hadoop 安装的 core-site.xml 中进行以下设置:

<property>
    <name>fs.gs.impl</name>
    <value>com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem</value>
    <description>The FileSystem for gs: (GCS) uris.</description>
</property>
<property>
    <name>fs.AbstractFileSystem.gs.impl</name>
    <value>com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS</value>
    <description>
     The AbstractFileSystem for gs: (GCS) uris. Only necessary for use with Hadoop 2.
    </description>
</property>

我认为我的问题来自于我不确定在这个本地模式下每个部分到底需要在哪里配置。在Intellij项目中,我使用的是Maven,所以导入了spark库如下:

<dependency> <!-- Spark dependency -->
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.10</artifactId>
    <version>1.2.0</version>
    <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
        </exclusion>
    </exclusions>
</dependency>

和 Hadoop 1.2.1 如下:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>1.2.1</version>
</dependency>

问题是,我不确定为 Spark 配置 hadoop 位置的位置,以及配置 hadoop conf 的位置。因此,我可能会添加到错误的 Hadoop 安装中。另外,修改文件后有什么需要重启的吗?据我所知,我的机器上没有运行 Hadoop 服务。

【问题讨论】:

【参考方案1】:

在 Scala 中,在设置 hadoopConfiguration 时添加以下配置:

val conf = sc.hadoopConfiguration
conf.set("fs.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem")
conf.set("fs.AbstractFileSystem.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS")

【讨论】:

非常优雅。您可能需要为最新的谷歌云存储连接器添加一些adequate dependency 才能实现这一点。【参考方案2】:

有几种方法可以帮助 Spark 获取相关的 Hadoop 配置,都涉及修改 $SPARK_INSTALL_DIR/conf

    将您的 $HADOOP_HOME/conf/core-site.xml 复制或符号链接到 $SPARK_INSTALL_DIR/conf/core-site.xml。例如,当bdutil 安装到 VM 上时,它会运行:

    ln -s $HADOOP_CONF_DIR/core-site.xml $SPARK_INSTALL_DIR/conf/core-site.xml
    

较早的 Spark 文档解释说,这会使 xml 文件自动包含在 Spark 的类路径中:https://spark.apache.org/docs/0.9.1/hadoop-third-party-distributions.html

    向 $SPARK_INSTALL_DIR/conf/spark-env.sh 添加一个条目:

    export HADOOP_CONF_DIR=/full/path/to/your/hadoop/conf/dir
    

较新的 Spark 文档似乎表明这是未来的首选方法:https://spark.apache.org/docs/1.1.0/hadoop-third-party-distributions.html

【讨论】:

但是当我使用 Spark Maven 组件时,Spark 安装目录是什么? 啊,我明白了,如果您直接从 Maven 项目中运行,您实际上只需要在通过普通的 Maven 方法在别处提到的类路径,即将这两个文件添加到您的 src/main/resources 目录。编辑:按回车键太早,这里是一篇博客文章的链接,描述了使用 Maven 进行仅 Hadoop 配置的类似情况:jayunit100.blogspot.com/2013/06/… 将 core-site.xml/hdfs-site.xml 添加到类路径后,现在我在执行 sc = new JavaSparkContext(conf); 时收到以下错误- java.lang.ClassNotFoundException:org.apache.hadoop.fs.LocalFileSystem。我得到了这个,即使我的类路径中有 hadoop-core.jar 版本 1.2.1。 如果您使用mvn exec:java 运行,那么您确实希望依赖项正确存在,但如果您正在使用mvn package 并且只运行jarfile,则必须明确确保对你的类路径的正确依赖。通常,您可能想要构建一个“uberjar”,它将所有传递依赖项捆绑到一个可以运行而无需处理类路径的 jar 中。请参阅此页面:maven.apache.org/plugins/maven-shade-plugin/examples/… - 第二个示例与您需要的类似,您可以尝试复制/粘贴到您的 pom.xml 中【参考方案3】:

我不能说出了什么问题,但这是我会尝试的。

尝试设置fs.gs.project.id:&lt;property&gt;&lt;name&gt;fs.gs.project.id&lt;/name&gt;&lt;value&gt;my-little-project&lt;/value&gt;&lt;/property&gt; 打印sc.hadoopConfiguration.get(fs.gs.impl) 以确保您的core-site.xml 正在加载。在驱动程序和执行程序中打印它:println(x); rdd.foreachPartition _ =&gt; println(x) 确保将 GCS jar 发送到执行程序 (sparkConf.setJars(...))。我认为这在本地模式下无关紧要(都是一个 JVM,对吗?),但你永远不知道。

除了您的程序需要重新启动之外,什么都没有。没有 Hadoop 进程。在本地和独立模式下,Spark 仅使用 Hadoop 作为库,我认为仅用于 IO。

【讨论】:

我尝试了你的建议。似乎添加项目 id 属性没有影响。关于 fs.gs.impl,我可以确认该值为 null,所以这可能是问题的原因,但我不知道为什么。我什至尝试通过代码设置它: conf.set("fs.gs.impl", com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem.class.getName());但这并没有改变任何事情。我可以在 API 中调用以获取 hadoop 文件夹路径吗?也许它指向错误的 Hadoop 发行版,而不是我设置 conf 的那个 我认为core-site.xmlconf/core-site.xml 需要在类路径中。 将 core-site.xml/hdfs-site.xml 添加到类路径后,现在我在执行 sc = new JavaSparkContext(conf); 时收到以下错误- java.lang.ClassNotFoundException:org.apache.hadoop.fs.LocalFileSystem。我得到了这个,即使我的类路径中有 hadoop-core.jar 版本 1.2.1。 在我的项目中,该类来自hadoop-common-2.2.0.jar

以上是关于本地运行 spark 作业时出现“Scheme 没有文件系统:gs”的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache Hadoop 上运行具有本地性质的 Spark 查询时出现数据局部性问题

注册 UDF 时出现 Spark 错误:不支持 AnyRef 类型的架构

通过 Spark 运行时出现 Sqoop 错误

从 apache Spark 运行 java 程序时出现 ClassNotFound 异常

写入 Bigtable 时出现问题

运行Spark测试时出现ClassCastException