hadoop分片分析
上一篇分析了split的生成,现在接着来说具体的split具体内容及其相关的文件和类。以FileSplit(mapred包下org/apache/hadoop/mapreduce/lib/input/FileSplit.java)为例,它继承了InputSplit接口,包括以下属性:
public class FileSplit extends InputSplit implements Writable {
private Path file; //分片对应的文件路径
private long start; //分片在文件中的偏移量
private long length; //分片长度
private String[] hosts; //所在主机列表
其中路径信息file标示了split对应的文件,其格式是这样的:hdfs://localhost:9000/home/hadoop/input/text1.txt。这个可以在debug的时候看的很清楚。另外就是hosts数组,标示了split对应的block所在的主机列表。当然有这么一种情况:就是split可能跨多个block,这时hosts表示的是哪个block所在的主机列表呢?这个问题等以后看到这部分源码的时候再说吧。
JobClient端的submitJobInternal()方法在计划和划分split的同时,生成了两个文件:job.split和job.splitmetainfo,将其放在HDFS的${mapreduce.jobtracker.staging.root.dir}/${user}/.staging/${JobId}目录下。他们的作用分别为:
job.split:表示原始分片信息,Map task初始化时使用,用以获取要处理的数据。
job.splitmetainfo:表示分片元信息, JobTracker用来构造locality的task。
下面着重解析下这两个文件:
job.split文件:

SPL :job.split文件头
version:版本信息,为1,int类型
类名信息:
类名长度:int类型,表示其后的类名由多少个字符组成(47)
类名:org.apache.hadoop.mapreduce.lib.input.FileSplit(共47个字符)
对象信息:
长度:int类型,表示其后的文件名信息由多少字符组成(49)
文件名:hdfs://localhost:9000/home/hadoop/input/text1.txt(共49个字符)
start:Long类型,表示该split的偏移量,
length:Long类型,表示分片长度
然后就是类名信息和对象信息作为一个条目,如此一直重复下去。要注意一点:图中的的边界并不一定是对齐的。
Job.splitmetainfo文件:

META-SPL :Job.splitmetainfo文件头
version:版本信息,为1,int类型
length:split的数目,int类型
副本信息:
副本个数:int类型
主机信息:int(表示主机名的长度),byte[](用来存储主机名) (如:8:gouyk-pc)
…… (以上边的形式重复写,因为会有多个split)
startOffset:split在job.split中的偏移量,Long
inputDataLength:分片长度, Long
然后就是副本信息和startOffset、inputDataLength作为一个条目,如此一直重复下去。同样,图中的的边界并不一定是对齐的。
下面说说关于读写split的基础类:SplitMetaInfo、TaskSplitMetaInfo和TaskSplitIndex,它们都封装在JobSplit类中。
SplitMetaInfo类代表了split的元数据信息,在生成job.split文件时被构造出来。主要属性如下:
public static class SplitMetaInfo implements Writable {
private long startOffset; //该split元信息在job.split文件中的偏移量
private long inputDataLength; //该split的数据长度
private String[] locations; //该split对应的host列表
TaskSplitMetaInfo类代表了Map Task要处理的split的元信息,在JobTracker端初始化Job时读取job.splitmetainfo文件后被构造出来。并将其存入到Map Task(TaskInProgress)中。在TaskTracker端,Map Task根据TaskSplitMetaInfo从job.split文件中读取split信息。主要属性如下:
public static class TaskSplitMetaInfo {
private TaskSplitIndex splitIndex; //split元信息在job.split文件中的索引
private long inputDataLength; //split的数据长度
private String[] locations; //split对应的host列表
TaskSplitIndex用于指定split在job.split中的位置。主要属性如下:
public static class TaskSplitIndex {
private String splitLocation; //job.split文件所在的位置
private long startOffset; //split在job.split文件中的索引
本文基于hadoop1.2.1
如有错误,还请指正
参考文章:《Hadoop技术内幕 深入理解MapReduce架构设计与实现原理》 董西成
http://blog.sina.com.cn/s/blog_9d31d3870101dtx8.html
转载请注明出处:http://www.cnblogs.com/gwgyk/p/4123414.html
hadoop分片分析的更多相关文章
- Hadoop源代码分析
http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...
- Hadoop日志分析系统启动脚本
Hadoop日志分析系统启动脚本 #!/bin/bash #Flume日志数据的根文件夹 root_path=/flume #Mapreduce处理后的数据文件夹 process_path=/proc ...
- Hadoop源代码分析(完整版)
Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:// ...
- 使用hadoop mapreduce分析mongodb数据
使用hadoop mapreduce分析mongodb数据 (现在很多互联网爬虫将数据存入mongdb中,所以研究了一下,写此文档) 版权声明:本文为yunshuxueyuan原创文章.如需转载请标明 ...
- hadoop 分片与分块,map task和reduce task的理解
分块:Block HDFS存储系统中,引入了文件系统的分块概念(block),块是存储的最小单位,HDFS定义其大小为64MB.与单磁盘文件系统相似,存储在 HDFS上的文件均存储为多个块,不同的是, ...
- hadoop 日志分析
1:在每一个tomcat服务器上,生成的日志目录中,在java中用定时器每天将当天的日志上传到hadoop中 (技术要点:quatz+hadoop-client)具体的目录动态的采用时间品名 2:ha ...
- Hadoop源代码分析【IO专题】
由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化.Hadoop并没有采用Java的序列化(因为Java序列化比较复杂,且不能深度控制),而是引入了它自己的系统. ...
- Hadoop学习之Hadoop案例分析
一.日志数据分析1.背景1.1 ***论坛日志,数据分为两部分组成,原来是一个大文件,是56GB:以后每天生成一个文件,大约是150-200MB之间: 每行记录有5部分组成:1.访问ip:2.访问时间 ...
- hadoop日志分析
一.项目要求 本文讨论的日志处理方法中的日志,仅指Web日志.事实上并没有精确的定义,可能包含但不限于各种前端Webserver--apache.lighttpd.nginx.tomcat等产生的用户 ...
随机推荐
- EF CodeFirst 关系配置
自从开始学习asp.net mvc采用code first以来,关系配置就没有搞清楚过!(⊙﹏⊙)b 笔记之前先感谢以下文章和博主,对他们表示崇拜,由浅入深.举例恰当.拨云见日.茅塞顿开,还有什么词, ...
- 关于面试别问及Spring如何回答思路总结!
首先要知道 Spring两大核心IOC和AOP(Java轻量级业务层框架Spring两大核心IOC和AOP原理) IOC: 1.从Java最基本的创建对象开始 如Interface Driven De ...
- C++备忘录
参考资料: 1. <C++编程思想(第一卷)> 知识点: ● register变量:它是一种局部变量类型.它告诉编译器尽快访问该变量.一般会把变量放在寄存器中,但不保证一定会.不能得到或计 ...
- (原创)RS232串口信号定义
好久没用动硬件了,串口更是好久没用用了. 曾经接口信号记得很清楚,久了,忘了. 今天,重新回顾,笔记记下. DB9接口分公头和母头,公头即插针头,电脑机箱上多少公头.母头即插孔座. 合理的硬件设计均以 ...
- OO的五大原则是指SRP、OCP、LSP、DIP、ISP。
OO的高层原则,面向对象设计的基本原则 设计模式之六大原则--开闭原则(OCP) 设计模式之六大原则--迪米特法则(LoD,LKP) 设计模式之六大原则--接口隔离原则(ISP) 设计模式之六大原则- ...
- JS巧计__轮播
横向轮播 function lxfScroll(main,titleli,alt,speed){ var lxfscroll = $(main); var ul = lxfscroll.find(&q ...
- 三代PacBio reads纠错 - 专题
三代纠错的重要性不言而喻,三代的核心优势就是长,唯一的缺点就是错误率高,但好就好在错误是随机分布的,可以通过算法解决,这也就是为什么现在有这么多针对三代开发的纠错工具. 纠错和组装是分不开的,纠错就是 ...
- HTML5 十大新特性(四)——Canvas绘图
H5引入了canvas标签,默认是一个300*150的inline-block.canvas的宽高只能用它自身的width和height属性来指定,而不能使用css样式中的width.height. ...
- ionic项目中手机状态栏显示使用$cordovaStatusbar插件
在项目中发现Android和iOS在手机状态栏样式不一样,然后就查到有一个cordova插件可以解决这个问题 1.下载插件$cordovaStatusbar命令: cordova plugin add ...
- nodejs新建服务器
var http = require('http');// var optfile = require('./models/optfile'); http.createServer(function ...