Hadoop源代码分析(IFile)
为什么80%的码农都做不了架构师?>>>
Mapper的输出,在发送到Reducer前是存放在本地文件系统的,IFile提供了对Mapper输出的管理。我们已经知道,Mapper的输出是<Key,Value>对,IFile以记录<key-len, value-len, key,value>的形式存放了这些数据。为了保存键值对的边界,很自然IFile需要保存key-len和value-len。
和IFile相关的类图如下:
其中,文件流形式的输入和输出是由IFIleInputStream和IFIleOutputStream抽象。以记录形式的读/写操作由IFile.Reader/IFile.Writer提供,IFile.InMemoryReader用于读取存在于内存中的IFile文件格式数据。
我们以输出为例,来分析这部分的实现。首先是下图的和序列化反序列化相关的Serialization/Deserializer,这部分的code是在包org.apache.hadoop.io.serializer。序列化由Serializer抽象,通过Serializer的实现,用户可以利用serialize方法把对象序列化到通过open方法打开的输出流里。Deserializer提供的是相反的过程,对应的方法是deserialize。hadoop.io.serializer中还实现了配合工作的Serialization和对应的工厂SerializationFactory。两个具体的实现是WritableSerialization和JavaSerialization,分别对应了Writeble的序列化反序列化和Java本身带的序列化反序列化。
有了Serializer/Deserializer,我们来分析IFile.Writer。Writer的构造函数是:
public Writer(Configuration conf,FSDataOutputStream out,
Class<K> keyClass, Class<V>valueClass,
CompressionCodec codec, Counters.CounterwritesCounter)
conf,配置参数,out是Writer的输出,keyClass 和valueClass是输出的Kay,Value的class属性,codec是对输出进行压缩的方法,参数writesCounter用于对输出字节数进行统计的Counters.Counter。通过这些参数,我们可以构造我们使用的支持压缩功能的输出流(类成员out,类成员rawOut保存了构造函数传入的out),相关的计数器,还有就是Kay,Value的Serializer方法。
Writer最主要的方法是append方法(居然不是write方法,呵呵),有两种形式:
public void append(K key, V value) throws IOException {
public void append(DataInputBuffer key,DataInputBuffer value)
append(K key, V value)的主要过程是检查参数,然后将key和value序列化到DataOutputBuffer中,并获取序列化后的长度,最后把长度(2个)和DataOutputBuffer中的结果写到输出,并复位DataOutputBuffer和计数。append(DataInputBufferkey, DataInputBuffer value)处理过程也比较类似,就不再分析了。
close方法中需要注意的是,我们需要标记文件尾,或者是流结束。目前是通过写2个值为EOF_MARKER的长度来做标记。
IFileOutputStream是用于配合Writer的输出流,它会在IFiles的最后添加校验数据。当Writer调用IFileOutputStream的write操作时,IFileOutputStream计算并保持校验和,流被close的时候,校验结果会写到对应文件的文件尾。实际上存放在磁盘上的文件是一系列的<key-len, value-len, key, value>记录和校验结果。
更多精彩内容请关注:http://bbs.superwu.cn
关注超人学院微信二维码:
转载于:https://my.oschina.net/crxy/blog/420693
Hadoop源代码分析(IFile)相关推荐
- Hadoop源代码分析
http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...
- Hadoop源代码分析 - MapReduce(转载)
1. Hadoop源代码分析(MapReduce概论) http://caibinbupt.javaeye.com/blog/336467
- Hadoop源代码分析(完整图文版) part 1
在网上看到了很多此文章的装载,但是都是纯文字,这篇文章在没有图片的情况下阅读起来意义不大了.花了点时间上传了100多张图片,希望对大家学习hadoop有帮助. Hadoop源代码分析(一) 关键字: ...
- Hadoop源代码分析(完整版)
Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:/ ...
- Hadoop源代码分析(包mapreduce.lib.input)
接下来我们按照MapReduce过程中数据流动的顺序,来分解org.apache.hadoop.mapreduce.lib.*的相关内容,并介绍对应的基类的功能.首先是input部分,它实现了MapR ...
- Hadoop源代码分析(四)
为org.apache.hadoop.io.compress等的分析预留位置 转载于:https://www.cnblogs.com/94julia/archive/2013/04/01/299281 ...
- Hadoop源代码分析(MapReduce概论)
大家都熟悉文件系统,在对HDFS进行分析前,我们并没有花很多的时间去介绍HDFS的背景,毕竟大家对文件系统的还是有一定的理解的,而且也有很好的文档.在分析Hadoop的MapReduce部分前,我们还 ...
- Hadoop源代码分析之Configuration
最近也觉得应该仔细的看一下Hadoop的源代码了,以前只是懂得基本的架构了使用,最近在做一个系统,觉得很多东西可以借鉴MapReduce的可扩展性.但是当我们的系统的0.1版本出现的时候才发现我们的配 ...
- Hadoop源代码分析(二)
下面给出了Hadoop的包的功能分析. Package Dependences tool 提供一些命令行工具,如DistCp,archive mapreduce Hadoop的Map/Reduce实现 ...
最新文章
- Android 活动与活动间数据传递
- unity打包模型存在的一个问题
- CentOS6.5 keepalived详解及实现Nginx服务的高可用性
- Winform中设置ZedGraph鼠标滚轮缩放的灵敏度以及设置滚轮缩放的方式(鼠标焦点为中心还是图形中心点)
- 看看用 live write 发布日志的效果
- Spring-data-redis集成提交数据出现'maxActive'和‘maxWaitMillis’错误
- lede更改软件源_Linux的上传和下载——Ubuntu中软件的安装和ftp服务器的搭建
- 两年Java工作经验应该会些什么技术
- 使用ML.Net和C#进行机器学习
- 百度启动史上规模最大校园招聘;荣耀Magic3系列售价4599元起;阿里成立反职场陋习小组,无条件支持员工拒绝劝酒|极客头条...
- 食品安全事件曝光严重,SPC软件的应用刻不容缓
- VastBase技术实践
- 应届毕业生找工作很迷茫?4招教你快速破局,应届生必看!
- 腾创秒会达视频会议系统软件 安卓
- 解决微信支付、微信一键登陆在安卓10以上无法调起问题
- 云原生:打造「阿拉丁神灯式」应用厨房
- 《Unity 3D脚本编程:使用C#语言开发跨平台游戏》序言
- 街篮服务器维护比赛没打完,一球成名!热血街篮追梦杯圆满落幕,WaRn丶警告战队一穿五夺冠...
- 用Python机器人监听微信群聊 !
- 典型webservice(c#)例程序-提取数据库数据