项目要使用spark查询ElasticSearch中的数据。在使用spark时(创建spark context)出现这样一个错误:
ERROR 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.
Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
无法定位可执行文件winutil。在使用spark开发时用到了hadoop工具,而Hadoop运行在Linux下。所以需要使用winutils插件
Hadoop下载页面 : https://hadoop.apache.org/releases.html
下载后,将其解压。需要注意的是:路径中不允许包含空格、中文符号、制表符等文字符号。
版本需要与 winutils 仓库(https://github.com/steveloughran/winutils)中所支持的版本对应,所以不要追逐最新版本~
如果需要选择其他版本,以下页面可供参考:https://www.apache.org/dyn/closer.cgi/hadoop/common
访问 winutils 的 github仓库:https://github.com/steveloughran/winutils
选择下载文件(Clone or download -> Download ZIP)
或者直接本地 git clone https://github.com/steveloughran/winutils.git
选择对应的版本文件夹,拖动合并文件夹。
我的版本是2.8.3,我会将仓库中的hadoop-2.8.3文件夹和本地的hadoop-2.8.3文件夹合并。如有冲突的重名文件,需要保留winutils文件夹中文件。
修改Hadoop配置文件,搭建本地Hadoop环境:
(1) 配置hdfs的默认端口: 修改 Hadoop2.8.3/etc/hadoop/core-site.xml
,加入
fs.defaultFS
hdfs://localhost:9000
(2) 修改namenode、datanode数据路径以及数据备份副本数:修改 Hadoop2.8.3/etc/hadoop/hdfs-site.xml
,加入
注:
默认windows本地运行,所以这里设置副本数为1
dfs.replication
1
dfs.namenode.name.dir
file:/hadoop/data/dfs/namenode
dfs.datanode.data.dir
file:/hadoop/data/dfs/datanode
(3) 修改资源调配框架相关配置,我们只需要设置MapReduce使用的框架就成,修改 Hadoop2.8.3/etc/hadoop/mapred-site.xml
,加入
注:
1.如果已存在mapred-site.xml,直接修改;如不存在,复制mapred-site.xml.template为mapred-site.xml即可
2.我这里设置 yarn,有别的需求请自行修改
mapreduce.framework.name
yarn
(4) 由于(3)中设置yarn为资源管理器,所以需要配置yarn,修改Hadoop2.8.3/etc/hadoop/yarn-site.xml
,加入
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler
(5) Hadoop-2.8.3/etc/hadoop-env.cmd
修改(可使用sublime打开):
设置JDK路径,路径不可以有空格
修改JAVA_HOME:
set JAVA_HOME=D:\Env\Java\jdk1.8.0_221
(6) 进入Hadoop-2.8.3\bin
目录,格式化hdfs:
打开Windows Powershell(或者cmd),
cd Hadoop-2.8.3\bin
.\hdfs.cmd namenode -format
(7)进入Hadoop-2.8.3\sbin
目录,修改Hadoop启动脚本start-all.cmd
(可使用sublime打开):
在第一行加入一句“cd Hadoop-2.8.3\bin
”
(8)启动Hadoop集群:
进入Hadoop-2.8.3\sbin
目录,执行.\start-all.cmd
运行集群时,请不要关闭弹出的cmd
结果验证:
打开http://localhost:8088
查看集群状态
打开http://localhost:50070
可以查看到hadoop运行状态,包括hdfs等信息。
测试结束后,可以执行.\end-all.cmd
关闭hadoop集群。
为解决IDE中报错问题,还需要添加系统环境变量:
编辑系统变量,如已添加,请自行确定是否需要修改或添加:
变量名 | 变量值 |
---|---|
JAVA_HOME | D:\Env\Java\jdk1.8.0_221 |
HADOOP_HOME | D:\Env\Hadoop\hadoop-2.8.3 |
CLASSPATH | D:\Env\Hadoop\hadoop-2.8.3\bin\winutils.exe |
PATH | 向PATH后追加%JAVA_HOME/bin% %HADOOP_HOME/bin% |
重新启动Windows。
结果验证:
Windows powershell hadoop version
命令有效,显示hadoop版本2.8.3。