在Windows下开发hadoop

友情提示:更多有关大数据、人工智能方面技术文章请关注博主个人微信公众号:高级大数据架构师

1、安装Myeclipse(这还用说嘛???)

2、将hadoop-eclipse-plugin-2.6.0.jar(这个jar百度下应该是有的)这个jar放在Myeclipse的安装目录的plugins

3、在Windows解压hadoop-2.5.0.tar.gz,然后配置hadoop的环境变量(贴两个图上来,就不具体说了,这不就跟配置jdk是一样的嘛~)

4、打开Myeclipse,然后看如下的图

这里只要你有把正确的hadoop-eclipse-plugin-2.6.0.jar放到正确的地方,肯定能够找到这个蓝色小象,然后点开就可以看到

 

5、有了这个窗口之后,要配置hadoop

5、接下来要让Myeclipse连接上我们的HDFS,所以要创建新的连接

 

6、然后连接(连接前,你肯定要开启你的namenode,并且确保他没问题)

 

如果这时候,你连接不上,那肯定是你的主机名,ip,映射啊这些没配置好,那就挺麻烦的了,你要重新配置好这些东西,然后重新格式化你的namenode(这里就不在具体说了)

 

7、好了,连接上了,要开始写代码了

因为代码是用maven管理jar包的,所以还要配置maven

 

8、到这里,恶心的配置已经都配置完了,然后可以创建maven project(quick start)来写代码了

 

 

好,接下来说报错!

首先,贴个自己写的简单代码出来:

 

[java] view plain copy

  1. <span style="font-size:12px;">package com..mapreduce;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.StringTokenizer;  
  5. import org.apache.hadoop.conf.Configuration;  
  6. import org.apache.hadoop.fs.Path;  
  7. import org.apache.hadoop.io.IntWritable;  
  8. import org.apache.hadoop.io.LongWritable;  
  9. import org.apache.hadoop.io.Text;  
  10. import org.apache.hadoop.mapreduce.Job;  
  11. import org.apache.hadoop.mapreduce.Mapper;  
  12. import org.apache.hadoop.mapreduce.Reducer;  
  13. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  14. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  15.   
  16. public class WordCountMapReduce {  
  17.   
  18.     // step 1: Mapper  
  19.     public static class WordCountMapper extends  
  20.             Mapper<LongWritable, Text, Text, IntWritable> {  
  21.         private Text mapOutputKey = new Text();  
  22.         private IntWritable mapOutputValue = new IntWritable(1);  
  23.   
  24.         @Override  
  25.         public void map(LongWritable key, Text value, Context context)  
  26.                 throws IOException, InterruptedException {  
  27.   
  28.             // line value  
  29.             String lineValue = value.toString();  
  30.   
  31.             // spilt  
  32.             // String[] strs = lineValue.split(" ");  
  33.             StringTokenizer stringTokenizer = new StringTokenizer(lineValue);  
  34.             while (stringTokenizer.hasMoreTokens()) {  
  35.                 // set map output key  
  36.                 mapOutputKey.set(stringTokenizer.nextToken());  
  37.   
  38.                 // output  
  39.                 context.write(mapOutputKey, mapOutputValue);  
  40.             }  
  41.             /** 
  42.              * // iterator for (String str : strs) { 
  43.              *  
  44.              * mapOutputKey.set(str); 
  45.              *  
  46.              * context.write(mapOutputKey, mapOutputValue); 
  47.              *  
  48.              * } 
  49.              */  
  50.         }  
  51.     }  
  52.     // step 2: Reducer  
  53.     public static class WordCountReducer extends  
  54.             Reducer<Text, IntWritable, Text, IntWritable> {  
  55.         private IntWritable outputValue = new IntWritable();  
  56.   
  57.         @Override  
  58.         protected void reduce(Text key, Iterable<IntWritable> values,  
  59.                 Context context) throws IOException, InterruptedException {  
  60.             // temp sum  
  61.             int sum = 0;  
  62.             // iterator  
  63.             for (IntWritable value : values) {  
  64.                 sum += value.get();  
  65.             }  
  66.             // set output  
  67.             outputValue.set(sum);  
  68.   
  69.             context.write(key, outputValue);  
  70.         }  
  71.   
  72.     }  
  73.   
  74.     // step 3: Driver  
  75.     public int run(String[] args) throws Exception {  
  76.   
  77.         Configuration configuration = new Configuration();  
  78.   
  79.         Job job = Job.getInstance(configuration, this.getClass()  
  80.                 .getSimpleName());  
  81.         job.setJarByClass(WordCountMapReduce.class);  
  82.   
  83.         // set job  
  84.         // input  
  85.         Path inpath = new Path(args[0]);  
  86.         FileInputFormat.addInputPath(job, inpath);  
  87.   
  88.         // output  
  89.         Path outPath = new Path(args[1]);  
  90.         FileOutputFormat.setOutputPath(job, outPath);  
  91.   
  92.         // Mapper  
  93.         job.setMapperClass(WordCountMapper.class);  
  94.         job.setMapOutputKeyClass(Text.class);  
  95.         job.setMapOutputValueClass(IntWritable.class);  
  96.   
  97.         // Reducer  
  98.         job.setReducerClass(WordCountReducer.class);  
  99.         job.setOutputKeyClass(Text.class);  
  100.         job.setOutputValueClass(IntWritable.class);  
  101.   
  102.         // submit job -> YARN  
  103.         boolean isSuccess = job.waitForCompletion(true);  
  104.         return isSuccess ? 0 : 1;  
  105.     }  
  106.     public static void main(String[] args) throws Exception {  
  107.   
  108.         args = new String[] {  
  109.                 "hdfs://bigdata-03:8020/user/wordcount/input",  
  110.                 "hdfs://bigdata-03:8020/user/wordcount/output6" };  
  111.         // run job  
  112.         int status = new WordCountMapReduce().run(args);  
  113.   
  114.         System.exit(status);  
  115.     }  
  116. }</span>  


第一种类型、出现各种空指针:

 

例如:Exception in thread "main" java.lang.NullPointerException atjava.lang.ProcessBuilder.start(Unknown Source)

An internal error occurred during: "Map/Reducelocation status updater".java.lang.NullPointerException

如果出现这样的问题,就是上文的配置你没配置好,好好检查下!!!!然后在hdfs上创建目录,上传文件试试,如果配置好了,应该不会有这样的问题

 

第二种类型、需要修改源码型:

1、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.

一开始看到这样的报错,我是拒绝的!!这里其实是因为在Windows下面运行mr代码必须有个文件叫做winutil.exe,默认解压的hadoop的bin目录下是没有的,自己下载一个然后放到hadoop目录的bin当中,程序会根据HADOOP_HOME找到bin目录下面的winutil.exe,但是有时候其实你都配置好了,它还报这个错,我就想打爆他的狗头,这时候就要修改源码了(看看源码是哪里获取的,你去手动写一个你正确的路径)

那么到底在源码的哪里呢?

在hadoop-common-2.5.0.jar这个jar包当中的org.apache.hadoop.util.Shell这个类里面

就是这个属性,修改下!!那怎么改,有个很简单的方法,Ctrl+A(全选),然后Ctrl+C(复制),把整个类复制下来,然后看下图!

点击画红圈的地方,Ctrl+V粘贴进去,他会自动生成想源码那样的包,然后直接改这个生成的java类,把350行改成:

2、Exception in thread "main"java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

还有这个几乎所有人都会遇到的问题,这个其实就是检查你的文件系统的时候报的错

我在我的另一个帖子里有说怎么修改,就是那个

Hbase在 Windows下运行报错 IllegalArgumentException:

Pathname /D:/download/repository/org/apache/.....

地址:http://blog.csdn.net/lsr40/article/details/77648012

要修改源码差不多也就这两个地方,如果还有别的,请大家在本帖的评论区留言,我研究下~谢谢

第三种类型、修改配置文件

 

1、org.apache.hadoop.security.AccessControlException:

Permissiondenied: user=test, access=WRITE,inode="/user/root/output":root:supergroup:drwxr-xr-x

这里的问题是权限问题!

两种解决方法:

第一:使用命令 bin/hdfs dfs -chmod -R 777 / 这个就是将HDFS上面的所有目录都给777的权限,所有人都可以访问

第二:etc/hadoop下的hdfs-site.xml添加

<property>

<name>dfs.permissions.enabled</name>

<value>false</value>

</property>

然后重启hadoop,在运行应该就没问题了

2、Error: java.lang.RuntimeException: java.lang.ClassNotFoundException:

Class com.ibeifeng.cm.MapReduce$WordMap not found

 

 

[java] view plain copy

  1. <span style="white-space:pre;">Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.ibeifeng.cm.MapReduce$WordMap not found  
  2.     at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1905)  
  3.     at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)  
  4.     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:722)  
  5.     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)  
  6.     at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)  
  7.     at java.security.AccessController.doPrivileged(Native Method)  
  8.     at javax.security.auth.Subject.doAs(Subject.java:422)  
  9.     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614)  
  10.     at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)  
  11. Caused by: java.lang.ClassNotFoundException: Class com.ibeifeng.cm.MapReduce$WordMap not found  
  12.     at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1811)  
  13.     at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1903)  
  14.     ... 8 more</span>  

 

这个报错其实很坑的,检查了好久,看不出来,最后终于找到:

因为新建项目的时候,其实有这个,请看下图:

请注意:这里只能添加这3个,如果把yarn-site.xml也copy进来,那样你运行的时候,就会报如上的错误,因为你在mapred-site.xml当中指定了job运行于yarn,(其实你在本地运行的时候,应该是local模式的)你运行的时候,程序去yarn上面找对应的jar,class等信息,结果没找到所以。。。

两种解决方法:

1、把你src/main/resource中,mapred-site.xml这个yarn的值,改成local,就是下图的这个属性!!

2、把yarn-site.xml和mapred-site.xml这两个配置文件从src/main/resource中删除!就不会报这个错误了!!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据爱好者社区

打赏是支持,也可以移步公众号。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值