Hadoop的核心就是HDFS与MapReduce
HDFS(Hadoop Distributed File System)由GFS(Google File System)演变而来,用于管理数据存储。
MapReduce 是一个分布式计算框架,用于数据分析处理。
1. HDFS
HDFS采用master/slave的架构,对应分别是Namenode 和Datanode
master/slave : Namenode,DatanodeNamenode:Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。
Datanode:Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。
文件怎么存的?
文件分块,存到Datanode里。分块的原则:除了最后一个数据块,其它数据块的大小相同,一般为64MB or 128MB。
每个数据块有副本(一般为3):副本多了浪费空间。
副本存储:在大多数情况下,副本系数是3,HDFS的存放策略是将一个副本存放在本地机架的节点上,一个副本放在同一机架的另一个节点上,
最后一个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,这就提高了写操作的效率。
副本目的:可靠性+性能
集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。
client读数据:为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本。如果在读取程序的同一个机架上有一个副本,
那么就读取该副本。如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本。
client写数据:一次性写入,多次读取,数据访问会高效。
通讯协议:tcp/ip
2. MapReduce
Inputformat——》map——》(combine)——》partition——》copy&merge——》sort——》reduce——》outputformat
优化措施:合理设计MapReduce, 代码级别
转载一篇讲的比较好的文章:
我们以wordcount为例,假设有个6400M的文件,100台hadoop机器(准确地说应该是tasktracker机),默认block大小为64M,这样每台执行map的文件刚好是一个64M的block文件(假设这个分发过程已经完成,同时忽略备份数之类的细节),并且我们使用10个reduce任务来归并文件。Hadoop的mapreducer的执行过程如下:
这100台机器上面的map都是并发、独立的执行,以wordcount为例,步骤如下:
1、
2、
3、
4、
5、
6、
7、
8、
所以,总的流程应该是这样的:
*
由此我们也可以看出,执行reduce的代价还是有些的,所以如果我们的应用只使用map就能搞定的话,那就尽量不要再有reduce操作在其中。
3. Hadoop调度流程
转http://blog.youkuaiyun.com/perfumekristy/article/details/7182323