设为首页 收藏本站
查看: 1163|回复: 0

[经验分享] 读书笔记2:Hadoop组件-(2)剖析MapReduce程序

[复制链接]

尚未签到

发表于 2016-12-11 11:33:31 | 显示全部楼层 |阅读模式
3,剖析MapReduce程序
<1>hadoop的数据类型
实现Writable接口额类可以是值,而实现WritableComparable接口的类既可以是键也可以是值。
以下这些是常用的数据类型,均用于实现WritableComparable借口:
BooleanWritable
ByteWritable
DoubleWritable
FloatWritable
IntWritable
LongWritable
Text使用UTF8格式的文本封装
NullWritable无键值时的占位符
也可以自定义数据类型,但要实现Writable接口或者WritableComparable接口。
<2>Mapper
一个类要作为mapper,需要继承MapReduceBase基类和实现Mapper借口。
mapper和reducer的基类均为MapReduceBase,它包含类的构造和解构方法:
void configure(JobConf job);该函数提取XML配置文件或者应用程序主类中的参数,在数据处理之前调用该函。
void close();作为map任务结束前的最后一个操作,该函数完成所有的结尾工作,如关闭数据库、打开文件等。
Mapper借口负责数据处理阶段,采用的形式是Mapper<K1,V1,K2,V2>java泛型,键类和值类分别实现WritableComparableWritable借口。
Mapper只有一个方法map用于处理一个单独的键值对。
void map(K1 key,V1 value,OutputCollector<K2,V2> output,Reporter reporter)
该函数处理一个给定的键值对(K1,V1),生成一个键值对(K2,V2)的列表。
OutputCollector接收这个映射过程的输入。
Reporter 可提供对Mapper相关附加信息的记录,形成任务进度。
 
Hadoop预定义的Mapper的实现:
IdentityMapper<K,V>
实现Mapper<K,V,K,V>就输入直接映射到输出
InverseMapper<K,V>
实现Mapper<K,V,K,V>发转键值对
RegexMapper<K>
实现Mapper<K,Text,Text,LongWritable>,为每个常规表达式的匹配项生成一个(mathc,1)
TokenCountMapper<K>
实现Mapper<K,Text,Text,LongWritable>,当输入的值为分词时,生成一个(token,1)
<3>Reducer
reducer的实现也必须继承MapReduceBase类和实现Reducer接口。
Reducer接口只有一个方法,及时reduce:
Void reduce (K2,key,Iterator<V2> values,OutputCollector<K3,V3> output,Reporter r)
Reducer任务接收来自各个mapper的输出时,按照键对输入数据进行排序,并将相同的键的值归并,然后调用reduce函数,并通过迭代处理那些与指定键相关联的值,生成一个列表<K3,V3>
OutputCollector接收reduce阶段的输出,并写入输出文件。
Reporter 可提供对Mapper相关附加信息的记录,形成任务进度。
 
Hadoop预定义的Reducer的实现:
IdentityReducer<K,V>
实现Reducer<K,V,K,V>,将输入直接映射到输出
LongSumReducer<K>
实现<K,LongWritable,K,LongWritable>,计算与给定键相对应的所有值的和
<4>Partitioner:重定向Mapper输出
其实在mapperreducer之间有一个非常重要的环节,就是将mapper的结果输出给不同的reducer,这就是Partitioner的工作:(此工作常被称为:洗牌
一般reducer是多个,那么mapper应该将键值的输出给谁呢?Hadoop默认的机制是对键进行散列来确定reducerHadoop通过HashPartitioner类强制执行此策略。但是有的时候HashPartitioner会使得程序出错,即他的分发策略不符合实际的要求,那么此时就需要我们定制自己的Partitioner(例如针对自定义的数据类型Edge)
public class EdgePartitioner implements Partitioner<Edge,Writable>
{
@override
public int getPartition(Edge key,Writable value,int numPartitions)
{
return key.getDepartureNode().hashCode() % numPartitions;
}
@override
public void configure(JobConf conf)
{

}
}
自己定制的Partitioner只需要实现getPartition方法和configure方法即可。前者将Hadoop对作业的配置应用在Partitioner上,而后者返回一个介于0reducer任务数之间的整数,指向键值对要发送到的reducer
Partitioner的形象的表达:(如下图)

<5>Combiner:本地reduce
在分发mapper之前先做一下“本地reduce”,也被成为合并,后面详细讲述。
<6>预定义MapperReducer
使用预定义MapperReducer改写前面的统计单词数量的程序:WordCount2.java
public class WordCount2 {
public static void main(String args[])
{
JobClient client = new JobClient();
JobConf conf =  new JobConf(WordCount2.class);

FileInputFormat.addInputPath(conf,new Path(args[0]));
FileOutputFormat.setOutputPath(conf,new Path(args[1]));

conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(LongWritable.class);
conf.setMapperClass(TokenCountMapper.class);//hadoop自己的TokenCountMapper
conf.setCombinerClass(LongSumReducer.class);//hadoop自己的LongSumReducer
conf.setReducerClass(LongSumReducer.class);

client.setConf(conf);
try
{
JobClient.runJob(conf);
}catch(Exception e)
{
e.printStackTrace();
}
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-312773-1-1.html 上篇帖子: Hadoop-0.20.2的log存放时间控制 下篇帖子: 读书笔记3:Hadoop实战-(1)构建MapReduce模版
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表