- 统计每个 ip 做了多少次 操作## 1. 统计每个 ip 做了多少次 操作
- 统计每个 操作,执行了多少次
- 每个 ip 的每个操作 执行了多少次
- 192.168.10.109 这个 ip 执行了多少次操作
- 每个 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();
}
}
}