Java Spark禁用Hadoop发现

时间:2018-06-20 08:27:11

标签: java apache-spark hadoop

我当前正在运行使用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功能)? / p>

NB (用于测试)。

感谢您的回答!

3 个答案:

答案 0 :(得分:1)

因此,我使用的最后一个“技巧”是sandev和Vipul答案的混合。

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

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

然后,在您的Spark配置中,提供'fake'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发现,但这并不能将其关闭。

答案 1 :(得分:0)

仅需要winutils即可创建一个文件夹示例C:\ hadoop \ bin \ winutils.exe 并定义inveroiment变量HADOOP_HOME = C:\ hadoop并追加到路径变量C:\ hadoop \ bin。那么您就可以使用spark功能

答案 2 :(得分:0)

这不是因为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

  3. 内创建一个名为 bin 的新目录
  4. 在您的代码中,在创建上下文之前添加此行。

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

专业提示,切换到使用Scala。并不是必须这样做,而是在这里让火花最有宾至如归的感觉,不需要花费一两天的时间就可以使基本程序正确运行。