Hadoop是怎么分块的?

hadoop的分块有两部分
 

第一部分就是数据的划分(即把File划分成Block),这个是物理上真真实实的进行了划分,数据文件上传到HDFS里的时候,需要划分成一块一块,每块的大小由hadoop-default.xml里配置选项进行划分。

<property>
  <name>dfs.block.size</name>
  <value>67108864</value>
  <description>The default block size for new files.</description>
</property>

这个就是默认的每个块64MB。数据划分的时候有冗余,个数是由以下配置指定的。

<property>
  <name>dfs.replication</name>
  <value>3</value>
  <description>Default block replication. 
  The actual number of replications can be specified when the file is created.
  The default is used if replication is not specified in create time.
  </description>
</property>

具体的物理划分步骤由Namenode决定。



第二种划分是由InputFormat这个接口来定义的,其中有个getSplits方法。这里有一个新的概念:fileSplit。每个map处理一个fileSplit,所以有多少个fileSplit就有多少个map(map数并不是单纯的由用户设置决定的)。

我们来看一下hadoop分配splits的源码:

if ((length != 0) && isSplitable(fs, path)) {
	long blockSize = file.getBlockSize();
	long splitSize = computeSplitSize(goalSize, minSize, blockSize);
	long bytesRemaining = length;
	
	while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
		int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
		splits.add(new FileSplit(path, length-bytesRemaining, splitSize, blkLocations[blkIndex].getHosts()));
		bytesRemaining -= splitSize;        
	}
	
	if (bytesRemaining != 0) {
	
	splits.add(new FileSplit(path, length-bytesRemaining, bytesRemaining,  blkLocations[blkLocations.length-1].getHosts()));        }

} else if(length!=0) {

	splits.add(new FileSplit(path,0,length,blkLocations[0].getHosts()));

}else{

	// Create empty hosts array for zero length files
	
	splits.add(new FileSplit(path,0,length,new String[0]));
}


从代码可以看出,一个块为一个splits,即一个map,只要搞清楚一个块的大小,就能计算出运行时的map数。而一个split的大小是由goalSize, minSize, blockSize这三个值决定的。computeSplitSize的逻辑是,先从goalSize和blockSize两个值中选出最小的那个(比如一般不设置map数,这时blockSize为当前文件的块size,而goalSize是文件大小除以用户设置的map数得到的,如果没设置的话,默认是1),在默认的大多数情况下,blockSize比较小。然后再取bloceSize和minSize中最大的那个。而minSize如果不通过”mapred.min.split.size”设置的话(”mapred.min.split.size”默认为0),minSize为1,这样得出的一个splits的size就是blockSize,即一个块一个map,有多少块就有多少map。

上面说的是splitable的情况,unsplitable可以根据实际情况来计算,一般为一个文件一个map。

下面是摘自网上的一个总结:

几个简单的结论:
1. 一个split不会包含零点几或者几点几个Block,一定是包含大于等于1个整数个Block
2. 一个split不会包含两个File的Block,不会跨越File边界
3. split和Block的关系是一对多的关系
4. maptasks的个数最终决定于splits的长度

还有一点需要说明,在FileSplit类中,有一项是private String[] hosts;
看上去是说明这个FileSplit是放在哪些机器上的,实际上hosts里只是存储了一个Block的冗余机器列表。
比如有个fileSplit 有4个block: Block11, Block12, Block13,Block14,这个FileSplit中的hosts里最终存储的是Block11本身和其备份所在的机器列表,也就是说 Block12,Block13,Block14存在哪些机器上没有在FileSplit中记录。

FileSplit中的这个属性有利于调度作业时候的数据本地性问题。如果一个tasktracker前来索取task,jobtracker就会找个 task给他,找到一个maptask,得先看这个task的输入的FileSplit里hosts是否包含tasktracker所在机器,也就是判断 和该tasktracker同时存在一个机器上的datanode是否拥有FileSplit中某个Block的备份。

但总之,只能牵就一个Block,其他Block就要从网络上传。不过对于默认大多数情况下的一个block对应一个map,可以通过修改hosts使map的本地化数更多一些。 在讲block的hosts传给fileSplit时,hosts中的主机地址可以有多个,表示map可以从优先从这些hosts中选取(只是优先,但hdfs还很可能根据当时的网络负载选择不是hosts中的主机起map task)。

知道这个特性之后,可以修改传回给fileSplit的hosts,在列表中只写block所在的那些hosts,这样hdfs就会优先将这些map放到这些hosts上去执行,由于hosts上有该block,就省掉了网络传输数据的时间。

这样做的话,在job很多的时候,可能会出现hot spot,即数据用的越多,它所在hosts上的map task就会越多。所以在考虑修改传给fileSplit的时候要考虑平衡诸多因素






<think>嗯,用户想了解Hadoop的基本概念,特别是Hadoop是什么以及它是如何工作的。首先,我需要回忆Hadoop的核心组件和架构。记得Hadoop是一个分布式计算框架,主要用于处理大数据。它的核心包括HDFS和MapReduce,对吧? HDFS是分布式文件系统,负责存储数据,而MapReduce处理数据。用户可能不太清楚这两个部分如何协同工作。需要解释清楚NameNode和DataNode的作用,NameNode管理元数据,DataNode存储实际数据块。Secondary NameNode的作用可能也需要提到,它不是备份,而是帮助NameNode进行元数据合并。 然后,MapReduce部分,JobTracker和TaskTracker的功能。用户可能对Map和Reduce阶段的具体流程不太了解,需要分步骤说明。比如,输入数据被分割成块,Map任务处理,Shuffle阶段排序,最后Reduce任务汇总结果。 用户提供的引用材料中提到Hadoop起源于Nutch项目,受Google的MapReduce论文影响。需要结合这些信息,说明Hadoop的历史背景,这样用户能更好地理解它的设计初衷。 还要注意回答的结构,先定义Hadoop,再分点讲解核心组件和工作原理,最后应用场景。需要确保使用正确的中文术语,避免技术术语过于晦涩,同时保持准确。可能用户对分布式计算不太熟悉,所以需要用简单易懂的语言解释。 检查是否有遗漏的部分,比如Hadoop的优化或生态系统组件,但根据问题,基本概念和工作原理是重点。是否需要提到YARN?可能用户的问题集中在传统架构,即Hadoop 1.x,而YARN属于Hadoop 2.x的资源管理,但原引用中的集群组成包括JobTracker和TaskTracker,属于较旧版本,所以可能不需要深入YARN。 最后,生成的相关问题要围绕用户可能感兴趣的后续内容,比如与MapReduce的区别、Hadoop的优缺点、实际应用案例等,帮助用户扩展知识面。确保引用标记正确,参考提供的引用[1]和[2]适当插入。</think>### Hadoop基本概念解析 #### 一、Hadoop是什么? Hadoop是一个开源的**分布式计算框架**,专门用于处理大规模数据集(通常从TB到PB级别)。其核心设计理念是**横向扩展**,通过廉价的普通服务器集群实现高可靠性和高吞吐量计算。Hadoop起源于Apache Nutch项目,受Google发布的MapReduce论文启发[^2],现已成为大数据领域的基石技术。 #### 二、Hadoop核心架构 Hadoop集群主要由以下组件构成: 1. **HDFS(Hadoop Distributed File System)** - **NameNode**:元数据管理者,记录文件与数据块的映射关系 - **DataNode**:实际存储数据块的节点 - **Secondary NameNode**:辅助合并元数据(注意:不是热备节点) 2. **MapReduce计算框架** - **JobTracker**:任务调度与资源分配中心 - **TaskTracker**:执行具体计算任务的节点 工作流程示例: ```text 输入文件 → HDFS分块存储 → Map阶段(并行处理)→ Shuffle阶段(数据排序)→ Reduce阶段(结果汇总)→ 输出 ``` #### 三、关键技术特性 1. **容错机制**:自动复制数据块(默认3副本),故障节点任务自动转移 2. **数据本地化**:计算任务优先调度到存储相关数据的节点 3. **批处理模式**:适合离线大数据处理,如日志分析、数据挖掘等 #### 四、典型应用场景 - 电商用户行为分析(如推荐系统) - 金融风控模型训练 - 电信网络日志处理 - 基因组学数据处理
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值