hadoop学习笔记2.windows上远程调试MapReduce


要调试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下的就哦了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值