Java Spark禁用Hadoop发现
我目前正在运行一个使用Spark的Java应用程序 除了SparkContext的初始化之外,一切都正常。 此时,Spark尝试在我的系统上发现Hadoop,并抛出错误,因为我没有,也不想安装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
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;
}