"没有用于Scheme的文件系统:gs"在本地运行火花工作时

时间:2015-01-05 15:41:26

标签: apache-spark hadoop google-cloud-storage google-cloud-dataproc google-hadoop

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

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

  

5932 [main] ERROR com.doit.customer.dataconverter.Phase1 - 日期工作:2014_09_23失败,错误:没有FileSystem for scheme: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服务。

3 个答案:

答案 0 :(得分:2)

有几种方法可以帮助Spark获取相关的Hadoop配置,包括修改${SPARK_INSTALL_DIR}/conf

  1. 将$ {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
    
  2. 较旧的Spark文档解释说,这会自动将xml文件包含在Spark的类路径中:https://spark.apache.org/docs/0.9.1/hadoop-third-party-distributions.html

    1. 使用以下内容向$ {SPARK_INSTALL_DIR} /conf/spark-env.sh添加条目:

      export HADOOP_CONF_DIR=/full/path/to/your/hadoop/conf/dir
      
    2. 较新的Spark文档似乎表明这是首选的方法:https://spark.apache.org/docs/1.1.0/hadoop-third-party-distributions.html

答案 1 :(得分:2)

在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")

答案 2 :(得分:0)

我无法说出错误,但这就是我要尝试的内容。

  • 尝试设置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。