写在文前,本人菜鸡,写个文章,单纯为了记录下心路历程还有填坑,如果有说错的地方,还望大神指正!
今天记录的是在Windows下面开发hadoop的mapreduce的坑。
先说下流程吧:
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)来写代码了
好,接下来说报错!
首先,贴个自己写的简单代码出来:
package com..mapreduce;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCountMapReduce {
// step 1: Mapper
public static class WordCountMapper extends
Mapper<LongWritable, Text, Text, IntWritable> {
private Text mapOutputKey = new Text();
private IntWritable mapOutputValue = new IntWritable(1);
@Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// line value
String lineValue = value.toString();
// spilt
// String[] strs = lineValue.split(" ");
StringTokenizer stringTokenizer = new StringTokenizer(lineValue);
while (stringTokenizer.hasMoreTokens()) {
// set map output key
mapOutputKey.set(stringTokenizer.nextToken());
// output
context.write(mapOutputKey, mapOutputValue);
}
/**
* // iterator for (String str : strs) {
*
* mapOutputKey.set(str);
*
* context.write(mapOutputKey, mapOutputValue);
*
* }
*/
}
}
// step 2: Reducer
public static class WordCountReducer extends
Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable outputValue = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
// temp sum
int sum = 0;
// iterator
for (IntWritable value : values) {
sum += value.get();
}
// set output
outputValue.set(sum);
context.write(key, outputValue);
}
}
// step 3: Driver
public int run(String[] args) throws Exception {
Configuration configuration = new Configuration();
Job job = Job.getInstance(configuration, this.getClass()
.getSimpleName());
job.setJarByClass(WordCountMapReduce.class);
// set job
// input
Path inpath = new Path(args[0]);
FileInputFormat.addInputPath(job, inpath);
// output
Path outPath = new Path(args[1]);
FileOutputFormat.setOutputPath(job, outPath);
// Mapper
job.setMapperClass(WordCountMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
// Reducer
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
// submit job -> YARN
boolean isSuccess = job.waitForCompletion(true);
return isSuccess ? 0 : 1;
}
public static void main(String[] args) throws Exception {
args = new String[] {
"hdfs://bigdata-03:8020/user/wordcount/input",
"hdfs://bigdata-03:8020/user/wordcount/output6" };
// run job
int status = new WordCountMapReduce().run(args);
System.exit(status);
}
}
第一种类型、出现各种空指针:
例如: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.youkuaiyun.com/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
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.ibeifeng.cm.MapReduce$WordMap not found
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1905)
at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:722)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)
Caused by: java.lang.ClassNotFoundException: Class com.ibeifeng.cm.MapReduce$WordMap not found
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1811)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1903)
... 8 more
这个报错其实很坑的,检查了好久,看不出来,最后终于找到:
因为新建项目的时候,其实有这个,请看下图:
请注意:这里只能添加这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中删除!就不会报这个错误了!!