标签:
1、Hadoop介绍
Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了一个系统底层细节透明的分布式架构,通过Hadoop,可以将大量的廉价机器的计算资源组织起来,解决单机不能解决的海量数据的处理问题。Hadoop主要有以下几个优点:
高可靠性:提供按位处理的存储和计算能力值得用户信赖。
高扩展性:可以轻松地从小量集群扩展到数以千计的节点中。
高效性:提供并发的分布式计算框架,处理速度非常快。
高容错性:即使在少量节点宕机的情况下,也能自动完成任务。
Hadoop主要的核心内容为MapReduce计算框架和HDFS文件系统,本文先简单介绍一下。
2、MapReduce框架介绍
"Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。"[1]
Hadoop将MapReduce高度抽象为两个阶段:Map阶段和Reduce阶段,每个阶段都以Key/Value对作为过程的输入和输出,并可以由程序员自己选择他们的类型。整个Map和Reduce阶段的数据流如图所示:
那么,Hadoop分布式框架为什么要采用MapReduce计算框架呢?我的意思是,为什么不单单一个Map或者Reduce就搞定呢?
很可惜,查了很多文章,都只是在讲什么是MapReduce,MapReduce的步骤是什么,很少有能讲清楚为什么采用MapReduce框架的问题。
偶然情况下,看到一篇很有趣的介绍MapReduce框架的介绍,贴出来共享一下:
下面是一个关于一个程序员是如何个妻子讲解什么是MapReduce?文章很长请耐心的看(如果不想看可以直接看我下面的总结)。
我问妻子:“你真的想要弄懂什么是MapReduce?” 她很坚定的回答说“是的”。 因此我问道:
我: 你是如何准备洋葱辣椒酱的?(以下并非准确食谱,请勿在家尝试)
妻子: 我会取一个洋葱,把它切碎,然后拌入盐和水,最后放进混合研磨机里研磨。这样就能得到洋葱辣椒酱了。
妻子: 但这和MapReduce有什么关系?
我: 你等一下。让我来编一个完整的情节,这样你肯定可以在15分钟内弄懂MapReduce.
妻子: 好吧。
我:现在,假设你想用薄荷、洋葱、番茄、辣椒、大蒜弄一瓶混合辣椒酱。你会怎么做呢?
妻子: 我会取薄荷叶一撮,洋葱一个,番茄一个,辣椒一根,大蒜一根,切碎后加入适量的盐和水,再放入混合研磨机里研磨,这样你就可以得到一瓶混合辣椒酱了。
我: 没错,让我们把MapReduce的概念应用到食谱上。Map和Reduce其实是两种操作,我来给你详细讲解下。Map(映射):
把洋葱、番茄、辣椒和大蒜切碎,是各自作用在这些物体上的一个Map操作。所以你给Map一个洋葱,Map就会把洋葱切碎。 同样的,你把辣椒,大蒜和番茄一一地拿给Map,你也会得到各种碎块。 所以,当你在切像洋葱这样的蔬菜时,你执行就是一个Map操作。 Map操作适用于每一种蔬菜,它会相应地生产出一种或多种碎块,在我们的例子中生产的是蔬菜块。在Map操作中可能会出现有个洋葱坏掉了的情况,你只要把坏洋葱丢了就行了。所以,如果出现坏洋葱了,Map操作就会过滤掉坏洋葱而不会生产出任何的坏洋葱块。
Reduce(化简):在这一阶段,你将各种蔬菜碎都放入研磨机里进行研磨,你就可以得到一瓶辣椒酱了。这意味要制成一瓶辣椒酱,你得研磨所有的原料。因此,研磨机通常将map操作的蔬菜碎聚集在了一起。
妻子: 所以,这就是MapReduce?
我: 你可以说是,也可以说不是。 其实这只是MapReduce的一部分,MapReduce的强大在于分布式计算。
妻子: 分布式计算? 那是什么?请给我解释下吧。
我: 没问题。
我: 假设你参加了一个辣椒酱比赛并且你的食谱赢得了最佳辣椒酱奖。得奖之后,辣椒酱食谱大受欢迎,于是你想要开始出售自制品牌的辣椒酱。假设你每天需要生产10000瓶辣椒酱,你会怎么办呢?
妻子: 我会找一个能为我大量提供原料的供应商。
我:是的..就是那样的。那你能否独自完成制作呢?也就是说,独自将原料都切碎? 仅仅一部研磨机又是否能满足需要?而且现在,我们还需要供应不同种类的辣椒酱,像洋葱辣椒酱、青椒辣椒酱、番茄辣椒酱等等。
妻子: 当然不能了,我会雇佣更多的工人来切蔬菜。我还需要更多的研磨机,这样我就可以更快地生产辣椒酱了。
我:没错,所以现在你就不得不分配工作了,你将需要几个人一起切蔬菜。每个人都要处理满满一袋的蔬菜,而每一个人都相当于在执行一个简单的Map操作。每一个人都将不断的从袋子里拿出蔬菜来,并且每次只对一种蔬菜进行处理,也就是将它们切碎,直到袋子空了为止。这样,当所有的工人都切完以后,工作台(每个人工作的地方)上就有了洋葱块、番茄块、和蒜蓉等等。
妻子:但是我怎么会制造出不同种类的番茄酱呢?
我:现在你会看到MapReduce遗漏的阶段—搅拌阶段。MapReduce将所有输出的蔬菜碎都搅拌在了一起,这些蔬菜碎都是在以key为基础的 map操作下产生的。搅拌将自动完成,你可以假设key是一种原料的名字,就像洋葱一样。 所以全部的洋葱keys都会搅拌在一起,并转移到研磨洋葱的研磨器里。这样,你就能得到洋葱辣椒酱了。同样地,所有的番茄也会被转移到标记着番茄的研磨器里,并制造出番茄辣椒酱。
也就是说,当我们在运行一个大型的程序的时候,肯定会遇到一些没有相互依赖关系的步骤(比如例子中的切洋葱与切番茄等步骤),而这些如果我们采用顺序执行的办法的话就浪费了时间,因为这些完全可以用异步的方式同时执行(就是找几个人同时准备洋葱与番茄等),这样时间就大大缩短了,而这一步骤在MapReduce里面也称为Map阶段,正是由于Map的存在,并行计算才有了可能。
但是我们的程序不可能是永远并行的(这样的话我们完全可以把他们当作多个程序了),在某些步骤完成之后,我们需要把这些计算结果(例子中的准备好的洋葱与番茄等)进行整合计算,虽然这一步可能不是并行的,但是却是必须的,因此这就是为什么必须有Reduce阶段的原因。
当采用单一Reduce任务的时候,整个MapReduce过程大致如下:
3、HDFS介绍
HDFS,既Hadoop Distributed File System(分布式文件系统),是一种跨多台计算机存储的文件系统,由于系统简历在网络只上,因此既需要考虑文件的存储,还要考虑到网络的复杂性问题。
然而,HDFS的好处也是不言而喻的,由于HDFS具有跨多台计算机存储的能力,因此系统的存储容量也被无限扩大了,更重要的是,在Hadoop平台中,这些分布式存储的文件可以被并行执行,大大缩短了程序运行时间。并且HDFS可以不对计算机的可靠性做太多要求,可以设计在任何普通硬件之上,并提供容错性。HDFS的优点有:容错性、扩展性、支持大文件存储等。
然而由于网络的不可靠与高延迟性,HDFS也有一些不合适使用的场景:
低时间延迟的数据访问不适合:如果对于实时性要求较高,比如在几十毫秒时间实现访问,则不适合用HDFS。
大量小文件存储不合适:HDFS是对大文件存储应用优化的,对文件元数据均存储在内存中,因此对于大量小文件容易造成元数据维护节点(NameNode)内存超支,因此不适合。
那么Hadoop为什么要采用HDFS系统呢?
HDFS在Hadoop平台之所以适用主要就是源于他的block的概念,由于分布式存储和文件分块使得不同计算机可以存储不同的文件,这样在Map阶段的时候就对并发处理提供了很大的方便,我们可以对不同的block采用不同的或者相同的map任务,从而实现并行处理,再对结果进行合并Reduce处理。鉴于数据本地化原则,一般情况下每个block与Map任务一一对应并且运行Map的节点就是存储该Map任务对应的block的节点。
HDFS采用了主从结构模型、一个HDFS集群是由一个NameNode和若干个DataNode组成的,其中NameNode为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。
NameNode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录等,它也负责数据块到具体DataNode的映射。DatNode负责处理文件
HDFS执行的结构如图所示:
4、参考文献
[2]Hadoop Definitive Guide 4th Edition
Hadoop介绍
标签:
原文地址:http://blog.csdn.net/runningtortoises/article/details/51435141