Windows平台下Intellij环境下配置hadoop开发环境踩坑记录

2年前学习的时候都是听说搞Hadoop开发,最好都在Linux下进行,这到了单位办公室...毕竟公家的电脑,不太方便随便换系统,用了一遍Windows对比以后是确实会稍微搞得麻烦一点。

那么进入正题,首先说明,配置的完整过程就只说明一些对于Windows下配环境需要去关注的地方,完整Hadoop配置指南建议查看官方Wiki查看步骤。

 

本次实验是基于Hadoop-3.3.0平台,由于单位办公电脑配置有限,使用的单结点伪分布式安装于一台ArchLinux虚拟机中,IDE用的是IDEA Intellij 2020.2.4。

 

准备工作:

1、在Windows本地需要放一个和生产环境一样的Hadoop,$HADOOP_HOME/etc/hadoop/下的xml配置文件啥的也要一样。

2、去Github上下载一份WinUtils,和Hadoop版本对应上是最好,如果实在是太新对应不上,也可以试试最接近的那个版本。

 

然后Intellij启动!

创建Maven项目,【File】- 【Project Structure】- 【libraries】导入要用的hadoop的包,可以用Maven下载,或者也可以就直接导本地Hadoop自带的jar。

然后把$HADOOP_HOME/etc/hadoop下的core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml以及log4j.properties放进项目的resources目录,检查一下四个xml中写的是IP地址还是主机名,是主机名的话,要在C:\Windows\System32\drivers\etc\hosts文件中添加ip地址与主机名的对应关系。新建WordCount.java,WordCount标准程序从官方Wiki复制粘贴一下。

代码中会读取几个xml中的配置文件:

Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
// 查看本次运行的MR调度用哪种框架,缺省是local,集群一般会在mapred.xml中配置为yarn
System.out.println("运行框架: " + conf.get("mapreduce.framework.name"));

如果只放core-site.xml也是可以运行的,这样的话是会采用默认配置去运行,有些程序倒是可以正常运行但是运行时可能和集群配置不一样,比较典型的就是在集群mapred-site.xml配置了mapreduce.framework.name的值为yarn,表示运行时后用yarn来调度,运行mapreduce会动用集群中的多个节点参与计算,不放mapred-site.xml则是用默认的local模式运行,并不会动用集群,然后程序中的提示:The url to track the job:http://localhost:8080也是不太对的,用yarn来调度正常情况应该是:The url to track the job: http://vm01:8088/proxy/application_1608801088437_0005/。

首次启动,遇到HADOOP_HOME and hadoop.home.dir are unset 报错:

这个和环境变量有关,Windows平台上的hadoop也给配个环境变量就好了,或者不配环境变量但在程序中代码定义:

System.setProperty("hadoop.home.dir", "D:/hadoop");

 

Did not find winutils.exe的报错:

这就是Windows平台下hadoop的bin目录需要放入winutils那一些东西,把从github上面下载的winutils解压放入,hadoop.dll放入到C:\Windows\System32中,即可解决。

 

Exception message: /bin/bash: line 0: fg: no job control的报错:

这是跨平台的问题

方法1、修改Hadoop集群mapred-site.xml,开启跨平台提交配置项:

<property>
        <name>mapreduce.app-submission.cross-platform</name>
        <value>true</value>
</property>

方法2、程序代码中添加:

conf.set("mapreduce.app-submission.cross-platform","true");

 

Permission denied: user=aaa, access=WRITE, inode="/":bbb:supergroup:drwxr-xr-x 报错:

HDFS文件写入删除修改的时候容易遇到,Windows下用户名和Hadoop用户名不一样导致的权限问题,比较简单的做法可以在运行时添加参数-DHADOOP_USER_NAME=<你的用户名>

 

Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class WordCount$TokenizerMapper not found 报错:

这个问题是直接在Windows的Intellij上启动的时候会产生报错,如果是按照官方wiki的步骤在服务器端编译打包成jar再用hadoop运行,倒是不会出现这个报错,这说明服务端的配置是没有问题的。这个TokenizerMapper也是在程序中有定义了的,不可能说找不到。再倒回来仔细看看提示信息发现有一条:WARN mapreduce.JobResourceUploader: No job jar file set.  User classes may not be found. See Job or Job#setJar(String).。这就印证了一个猜想,程序还是在本地运行还没有打包成jar分发给各个节点去运行,hadoop是通过HDFS分布式存储数据,计算任务向数据靠拢,即是把程序分发到各节点去运行,所以如果想在Windows本地提交Job到集群运行,解决方法重点就是要打包成jar,另外代码中要加入一行说明本次提交job的jar包位置:

job.setJar("C:\\Users\\<用户名>\\IntelliJIDEAProjects\\WordCount\\out\\artifacts\\WordCount_jar");
//job.setJarByClass(WordCount.class);

或者:

conf.set("mapreduce.job.jar", "out/artifacts/WordCount_jar/WordCount.jar");

【Build】 - 【Build Artifacts】 - 【build】

这样一通操作下来,就能成功在Windows平台下给Hadoop提交Job运行Hello worl......哦不对,WordCount了!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值