【问题标题】:Java Spark disable Hadoop discoveryJava Spark 禁用 Hadoop 发现
【发布时间】:2018-06-21 16:56:05
【问题描述】:

我目前正在运行一个使用 Spark 的 Java 应用程序。

一切正常,除了在 SparkContext 的初始化。 此时,Spark 尝试在我的系统上发现 Hadoop,并抛出错误,因为我没有并且我不想安装 Hadoop:

2018-06-20 10:00:27.496 ERROR 4432 --- [           main] org.apache.hadoop.util.Shell             : Failed to locate the winutils binary in the hadoop binary path

java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

这是我的 SparkConfig:

SparkConf cfg = new SparkConf();

cfg.setAppName("ScalaPython")
        .setMaster("local")
        .set("spark.executor.instances", "2");

return cfg;

我的 Spark 依赖项:

<!-- Spark dependencies -->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.3.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>${spark.version}</version>
</dependency>

<dependency>
    <groupId>org.datasyslab</groupId>
    <artifactId>geospark_2.3</artifactId>
    <version>1.1.0</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.datasyslab</groupId>
    <artifactId>geospark-sql_2.3</artifactId>
    <version>1.1.0</version>
</dependency>

那么有没有办法以编程方式禁用 Hadoop 发现(即:给 SparkConfig 一个特定的属性),因为这个错误不会阻止 Spark 上下文的创建(我仍然可以使用 Spark 功能)?

注意这是为了测试目的。

感谢您的回答!

【问题讨论】:

标签: java apache-spark hadoop


【解决方案1】:

所以我使用的最后一个“技巧”是 Sandev 和 Vipul 答案的混合。

在您的项目根目录中创建一个“假”winutils:

mkdir <java_project_root>/bin
touch <java_project_root>/bin/winutils.exe

然后,在您的 Spark 配置中,提供“假”HADOOP_HOME:

 public SparkConf sparkConfiguration() {
    SparkConf cfg = new SparkConf();
    File hadoopStubHomeDir = new File(".");

    System.setProperty("hadoop.home.dir", hadoopStubHomeDir.getAbsolutePath());
    cfg.setAppName("ScalaPython")
            .setMaster("local")
            .set("spark.executor.instances", "2");

    return cfg;
}

但是,避免 Hadoop 发现仍然是一个“技巧”,但它不会将其关闭。

【讨论】:

  • 应该有一个启动标志来简单地禁用对 Hadoop-bin 的检查。
【解决方案2】:

只需 spark 需要 winutils 只需创建一个文件夹示例 C:\hadoop\bin\winutils.exe 并定义inveroiment变量HADOOP_HOME = C:\hadoop并附加到路径变量C:\hadoop\bin。然后你可以使用spark功能

【讨论】:

  • 所以我把一个空白文件作为 winutils.exe 并且它工作了,不再显示丑陋的堆栈跟踪。但我正在寻找一个programmatic 解决方案,例如提供给 Spark 以禁用 Hadoop 发现的属性。
【解决方案3】:

这不是因为 spark 想要安装 hadoop,或者它只是想要那个特定的文件。

首先,您必须使用 spark-submit 运行代码,您这样做了吗?请坚持将其作为第一种方法,因为这会产生与列表库相关的问题。 完成后,您可以将其添加到您的 pom 文件中以便能够直接从 IDE 运行它,我使用 IntelliJ 但也应该在 eclipse 上工作

<dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.6.5</version>
</dependency>

第二,如果还是不行的话:

  1. http://public-repo-1.hortonworks.com/hdp-win-alpha/winutils.exe下载winutils文件。

  2. some_other_directory 中创建一个名为 bin 的新目录

  3. 在您的代码中,在创建上下文之前添加这一行。

    System.setProperty("hadoop.home.dir", "some_other_directory 的完整路径");

专业提示,切换到使用 Scala。并不是说它是必需的,但这是 spark 感觉最自在的地方,您只需一两天即可让基本程序正常运行。

【讨论】:

  • 如果我理解您的 First 选项,我必须有一个正在运行的 Spark 集群,而这里不是这种情况。 Second 选项正在工作,正如sandev answer中已经通知的那样,但我必须在Java项目之外配置东西,我不希望那样。对于 Scala,我会以这种方式“摆脱”Java,但目前还不是一个选择。
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多