一、MapReduce练习 IpAction,统计ip 和 操作

  1. 统计每个 ip 做了多少次 操作## 1. 统计每个 ip 做了多少次 操作
  2. 统计每个 操作,执行了多少次
  3. 每个 ip 的每个操作 执行了多少次
  4. 192.168.10.109 这个 ip 执行了多少次操作
  5. 每个 ip 的每个操作 执行了多少次,只看次数大于 350 的

ip数据文档:https://pan.baidu.com/s/1OX1Cv8p-xzEy_A9jTB6d6w

代码:

统计每个 ip 做了多少次 操作## 1. 统计每个 ip 做了多少次 操作

package com.it666.ipcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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 IpCount1 {
	
	//1. 统计每个 ip 做了多少次 操作
	
	// 自定义类继承自 Mapper 类,还需要设置 4 个泛型,前两个是固定的,后两个根据分析结果决定
	private static class IpCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
		
		// 声明 map 程序输出的 outputKey 和 outputValue 变量
		private static Text outputkey = new Text();
		private static IntWritable outputvalue = new IntWritable(1);
		
		// 重写父类的 map 方法实现数据分析并输出结果
		protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) 
				throws IOException, InterruptedException {
			
			// 转换 Text 类型的数据为 String 类型
			String line = value.toString();
			
			// 以空格拆分该行数据,得到所有ip数组
			String[] ips = line.split("\\s+");
			
			//获取ip字符串
			String ip = ips[0];
			
			outputkey.set(ip);
			context.write(outputkey, outputvalue);
		}	
	}
	
	// 自定义类继承 Reducer 类,还需要设置 4 个泛型,前两个和 map 的输出类型保持一致,后两个根据分析结果决定
	private static class IpCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
		
		// 2. 声明 reduce 程序输出的 outputKey 和 outputValue 变量
		private Text outputkey = new Text();
		private IntWritable outputvalue =new IntWritable();
		
		// 重写父类的 reduce 方法实现数据汇总并输出结果
		protected void reduce(Text key, Iterable<IntWritable> value,
				Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException{
			
			// 声明累加结果次数
			int count = 0;

			// 遍历 value 累加到 count
			for (IntWritable i : value) {
				// i 就是集合中的每个 1,通过 get() 方法转换为 int 类型
				count += i.get();
			}
			// 以ip为 key
			outputkey = key;
			// 以次数为 value
			outputvalue.set(count);
			// 进行输出
			context.write(outputkey, outputvalue);

		}
	}

	// 在 main 方法中编写 job 相关代码
	public static void main(String[] args) {
		// 创建 Hadoop 集群的配置信息对象 Configuration
		Configuration conf = new Configuration();

		try {
			// 使用 Configuration 对象获取 Job 对象,需要捕获异常
			Job job = Job.getInstance(conf);

			// 设置 Job 程序的主类(main 方法所在的类)
			job.setJarByClass(IpCount1.class);

			// 设置 map 和 reduce 程序的类
			job.setMapperClass(IpCountMapper.class);
			job.setReducerClass(IpCountReducer.class);

			// 设置 map 程序输出数据的 key 和 value 类型
			job.setMapOutputKeyClass(Text.class);
			job.setMapOutputValueClass(IntWritable.class);

			// 设置 reduce 程序输出数据的 key 和 value 类型
			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(IntWritable.class);

			// 设置输入数据的保存位置
			// org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
			FileInputFormat.addInputPath(job, new Path("E:/java/ip-action.dat"));
			FileSystem.get(conf).delete(new Path("E:/java/IpAction/result1"), true);

			// 设置输出数据的保存位置
			FileOutputFormat.setOutputPath(job, new Path("E:/java/IpAction/result1"));

			// 执行 job 程序进行数据分析,注意捕获异常
			job.waitForCompletion(true);

		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}
	
}

2. 统计每个 操作,执行了多少次

package com.it666.ipcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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 IpCount2 {
	
	//2. 统计每个 操作,执行了多少次
	
	
	// 自定义类继承自 Mapper 类,还需要设置 4 个泛型,前两个是固定的,后两个根据分析结果决定
	private static class IpCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
		
		// 声明 map 程序输出的 outputKey 和 outputValue 变量
		private static Text outputkey = new Text();
		private static IntWritable outputvalue = new IntWritable(1);
		
		// 重写父类的 map 方法实现数据分析并输出结果
		protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) 
				throws IOException, InterruptedException {
			
			// 转换 Text 类型的数据为 String 类型
			String line = value.toString();
			
			// 以空格拆分该行数据,得到所有ip数组
			String[] ips = line.split("\\s+");
			
			String ip = ips[1];
			
			outputkey.set(ip);
			context.write(outputkey, outputvalue);
		}	
	}
	
	// 自定义类继承 Reducer 类,还需要设置 4 个泛型,前两个和 map 的输出类型保持一致,后两个根据分析结果决定
	private static class IpCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
		
		// 2. 声明 reduce 程序输出的 outputKey 和 outputValue 变量
		private Text outputkey = new Text();
		private IntWritable outputvalue =new IntWritable();
		
		// 重写父类的 reduce 方法实现数据汇总并输出结果
		protected void reduce(Text key, Iterable<IntWritable> value,
				Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException{
			
			// 声明累加结果次数
			int count = 0;

			// 遍历 value 累加到 count
			for (IntWritable i : value) {
				// i 就是集合中的每个 1,通过 get() 方法转换为 int 类型
				count += i.get();
			}
			// 以ip为 key
			outputkey = key;
			// 以次数为 value
			outputvalue.set(count);
			// 进行输出
			context.write(outputkey, outputvalue);

		}
	}

	// 在 main 方法中编写 job 相关代码
	public static void main(String[] args) {
		// 创建 Hadoop 集群的配置信息对象 Configuration
		Configuration conf = new Configuration();

		try {
			// 使用 Configuration 对象获取 Job 对象,需要捕获异常
			Job job = Job.getInstance(conf);

			// 设置 Job 程序的主类(main 方法所在的类)
			job.setJarByClass(IpCount2.class);

			// 设置 map 和 reduce 程序的类
			job.setMapperClass(IpCountMapper.class);
			job.setReducerClass(IpCountReducer.class);

			// 设置 map 程序输出数据的 key 和 value 类型
			job.setMapOutputKeyClass(Text.class);
			job.setMapOutputValueClass(IntWritable.class);

			// 设置 reduce 程序输出数据的 key 和 value 类型
			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(IntWritable.class);

			// 设置输入数据的保存位置
			// org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
			FileInputFormat.addInputPath(job, new Path("E:/java/ip-action.dat"));
			FileSystem.get(conf).delete(new Path("E:/java/IpAction/result2"), true);

			// 设置输出数据的保存位置
			FileOutputFormat.setOutputPath(job, new Path("E:/java/IpAction/result2"));

			// 执行 job 程序进行数据分析,注意捕获异常
			job.waitForCompletion(true);

		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}
	
}

3. 每个 ip 的每个操作 执行了多少次

package com.it666.ipcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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 IpCount3 {
	
	//1. 每个 ip 的每个操作 执行了多少次
	
	// 自定义类继承自 Mapper 类,还需要设置 4 个泛型,前两个是固定的,后两个根据分析结果决定
	private static class IpCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
		
		// 声明 map 程序输出的 outputKey 和 outputValue 变量
		private static Text outputkey = new Text();
		private static IntWritable outputvalue = new IntWritable(1);
		
		// 重写父类的 map 方法实现数据分析并输出结果
		protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) 
				throws IOException, InterruptedException {
			
			// 转换 Text 类型的数据为 String 类型
			String line = value.toString();
			
			// 每一行作为一个数据
			outputkey.set(line);
			context.write(outputkey, outputvalue);
		}	
	}
	
	// 自定义类继承 Reducer 类,还需要设置 4 个泛型,前两个和 map 的输出类型保持一致,后两个根据分析结果决定
	private static class IpCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
		
		// 2. 声明 reduce 程序输出的 outputKey 和 outputValue 变量
		private Text outputkey = new Text();
		private IntWritable outputvalue =new IntWritable();
		
		// 重写父类的 reduce 方法实现数据汇总并输出结果
		protected void reduce(Text key, Iterable<IntWritable> value,
				Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException{
			
			// 声明累加结果次数
			int count = 0;

			// 遍历 value 累加到 count
			for (IntWritable i : value) {
				// i 就是集合中的每个 1,通过 get() 方法转换为 int 类型
				count += i.get();
			}
			// 以ip为 key
			outputkey = key;
			// 以次数为 value
			outputvalue.set(count);
			// 进行输出
			context.write(outputkey, outputvalue);

		}
	}

	// 在 main 方法中编写 job 相关代码
	public static void main(String[] args) {
		// 创建 Hadoop 集群的配置信息对象 Configuration
		Configuration conf = new Configuration();

		try {
			// 使用 Configuration 对象获取 Job 对象,需要捕获异常
			Job job = Job.getInstance(conf);

			// 设置 Job 程序的主类(main 方法所在的类)
			job.setJarByClass(IpCount3.class);

			// 设置 map 和 reduce 程序的类
			job.setMapperClass(IpCountMapper.class);
			job.setReducerClass(IpCountReducer.class);

			// 设置 map 程序输出数据的 key 和 value 类型
			job.setMapOutputKeyClass(Text.class);
			job.setMapOutputValueClass(IntWritable.class);

			// 设置 reduce 程序输出数据的 key 和 value 类型
			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(IntWritable.class);

			// 设置输入数据的保存位置
			// org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
			FileInputFormat.addInputPath(job, new Path("E:/java/ip-action.dat"));
			FileSystem.get(conf).delete(new Path("E:/java/IpAction/result3"), true);

			// 设置输出数据的保存位置
			FileOutputFormat.setOutputPath(job, new Path("E:/java/IpAction/result3"));

			// 执行 job 程序进行数据分析,注意捕获异常
			job.waitForCompletion(true);

		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}
	
}

4. 192.168.10.109 这个 ip 执行了多少次操作

package com.it666.ipcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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 IpCount4 {
	
	//4. 192.168.10.109    这个 ip 执行了多少次操作
	
	
	// 自定义类继承自 Mapper 类,还需要设置 4 个泛型,前两个是固定的,后两个根据分析结果决定
	private static class IpCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
		
		// 声明 map 程序输出的 outputKey 和 outputValue 变量
		private static Text outputkey = new Text();
		private static IntWritable outputvalue = new IntWritable(1);
		
		// 重写父类的 map 方法实现数据分析并输出结果
		protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) 
				throws IOException, InterruptedException {
			
			// 转换 Text 类型的数据为 String 类型
			String line = value.toString();
			
			// 以空格拆分该行数据,得到所有ip数组
			String[] ips = line.split("\\s+");
			
			//获取ip字符串
			String ip = ips[0];
			
			if (ip.equals("192.168.10.109")) {
				
				outputkey.set(ip);
				context.write(outputkey, outputvalue);
				
			}
			
		}	
	}
	
	// 自定义类继承 Reducer 类,还需要设置 4 个泛型,前两个和 map 的输出类型保持一致,后两个根据分析结果决定
	private static class IpCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
		
		// 2. 声明 reduce 程序输出的 outputKey 和 outputValue 变量
		private Text outputkey = new Text();
		private IntWritable outputvalue =new IntWritable();
		
		// 重写父类的 reduce 方法实现数据汇总并输出结果
		protected void reduce(Text key, Iterable<IntWritable> value,
				Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException{
			
			// 声明累加结果次数
			int count = 0;

			// 遍历 value 累加到 count
			for (IntWritable i : value) {
				// i 就是集合中的每个 1,通过 get() 方法转换为 int 类型
				count += i.get();
			}
			// 以ip为 key
			outputkey = key;
			// 以次数为 value
			outputvalue.set(count);
			// 进行输出
			context.write(outputkey, outputvalue);

		}
	}

	// 在 main 方法中编写 job 相关代码
	public static void main(String[] args) {
		// 创建 Hadoop 集群的配置信息对象 Configuration
		Configuration conf = new Configuration();

		try {
			// 使用 Configuration 对象获取 Job 对象,需要捕获异常
			Job job = Job.getInstance(conf);

			// 设置 Job 程序的主类(main 方法所在的类)
			job.setJarByClass(IpCount1.class);

			// 设置 map 和 reduce 程序的类
			job.setMapperClass(IpCountMapper.class);
			job.setReducerClass(IpCountReducer.class);

			// 设置 map 程序输出数据的 key 和 value 类型
			job.setMapOutputKeyClass(Text.class);
			job.setMapOutputValueClass(IntWritable.class);

			// 设置 reduce 程序输出数据的 key 和 value 类型
			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(IntWritable.class);

			// 设置输入数据的保存位置
			// org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
			FileInputFormat.addInputPath(job, new Path("E:/java/ip-action.dat"));
			FileSystem.get(conf).delete(new Path("E:/java/IpAction/result4"), true);

			// 设置输出数据的保存位置
			FileOutputFormat.setOutputPath(job, new Path("E:/java/IpAction/result4"));

			// 执行 job 程序进行数据分析,注意捕获异常
			job.waitForCompletion(true);

		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}
	
}

5. 每个 ip 的每个操作 执行了多少次,只看次数大于 350 的

package com.it666.ipcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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 IpCount5 {
	
	//1. 每个 ip 的每个操作 执行了多少次
	
	
	// 自定义类继承自 Mapper 类,还需要设置 4 个泛型,前两个是固定的,后两个根据分析结果决定
	private static class IpCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
		
		// 声明 map 程序输出的 outputKey 和 outputValue 变量
		private static Text outputkey = new Text();
		private static IntWritable outputvalue = new IntWritable(1);
		
		// 重写父类的 map 方法实现数据分析并输出结果
		protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) 
				throws IOException, InterruptedException {
			
			// 转换 Text 类型的数据为 String 类型
			String line = value.toString();
			
			// 每一行作为一个数据
			outputkey.set(line);
			context.write(outputkey, outputvalue);
		}	
	}
	
	// 自定义类继承 Reducer 类,还需要设置 4 个泛型,前两个和 map 的输出类型保持一致,后两个根据分析结果决定
	private static class IpCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
		
		// 2. 声明 reduce 程序输出的 outputKey 和 outputValue 变量
		private Text outputkey = new Text();
		private IntWritable outputvalue =new IntWritable();
		
		// 重写父类的 reduce 方法实现数据汇总并输出结果
		protected void reduce(Text key, Iterable<IntWritable> value,
				Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException{
			
			// 声明累加结果次数
			int count = 0;

			// 遍历 value 累加到 count
			for (IntWritable i : value) {
				// i 就是集合中的每个 1,通过 get() 方法转换为 int 类型
				count += i.get();
			}
			if (count > 350) {
				
				// 以ip为 key
				outputkey = key;
				// 以次数为 value
				outputvalue.set(count);
				// 进行输出
				context.write(outputkey, outputvalue);
				
			}
		}
	}

	// 在 main 方法中编写 job 相关代码
	public static void main(String[] args) {
		// 创建 Hadoop 集群的配置信息对象 Configuration
		Configuration conf = new Configuration();

		try {
			// 使用 Configuration 对象获取 Job 对象,需要捕获异常
			Job job = Job.getInstance(conf);

			// 设置 Job 程序的主类(main 方法所在的类)
			job.setJarByClass(IpCount3.class);

			// 设置 map 和 reduce 程序的类
			job.setMapperClass(IpCountMapper.class);
			job.setReducerClass(IpCountReducer.class);

			// 设置 map 程序输出数据的 key 和 value 类型
			job.setMapOutputKeyClass(Text.class);
			job.setMapOutputValueClass(IntWritable.class);

			// 设置 reduce 程序输出数据的 key 和 value 类型
			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(IntWritable.class);

			// 设置输入数据的保存位置
			// org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
			FileInputFormat.addInputPath(job, new Path("E:/java/ip-action.dat"));
			FileSystem.get(conf).delete(new Path("E:/java/IpAction/result5"), true);

			// 设置输出数据的保存位置
			FileOutputFormat.setOutputPath(job, new Path("E:/java/IpAction/result5"));

			// 执行 job 程序进行数据分析,注意捕获异常
			job.waitForCompletion(true);

		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}
	
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kp6i9HIY4G7WPzH

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值