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

[经验分享] hadoop学习笔记4

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-12-7 09:58:30 | 显示全部楼层 |阅读模式
  Writable接口
1、对java中的int型进行封装那么就是hadoop中的IntWritable类,在写程序的时候可以把IntWritable可以看着是int类型,它实现了WritableComparable接口,WritableComparable又是Writable、java.lang.comparable接口的子接口。
2、我们可以自定义Writable接口,来编写更复杂的结构的类,核心:hadoop有自己一套的I/O机制,I/O类都必须实现Writable接口。
------------------------------------------------------------
mapreduce驱动默认的设置
inputFormat(输入)-----TextInputFormat
MapperClass ------------IdentityMapper
MapRunnerClass(map启动类)---------MapRunner
MapOuputKeyClass-------------LongWritable
MapOutputValueClass--------Text
PartitionerClasss----------HashPartitioner
ReduceClass ---------------IdentityReduce
OutputKeyClass --------------LongWritable
OutputValueClass--------------Text
OutputFormatClass----------TextOutputFormat
---------------------------------------------------
Combiners和Partitioner编程
Combiners的作用
 每一个map可能会产生大量的输出,combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量,
   1)combiner最基本是实现本地key的聚合,对map输出的key排序,value进行迭代。如下所示:map: (K1, V1) → list(K2, V2)?combine: (K2, list(V2)) → list(K2, V2)?reduce: (K2, list(V2)) → list(K3, V3)
   2)combiner还具有类似本地的reduce功能.例如hadoop自带的wordcount的例子和找出value的最大值的程序,combiner和reduce完全一致。如下所示:map: (K1, V1) → list(K2, V2)?combine: (K2, list(V2)) → list(K3, V3)?reduce: (K3, list(V3)) → list(K4, V4)?
  3)如果不用combiner,那么,所有的结果都是reduce完成,效率会相对低下。使用combiner,先完成的map会在本地聚合,提升速度。
   4)对于hadoop自带的wordcount的例子,value就是一个叠加的数字,所以map一结束就可以进行reduce的value叠加,而不必要等到所有的map结束再去进行reduce的value叠加。
  注意:combiner使用的合适,可以在满足业务的情况下提升job的速度,如果不合适,则将导致输出的结果不正确。
Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。所以从我的想法来看,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。
-------------------------------------------------------------------------------------
 Combiners分析
假设有两个map。
第一个map的输出为:
(1950,0)
 (1950,20)
 (1950,10)
第二个map输出为:
(1950,25)
 (1950,15)
 (1950,30)
Reduce函数被调用是,输入如下:
(1950,[0,20,10,25,15,30])
因为30是最大的值,所以输出如下:
(1950,30)
如果我们使用 combiner:那么reduce调用的时候传入的数据如下:
(1950,[20,30])--?(1950,30)
用表达式表示为:
Max(0,20,10,25,15,30)=max(max(0,20,10),max(25,15,30))=max(20,30)=30
----------------------------------------
使用 Combiners要小心
刚才我们是计算最大值可以使用Combiners能提高效率。
如果我们要是求平均值呢?
Avg(0,20,10,25,15,30) = 15
如果使用Combiner会得到什么样的结果呢?
  第一个map输出为:
 avg(0,20,10) = 10
第二个map输出为:
Avg(25,15,30) = 23
  输入到reduce出来的结果为:
  Avg(10,23) = 17.5
  17.5和15?
  所以 :使用combiner一定要注意。

运维网声明 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.iyunv.com/thread-310855-1-1.html 上篇帖子: hadoop secondarynamenode的作用 下篇帖子: hadoop参数配置优化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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