Map-Reduce数据分析之一(实例1提取数据)

实例要求:给出一个文档,文档内容为类似Apr 23 11:49:54 hostapd:wlan0: STA 14:7d:c5:9e:fb:84的路由器使用信息;

                    要求提取出其中的日期,时间,路由器的MAC(Apr 23 11:49:54 14:7d:c5:9e:fb:84)。

代码如下:

该程序中只有map,没有reduce。因为只需要划分出文本输出即可,不需要汇总。

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.TextOutputFormat;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.OutputFormat;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

/*
 给一个文本,内容为Apr 23 11:49:54 hostapd:wlan0: STA 14:7d:c5:9e:fb:84类似到路由器到使用情况。
 要求从文本中提取出 日期,时间,路由器到MAC
 */
public class Test_1  extends Configured implements Tool
{
	enum Counter
	{
		LINESKIP;//出错到行  
	}
	public static class Map extends  Mapper<LongWritable,Text,NullWritable,Text>
	{//参数依次说明:输入key的格式,输入value到格式;输出key到格式,输出value到格式(注意输出格式NullWritable相当于空值)
		public void map(LongWritable key,Text value,Context context)throws IOException,InterruptedException
		{//context被称为上下文机制,自带万日特方法
			String line=value.toString();//读入原数据
			Text  word=new Text();
			try
			{
				//数据处理
				 String [] lineSplite=line.split(" ");//×××××用String的Split()方法将文本按空格符划分,返回一个数组×××××
			    String month=lineSplite[0];
			    String time=lineSplite[1];
			    String mac=lineSplite[5];
			    Text out=new Text(month+' '+time+' '+mac);//输出时,不能直接输出string类型,必须转换成hadoop格式才能输出
			    
			    //context.write(key, value);输出机制为:key \t value;如果有一个值为空值,那\t就不会被输出
			    context.write(NullWritable.get(), out);//将key值到位置写为空值,value到位置放key和value的值,就不会输出制表符\t了
			}
			catch(java.lang.ArrayIndexOutOfBoundsException e)
			{
				context.getCounter(Counter.LINESKIP).increment(1);//出错令计数器+1
				return;
			}
			
		}
	}
	public int run(String[] args) throws Exception
	{
		Configuration conf=getConf();
		Job job=new Job(conf,"Test_1");//任务名
		job.setJarByClass(Test_1.class);//指定class

		job.setOutputKeyClass(NullWritable.class);//指定输出的key格式
		job.setOutputValueClass(Text.class);//指定输出的value格式
		job.setMapperClass( Map.class);//调用上面到Map类作为Map任务代码
		FileInputFormat.addInputPath(job, new Path(args[0]));//输入路径
		FileOutputFormat.setOutputPath(job, new Path(args[1]));//输出路径
		
		job.waitForCompletion(true);
		return  job.isSuccessful() ?0:1;
	}
	public static void main(String[] args) throws Exception
	{
		//运行任务
		int res=ToolRunner.run(new Configuration(), new Test_1(), args);
		System.exit(res);
	}
}

注:实验步骤

1.在Ubuntu下运行eclipse,然后在控制台下开启hadoop的进程,这样eclipse才能与之进行连接。

2.在如图的DFS上右击,点击Disconnect,进行连接。

连接成功后会出现以下内容:

3.新建Map/Reduce工程:File->New->Project,然后选择Map/Reduce Project,Next,为工程起一个名字。

4.新建类class:在工程文件夹下的src上右击新建class即可。

5.编写程序

6.运行:Run->Run Configurations..

在Arguments下设置输入输出路径的参数为:

hdfs://localhost:9000/user/input
hdfs://localhost:9000/user/output

然后Run即可。(特别注意:运行之前一定要保证将output删除,并且将测试文档上传到input文件夹下)


7.运行结果:(运行后,刷新user文件夹会出现输出文件夹output,点击part-r-00000文件查看结果)


你可能感兴趣的:(Map-Reduce数据分析之一(实例1提取数据))