要调试MapReduce首先的安装Eclipse,然后再安装Hadoop插件到Eclipse中
1.安装Hadoop插件到Eclipse
1.1 安装hadoop-eclipse-plugin-1.2.1.jar
具体安装步骤就不细说了,简单的说一下
首先安装Eclipse
然后把hadoop-eclipse-plugin-1.2.1.jar放到eclipse安装目录的plugs目录下
重启Eclipse
在菜单Window--》Preferences中Hadoop Map/Reduce设置Hadoop installation directory
这里设置的是Hadoop的安装目录
我的是E:\hadoop-1.2.1\hadooplib
因为,我们的Hadoop是安装在另外一台远程机上面的,这里没办法设置,
那么,我们新键一个文件夹,然后把相应版本下的所有jar包(有根目录下的和lib目录下的) 复制到我们建立的文件夹hadooplib下 然后再指定这个路径
1.2 配置Hadoop插件
然后再Map/Reduce Locations中右键 新建
输入如下配置,试自己的情况而定
最终,你可以新建一个MapReduce的工程
然后你会看到
可以直接在这里操作HDFS上的文件
如果还有什么错误之类的请参考:http://blog.163.com/ppy2790@126/blog/static/1032422412013712111316872/
OK,插件安装好了,那么开始写一个简单的程序进行调试MapReduce
2.开发小程序调试MapReduce
2.1准备数据
MapReduceTest_1.txt
Apr 23 11:49:54 hostapd: wlan0: STA 14:7d:c5:94:fb:84
Apr 23 11:49:52 hostapd: wlan0: STA 74:7d:c5:94:fb:84
Apr 23 11:49:50 hostapd: wlan0: STA 84:7d:c5:94:fb:84
Apr 23 11:49:44 hostapd: wlan0: STA 94:7d:c5:94:fb:84
Apr 23 11:49:43 hostapd: wlan0: STA 64:7d:c5:94:fb:84
Apr 23 11:49:42 hostapd: wlan0: STA 54:7d:c5:94:fb:84
Apr 23 11:49:41 hostapd: wlan0: STA 44:7d:c5:94:fb:84
我们将这个带有数据的文件上传到HDFS中,这里我再Hdfs中建立了一个文件夹MapReduceTest_1
我们需要做的功能是,把每行的11:49:54 hostapd: wlan0: STA东西给截取掉
2.2 建立工程编写代码
File->NEW->Project->Map/Reduce Project
这里我命名为MapReductTest_2
OK,然后再工程属性中导入所有的hadooplib下的包
最后新建一个带main函数的类
类中的代码如下:
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
/**
*
* @author HUC
* @dec
* Configured 所属包 org.apache.hadoop.conf.Configured;
* Tool 所属包 org.apache.hadoop.util.Tool;
*/
public class MapReductTest_2 extends Configured implements Tool{
public static void main(String[] args) throws Exception {
//运行run
int res= ToolRunner.run(new Configuration(), new MapReductTest_2(), args);
System.exit(0);
}
@Override
public int run(String[] arg0) throws Exception {
//run方法中初始化作业JOB
Configuration conf= getConf();
/**
* JOB 属于 org.apache.hadoop.mapreduce.Job mapreduce下的包
* 这里两个参数 第一个是配置 第二个是作业的名字
*/
Job job=new Job(conf,"MapReduceTest_2");
//有了作业的配置和名字,接下来设置作业的类
job.setJarByClass(MapReductTest_2.class);
/**
* 接下来设置作业的输入路径和输出路径
* 这里都是MapReduce 中lib包下的 org.apache.hadoop.mapreduce.lib.output.FileOutputFormat
* 参数1 是作业 job 参数2 是输入或输出路径,这里我们去arg0中的下标0和下标1
* arg0 其实是main函数中的args
*/
FileInputFormat.addInputPath(job,new Path(arg0[0]));
FileOutputFormat.setOutputPath(job, new Path(arg0[1]));
//这个程序没有Reduce,我们接下来设置Map类
job.setMapperClass(map.class);
//接下来进行输出设置
job.setOutputFormatClass(TextOutputFormat.class);
//这里要和Map类中的后两个参数一至
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);
job.waitForCompletion(true);
return job.isSuccessful()?0:1;
}
/**
*
* @author HUC
* @deprecated
* 第一个参数 输入的键 这里是LongWritable 类似于 long类型 一般输入的参数都不会改变的
* 第二个参数 输入的值 Hadoop。io中的Text 类似于 String
* 第三个参数 可空的类型 输出的键 后两个根据自己的情况而定
* 第四个参数 Text
*/
public static class map extends Mapper<LongWritable, Text, NullWritable, Text>
{
/**
* 重写map方法
*/
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
//这里的value就是我们MapReduceTest_1.txt中每行的数据
String line= value.toString();
try {
//处理数据输出
String[] lineSplit= line.split(" ");
String month=lineSplit[0];
String time=lineSplit[1];
String mac=lineSplit[6];
Text out=new Text(month+" "+time+" "+mac);
context.write(NullWritable.get(),out);
} catch (Exception e) {
//如果作业出错得记录信息
//假设我们有10台电脑集群,两台执行作业出错了,那么此时就是2
context.getCounter(Counter.LINESKIP).increment(1);
return;
}
}
}
enum Counter
{
LINESKIP,//出错的行
}
}<span style="color:#ff0000;">
</span>
2.3 如何运行
还记得我们运行需要两个参数吗??
我们在运行那个小三角上点击 运行配置
OK,,运行
14/07/29 09:53:05 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
14/07/29 09:53:05 INFO mapred.JobClient: Cleaning up the staging area hdfs://192.168.1.137:9000/home/administrator/hadooptmp/mapred/staging/Administrator/.staging/job_201407290857_0001
14/07/29 09:53:05 ERROR security.UserGroupInformation: PriviledgedActionException as:Administrator cause:org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://192.168.1.137:9000/MapReduceTest_1
Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://192.168.1.137:9000/MapReduceTest_1
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:235)
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:252)
at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:1054)
at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:1071)
at org.apache.hadoop.mapred.JobClient.access$700(JobClient.java:179)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:983)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Unknown Source)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:550)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
at MapReduceTest_1.run(MapReduceTest_1.java:88)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at MapReduceTest_1.main(MapReduceTest_1.java:66)
不出意外的话,会出错,
但是如果我们在jobTasker机器上就不会。那是因为,windows中在E:\hadoop-1.2.1\hadoop-1.2.1\src\core\org\apache\hadoop\fs
FileUtil.java中有这么一个函数
private static void checkReturnValue(boolean rv, File p,
FsPermission permission
) throws IOException {
if (!rv) {
throw new IOException("Failed to set permissions of path: " + p +
" to " +
String.format("%04o", permission.toShort()));
}
}
我们把里面的代码注释掉,然后重新编译成hadoop-core-1.2.1.jar 替换掉就行了
windows上面不做返回值检查
不会编译,那就百度搜索别人编译好的,替换掉hadooplib下的就哦了