Java Spark禁用Hadoop发现

Java Spark禁用Hadoop发现,java,apache-spark,hadoop,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 ha

我目前正在运行一个使用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>

org.apache.spark
spark-core_2.11
2.3.0
org.slf4j
slf4j-log4j12
log4j
log4j
org.apache.spark
spark-sql_2.11
${spark.version}
org.datasyslab
地球公园2.3
1.1.0
假如
org.datasyslab
geospark-sql_2.3
1.1.0
那么,有没有一种方法可以通过编程禁用Hadoop发现(即:为SparkConfig指定一个特定属性),因为此错误不会阻止Spark上下文创建(我仍然可以使用Spark功能)

N.B.用于测试目的


谢谢你的回答

Just spark需要winutils只需创建一个文件夹示例C:\hadoop\bin\winutils.exe
然后定义inveroiment变量HADOOP\u HOME=C:\HADOOP并附加到路径变量C:\HADOOP\bin。然后,您可以使用spark功能,这并不是因为spark希望安装HADOOP,或者只是希望安装特定的文件

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

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

org.apache.hadoop

  • 在其他目录中创建一个名为bin的新目录

  • 在代码中,在创建上下文之前添加这一行

    System.setProperty(“hadoop.home.dir”,“指向某个其他目录的完整路径”)

  • 专业提示,切换到使用Scala。这并不是必须的,但这正是spark感到最自在的地方,你不需要花一两天的时间就能让基本程序正常运行。

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

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

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

    但是,这仍然是一个避免Hadoop发现的“窍门”,但它并没有关闭它。

    可能的重复我想禁用Hadoop发现,而不是找到欺骗Spark的方法。因此,我将一个空白文件作为winutils.exe,它起了作用,不再显示丑陋的堆栈跟踪。但我正在寻找一个编程解决方案,例如,给Spark一个属性来禁用Hadoop发现。第二个选项是有效的,正如sandev answer中已经提到的,但是我必须在Java项目之外进行配置,我不希望这样。对于Scala,我会以这种方式“摆脱”Java,但目前这不是一个选项。应该有一个启动标志来简单地禁用对Hadoop bin的检查。
     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;
    }