11

我正在运行 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 服务。

4

3 回答 3

10

在 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")
于 2017-03-13T05:50:00.227 回答
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
    

较早的 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
    

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

于 2015-01-07T07:06:27.423 回答
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。

于 2015-01-05T22:14:01.397 回答