前面4篇文章介绍了如何编写一个简单的日志提取程序,读取HDFS share/logs目录下的所有csv日志文件,然后提取数据后,最终输出到share/output目录下。
本篇停留一下,梳理一下主要过程,然后提出新的改进目标。
首先声明一下,所有的代码都是maven工程的,没有使用任何IDE。 这是我一贯的编程风格,用Emacs + JDEE开发。需要使用IDE的只需要学习如何在IDE中使用maven即可。
第一个是序列化,这是各种编程技术中常用的。MapReduce的特别之处在于由于key用来排序,所有它既要支持序列化和反序列化,同时也要支持比较大小的操作。因此通常使用的都是接口WritableComparable<T>,这个接口分别从Writable接口和java.lang.Comparable<T>接口继承。前者负责序列化,实现的就是类似流(stream)的功能,后者负责比较。
这里只是概括的介绍主要步骤:
1. 通过InputFormat读取HDFS目录的日志文件的所有行,进行内容分块。然后每个块都会对应一个mapper
2. 调用每个Mapper的map函数, 将内容块的数据按照行变成<key, value>格式,作为参数传递. map函数的代码由程序员自己实现,通常key是数据,value是整数,便于做统计。这样,也就将参数<key, value>改成了另一种符合业务逻辑的<key, value>, 通过Context.write方法
写出去,随后会被框架交给Reducer.
3. Partitioner目前我的程序中没有实现自己的类,只是简单使用了Reducer,后面会增加这部分的说明
4. 框架会根据key进行分组,组成<key, values>对, 调用Reducer的reduce函数,函数接受到Mapper传递来的<key, values>后再做统计
5. 输出成什么样的格式文件由OutputFormat来控制。
注意上面的几个粗体字,就是5大MapReduce组件。每个组件都是我们可以继承的类,然后MapReduce框架通过多态的方式来回调我们的子类实现的方法。
有了上面的实现,还需要配置Job,并且在hadoop命令行中提交。
配置的话,直接new一个Job类,调用set方法进行相应的设置即可。 Job的父类是JobContext。
就在这里可以设置上面的5大组件类,用自己的类来替换。还可以设置Reducer的数量。
分析就到这里,后面会陆续进行更多的编程实践。
比如,定制自己的3大组件, InputFormat,Partitioner和OutputFormat。
上一篇 帮助文档(1)