简介:Hadoop 是一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件(commodity hw)上。而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以流的形式访问(streaming access)文件系统中的数据。
History : Lucene->Nutch->HDFS || MapReduce -> Hadoop
Salient Features:
> Hadoop, including HDFS, is well suited for distributed storage and distributed processing using commodity hardware(inexpensive). It is fault tolerant, scalable, andextremely simple to expand. MapReduce, well known for itssimplicity and applicability for large set of distributed applications, is an integral part of Hadoop. (How to satisfy the good properties?)
>Hadoop is written in Java and issupported on all major platforms.(why using java not others? How cross-platform?)
>Hadoop supports shell-like commands to interact with HDFS directly.
>New features and improvements are regularly implemented in HDFS.
(http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html)
HDFS和MapReduce是Hadoop的两大核心。而整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持的,并且它会通过MapReduce来实现对分布式并行任务处理的程序支持。(这里所述为早期Hadoop版本,后面的YARN暂时不考虑.)下面分别介绍HDFS和MapReduce:
HDFS
构成HDFS主要是Namenode(master)和一系列的Datanode(workers)。Namenode是负责管理文件系统的和相关的文件元数据(元数据持久化),这些信息是以"namespace image"和"edit log"两个文件形式存放在本地磁盘,但是这些文件是在HDFS每次重启的时候重新构造出来的(Fslmage | Editlog)。Datanode则是存取文件实际内容的节点,Datanodes会定时地将block的列表汇报给Namenode。
Mainly Related Points:
1. 硬件错误是常态,而非异常情况,HDFS可能是有成百上千的server组成,任何一个组件都有可能一直失效,因此错误检测和快速、自动的恢复是HDFS的核心架构目标。
2. HDFS应用对文件要求的是write-one-read-many访问模型。一个 文件经过创建、写,关闭之后就不需要改变。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。典型的如MapReduce框架,或者一个web crawler应用都很适合这个模型。
3. 移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好,HDFS提供给应用这样的接口。
4. 数据复制: Namenode全权管理block的复制,它周期性地从集群中的每个Datanode接收心跳包和一个Blockreport。心跳包的接收表示该Datanode节点正常工作,而Blockreport包括了该Datanode上所有的block组成的列表。(副本的存放与选择问题等需考虑)
5. 文件系统元数据的持久化(对比于数据结构的持久化 || Hibernate持久化框架等)
6. HDFS文件读写流程
Reference: http://dongxicheng.org/mapreduce/hdfs-small-files-solution/
http://blog.csdn.net/hguisu/article/details/7259716
MapReduce
“Our abstraction is inspired by the map and reduce primitives present in Lisp and many other functional languages.”
简单来说,在函数式语言里,map表示对一个列表(List)中的每个元素做计算,reduce表示对一个列表中的每个元素做迭代计算。它们具体的计算是通过传入的函数来实现的(high order function, 也可理解成callback函数吧...),map和reduce提供的是计算的框架。再仔细看,reduce既然能做迭代计算,那就表示列表中的元素是相关的,比如我想对列表中的所有元素做相加求和,那么列表中至少都应该是数值吧。而 map是对列表中每个元素做单独处理的,这表示列表中可以是杂乱无章的数据。这样看来,就有点联系了。在MapReduce里,Map处理的是原始数据, 自然是杂乱无章的,每条数据之间互相没有关系;到了Reduce阶段,数据是以key后面跟着若干个value来组织的,这些value有相关性,至少它们都在一个key下面,于是就符合函数式语言里map和reduce的基本思想了。
这样我们就可以把MapReduce理解为,把一堆杂乱无章的数据按照某种特征归纳起来,然后处理并得到最后的结果。Map面对的是杂乱无章的互不相关的 数据,它解析每个数据,从中提取出key和value,也就是提取了数据的特征。经过MapReduce的Shuffle阶段之后,在Reduce阶段看 到的都是已经归纳好的数据了,在此基础上我们可以做进一步的处理以便得到结果。
http://www.mengyan.org/blog/archives/2006/11/15/138.html
总的来说:Map/Reduce其实就是Divide/Conquer的过程,通过把问题Divide,使这些Divide后的Map运算高度并行,再将Map后的结果Reduce(根据某一个Key),得到最终的结果。Googler发现这是问题的核心,其它都是共性问题。因此,他们把MapReduce抽象分离出来。这样,Google的程序员可以只关心应用逻辑,关心根据哪些Key把问题进行分解,哪些操作是Map操作,哪些操作是Reduce操作。其它并行计算中的复杂问题诸如分布、工作调度、容错、机器间通信都交给Map/Reduce Framework去做,很大程度上简化了整个编程模型。
Hadoop Notes:
1. Hadoop/MapReduce的Job是一个昙花一现的东西,它仅仅是一个计算过程而已(计算),所有数据都是从HDFS来,到HDFS去(存储)。当最后一个Reduce完成之后,整个Job就消失了,只在历史日志中还保存着它曾经存在的证据。
2. Hadoop中的节点是对等的,对等性可以说是Hadoop扩展能力、容错能力的基础,它意味着计算不再局限于单个节点的能力。当然事情总有两面性,对等性造成的结果是,如果我们想让某些节点做特殊的事情,会发现很困难。
3. Hadoop对数据的操作是原子性的,一个Job跑完之后,最终的数据是在一瞬间呈现的,如果Job失败了,则什么都没有,连部分数据也得不到。由于 Job中的task都是并行的,因此这里适用于木桶理论,最后一个完成的那个task决定了整个Job完成的时刻。所以如果Hadoop发现某些Task 特别慢,会在其它节点运行这些Task的副本,当其中某个副本完成后,Hadoop将Kill掉其余的副本,这也是基于对等性的一个应用,使得那些慢的节 点不会拖慢Job。如果某个task在重试若干次之后仍然失败了,那么整个Job宣告失败。
4. 当面对Hadoop要面对的问题域时,编程语言不是首先要考虑的问题, 或者说,依赖于具体的实现方案。Hadoop要处理的是大批量数据,它强调的是吞吐量,当整个集群跑起来之后,系统的瓶颈往往是在磁盘IO和网络IO,这 种情况下,用C/C++实现Hadoop不见得比Java实现性能更高。相反,由于Java语言的严谨、统一和一些高级特性,用Java实现Hadoop 对开发者而言会更容易。一般来讲,无论是用C++写还是用Java写,当系统发展较成熟时,都已经经过了相当的优化,这时系统的瓶颈往往不在于软件了,而 在于硬件的限制。当然,这并非意味着目前Hadoop已经实现得很好了,Hadoop还有很大的优化空间,它的开发进程依然火爆,很多人在优化Hadoop,还包括用C++来改写Hadoop的部分代码的。另外,对于超大的集群(比如几千台服务器),调度器的优化也很关键,否则它就可能成为整个集群的瓶颈。我想这就是Hadoop虽然已经广泛应用,但是版本号依然还是零点几的原因吧。
5. YARN发展简单视角系列图见下:
集群管理系统角度:
// source: 董的blog
注: 有关HDFS || MapReduce等有关细节理解也不是特别详细,文中也没能详细给出,只给出了认为还比较重要的一些点.....
Progress: (Duration: 1.5 days Difficulty: 5/10)