在本地运行spark作业时“没有用于Scheme的文件系统:gs”

Yan*_*eld 7 hadoop google-cloud-storage apache-spark google-hadoop google-cloud-dataproc

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

在Mac机器上本地运行作业时,出现以下错误:

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

我知道要支持gs路径,需要做2件事。一种是安装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>
Run Code Online (Sandbox Code Playgroud)

我认为我的问题来自这样一个事实,即我不确定在此本地模式下确切需要在哪里配置每个组件。在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>
Run Code Online (Sandbox Code Playgroud)

和Hadoop 1.2.1,如下所示:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>1.2.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

Art*_*ike 7

在 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")
Run Code Online (Sandbox Code Playgroud)


Dan*_*bos 1

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

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

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