MapReduce程序之序列化原理与Writable案例


[TOC]在编写MapReduce程序时,我们会发现,对于MapReduce的输入输出数据(key-value),我们只能使用Hadoop提供的数据类型,而不能使用Java本身的基本数据类型,比如,如果数据类型为long,那么在编写MR程序时,对应Hadoop的数据类型则为LongWritable。关于原因,简单说明如下:hadoop在节点间的内部通讯使用的是RPC,RPC协议把消息翻译成二进制字节流发送到远程节点,
远程节点再通过反序列化把二进制流转成原始的信息。也就是说,传递的消息内容是需要经过hadoop特定的序列化与反序列化操作的,因此,才需要使用hadoop提供的数据类型,当然,如果想要自定义MR程序中key-value的数据类型,则需要实现相应的接口,如Writable、WritableComparable接口。也就是说,如果需要自定义key-value的数据类型,必须要遵循如下的原则:其实前面写的很多Netty的文章,到了后面写编解码技术时,需要实现的功能与Hadoop是一样的,因为到最后的目的,我也是希望自己写一个RPC框架(模仿阿里的dubbo)。关于Writable接口,源代码中的解释就非常好了:Any key or value type in the Hadoop Map-Reduce
* framework implements this interface.Implementations typically implement a static read(DataInput)
* method which constructs a new instance, calls {@link #readFields(DataInput)}
* and returns the instance.Example:直接给出官方源码中的解释:WritableComparables can be compared to each other, typically
* via Comparators. Any type which is to be used as a
* key in the Hadoop Map-Reduce framework should implement this
* interface.Note that hashCode() is frequently used in Hadoop to partition
* keys. It’s important that your implementation of hashCode() returns the same
* result across different instances of the JVM. Note also that the default
* hashCode() i 香港云主机mplementation in Object does not
* satisfy this property.Example:下图是电信一段日志记录的表结构,现需要统计每一个手机号码的upPackNum、downPackNum、upPayLoad、downPayLoad的总和。
要求:使用自定义Writable完成。提供的文本数据如下:下面就基于Writable接口写一个HttpDataWritable类,代码如下:程序代码如下:注意,上面的程序是需要读取命令行的参数输入的,可以在本地的环境执行,也可以打包成一个jar包上传到Hadoop环境的Linux服务器上执行,这里,我使用的是本地环境(我的操作系统是Mac OS),输入的参数如下:运行程序后,查看输出结果,如下:说明我们的MapReduce程序没有问题,并且写的HttpDataWritable类也是可以正常使用的。

相关推荐: 怎么在Win8系统隐藏桌面上的图标

这篇文章主要为大家展示了“怎么在Win8系统隐藏桌面上的图标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么在Win8系统隐藏桌面上的图标”这篇文章吧 香港云主机。隐藏桌面上的图标的操作步骤:1、需要先找到隐藏的…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/23 18:07
下一篇 07/23 18:07

相关推荐