Idea中开发spark程序(win10), Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

idea中是可以不在本地安装spark,通过引用spark相关jar包(pom工程(推荐)或直接手工下载引入)而直接运行spark相关程序。

但如果在本地不安装hodoop,SparkSession的创建,就会报如下错误:

    val conf = new SparkConf()
      .setMaster("local")
      .setAppName("featureEngineering")
      .set("spark.submit.deployMode", "client")

    val spark = SparkSession.builder.config(conf).getOrCreate()//报错语句

22/07/06 17:11:00 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.
	at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:382)
	at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:397)
	at org.apache.hadoop.util.Shell.<clinit>(Shell.java:390)
	at org.apache.hadoop.util.StringUtils.<clinit>(StringUtils.java:80)
	at org.apache.hadoop.security.SecurityUtil.getAuthenticationMethod(SecurityUtil.java:610)
	at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:277)
	at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:265)
	at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:810)
	at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:780)
	at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:653)
	at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2422)
	at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2422)
	at scala.Option.getOrElse(Option.scala:121)
	at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2422)
	at org.apache.spark.SparkContext.<init>(SparkContext.scala:293)
	at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2520)
	at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:935)
	at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:926)
	at scala.Option.getOrElse(Option.scala:121)
	at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:926)
	at com.sparrowrecsys.offline.spark.featureeng.FeatureEngineering$.main(FeatureEngineering.scala:100)
	at com.sparrowrecsys.offline.spark.featureeng.FeatureEngineering.main(FeatureEngineering.scala)

然而,如果不涉及从hdfs获取文件,这个不错并不影响后续spark任务的进行(如df.show()等)。

解决方法

一、直接下载winutils

由于 Windows 不支持 HDFS,因此我们在 Windows 本地运行 MapReduce 程序时需要使用 winutils.exe 文件(winutils.exe 提供了一个包装器)。winutils.exe是在Windows系统上需要的hadoop调试环境工具,里面包含一些在Windows系统下调试hadoop、spark所需要的基本的工具类,该错误就是因为读取不到winutils.exe(最好再带上hadoop.dll,不然使用hdfs还会有其他错误,见文末)。

  • 方法1.1:若已安装hadoop:将winutils里面hadoop-(自己的版本)/bin下的winutils.exe和 hadoop.dll下载,并复制到HADOOP_HOME\bin下(选好自己的hadoop版本)。不过,按道理,如果能成功安装hadoop,也不会报错了。(原因见二)
  • 方法1.2:直接的方法:直接取winutils.exe
  • 方法1.3:下载common包解决(原理也是让path的HADOOP_HOME/bin下有winutils.exe和 hadoop.dll):如hadoop-common-2.2.0
二、 (推荐)在Windows本地安装hadoop(可不用方法一)

安装hadoop不但能解决上面的问题,还可以进行hdfs相关的开发。因为idea无法像spark那样,不安装hadoop而进行hdfs相关操作。

(1) 获取安装包 下载hadoop-2.7.7.tar.gz,(自行选择自己需要的版本)
(2) 解压到目录
(3) 环境变量设置

  • 添加HADOOP_HOME系统变量为解压目录(如D:\softwares\hadoop-2.7.7
  • 系统变量Path添加 %HADOOP_HOME%;%HADOOP_HOME%\bin;

(4) 获取winutils.exe 和 hadoop.dll(该步骤解决文章最开始的报错
winutils里面hadoop-2.7.7/bin下的winutils.exe和 hadoop.dll下载,并复制到D:\softwares\hadoop-2.7.7\bin下(选好自己的hadoop版本)。
不做这一步的话,在格式化系统的时候,会报一同样的问题。

(5) 配置文件修改(不改会出现Failed to start namenode等问题)

  • $HADOOP_HOME目录下 \etc\hadoop\hadoop-env.cmd 文件
    将JAVA_HOME修改为自己机器的目录JAVA_HOME=D:\softwares\Java\jdk1.8.0_131
  • 编辑“D:\softwares\hadoop-2.7.7\etc\hadoop”下的core-site.xml文件,将下列文本粘贴进去,并保存;
<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/D:/softwares/hadoop-2.7.7/workplace/tmp</value>
    </property>
    <property>
        <name>dfs.name.dir</name>
        <value>/D:/softwares/hadoop-2.7.7/workplace/name</value>
    </property>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>
  • 编辑“D:\softwares\hadoop-2.7.7\etc\hadoop”目录下的mapred-site.xml(没有就将mapred-site.xml.template重命名为mapred-site.xml)文件,粘贴一下内容并保存:
<configuration>
    <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
    </property>
    <property>
       <name>mapred.job.tracker</name>
       <value>hdfs://localhost:9001</value>
    </property>
</configuration>
  • 编辑“D:\softwares\hadoop-2.7.7\etc\hadoop”目录下的hdfs-site.xml文件,粘贴以下内容并保存。
<configuration>
 <!-- 这个参数设置为1,因为是单机版hadoop -->
 <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/D:/softwares/hadoop-2.7.7/workplace/data/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/D:/softwares/hadoop-2.7.7/workplace/data/datanode</value>
    </property>
</configuration>
  • 编辑“D:\hadoop-2.7.5\etc\hadoop”目录下的yarn-site.xml文件,粘贴以下内容并保存;
<configuration>
    <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
    </property>
    <property>
       <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
       <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
</configuration>

(6) 格式化系统文件:
进入到hadoop–>bin目录下,shift+右键 打开命令行…win8的话建议使用管理员运行cmd


hdfs namenode -format //格式化hdfs
cd xx/hadoop-2.7.7/sbin //进入到sbin目录下
start-dfs.cmd   //先启动dfs,访问:http://localhost:50070,有绿色界面则说明安装hadoop成功
start-yarn.cmd  //再启动yarn,访问:http://localhost:8088 ,任务管理界面
//或者
//start-all.cmd //相当于以上的两条命令

对于安装hadoop,网上有些教程说要弄一个- hadooponwindows-master.zip的bin到hadoop/bin下面,实际上就是为了把winutils.exe和 hadoop.dll放到hadoop/bin下,可对比两个bin的文件可知:
winutils
hadooponwindows

教程1教程2

推荐安装Big Data Tools

安装好后,推荐继续安装idea的Big Data Tools插件:Big Data Tools完整攻略,一键连接Hadoop。(附:官方介绍

配置window系统的hdfs:
Authentication type:Configuration files directory
路径填:D:\softwares\hadoop-2.7.7\etc\hadoop

test connecction可能遇到的问题:Home info is not found
说明: 这个问题是big data tools 的一个小bug,它需要远程连接的hdfs节点的内容不能为空,所以在远程的hdfs创建一个文件夹就好了,cmd中输入:
hdfs dfs -mkdir /test

其他问题

如果步骤二.4仍然解决不了如下问题,那么可能是系统问题,这时可以将 hadoop.dll 拷贝到 C:/Windows/System32 目录下。

(启动hadoop时缺少hadoop.dll会报如下错误)

22/07/07 10:02:14 FATAL datanode.DataNode: Exception in secureMain
java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
        at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)
        at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:609)
        at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:988)
        at org.apache.hadoop.util.DiskChecker.checkAccessByFileMethods(DiskChecker.java:187)
        at org.apache.hadoop.util.DiskChecker.checkDirAccess(DiskChecker.java:174)
        at org.apache.hadoop.util.DiskChecker.checkDir(DiskChecker.java:157)
        at org.apache.hadoop.hdfs.server.datanode.DataNode$DataNodeDiskChecker.checkDir(DataNode.java:2385)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.checkStorageLocations(DataNode.java:2427)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:2409)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:2301)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:2348)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:2530)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:2554)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值