我当前正在运行使用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 (用于测试)。
感谢您的回答!
答案 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>
第二,如果仍然无法运行:
从http://public-repo-1.hortonworks.com/hdp-win-alpha/winutils.exe下载winutils文件。
在 some_other_directory
在您的代码中,在创建上下文之前添加此行。
System.setProperty(“ hadoop.home.dir”,“到some_other_directory的完整路径”);
专业提示,切换到使用Scala。并不是必须这样做,而是在这里让火花最有宾至如归的感觉,不需要花费一两天的时间就可以使基本程序正确运行。