0、MapReduce当中的计数器
初学耗时:0.5h
注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。
一、MapReduce当中的计数器
1.1 计数器概念。
1.2 Hadoop内置计数器列表。
1.3 需求实现。
记忆词:
MapReduce当中的计数器
一、MapReduce当中的计数器
1.1 ~ 计数器概念。
- 计数器是收集作业统计信息的有效手段之一,用于质量控制或应用级统计。
- 计数器还可辅助诊断系统故障。
- 如果需要将日志信息传输到map 或reduce 任务, 更好的方法通常是看能否用一个计数器值来记录某一特定事件的发生。
- 对于大型分布式作业而言,使用计数器更为方便。
- 除了因为获取计数器值比输出日志更方便,还有根据计数器值统计特定事件的发生次数要比分析一堆日志文件容易得多。
1.2 ~ Hadoop内置计数器列表。
hadoop内置计数器列表 | 导包 |
---|---|
MapReduce任务计数器 | org.apache.hadoop.mapreduce.TaskCounter |
文件系统计数器 | org.apache.hadoop.mapreduce.FileSystemCounter |
FileInputFormat计数器 | org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter |
FileOutputFormat计数器 | org.apache.hadoop.mapreduce.lib.output.FileOutputFormatCounter |
作业计数器 | org.apache.hadoop.mapreduce.JobCounter |
1.3 ~ 需求实现。
- 每次mapreduce执行完成之后,我们都会看到一些日志记录出来,其中最重要的一些日志记录如下截图:
- 所有的这些都是MapReduce的计数器的功能,既然MapReduce当中有计数器的功能,我们如何实现自己的计数器???
- 需求:以上面排序以及序列化为案例,统计map接收到的数据记录条数。
1.3.1 . 定义计数器。
- 通过context上下文对象可以获取我们的计数器,进行记录通过context上下文对象,在map端使用计数器进行统计。
public class SortMapper extends Mapper<LongWritable,Text,PairWritable,IntWritable> {
private PairWritable mapOutKey = new PairWritable();
private IntWritable mapOutValue = new IntWritable();
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//自定义我们的计数器,这里实现了统计map数据数据的条数
Counter counter = context.getCounter("MR_COUNT", "MapRecordCounter");
counter.increment(1L);
String lineValue = value.toString();
String[] strs = lineValue.split("\t");
//设置组合key和value ==> <(key,value),value>
mapOutKey.set(strs[0], Integer.valueOf(strs[1]));
mapOutValue.set(Integer.valueOf(strs[1]));
context.write(mapOutKey, mapOutValue);
}
}
- 运行程序之后就可以看到我们自定义的计数器在map阶段读取了七条数据。
1.3.2 . 通过enum枚举类型来定义计数器。
- 统计reduce端数据的输入的key有多少个,对应的value有多少个。
public class SortReducer extends Reducer<PairWritable,IntWritable,Text,IntWritable> {
private Text outPutKey = new Text();
public static enum Counter{
REDUCE_INPUT_RECORDS, REDUCE_INPUT_VAL_NUMS,
}
@Override
public void reduce(PairWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
context.getCounter(Counter.REDUCE_INPUT_RECORDS).increment(1L);
//迭代输出
for(IntWritable value : values) {
context.getCounter(Counter.REDUCE_INPUT_VAL_NUMS).increment(1L);
outPutKey.set(key.getFirst());
context.write(outPutKey, value);
}
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
^ 至此,MapReduce当中的计数器完成。
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
※ 世间诱惑何其多,坚定始终不动摇。
如果n个事务并发调度,那么可能的并发调度数目:
…
A、为n
B、为4n
C、为n!
D、大于n!
…
D
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。
我知道我的不足,我也知道你的挑剔,但我就是我,不一样的烟火,谢谢你的指指点点,造就了我的点点滴滴:)!