一、理解Hadoop
Hadoop_wiki上定义,
Apache Hadoop
is an open-source
software framework
used for distributed storage
and processing of very large data sets
.
就是说**Hadoop是(大数据下)分布式的数据处理框架。**所以我们从 如下两个方面理解Hadoop。[我们接下来重点从Hadoop的改进上来说]
1.既然是分布式计算环境,那么跟一般的框架有什么不同呢?
比如一般地SETI@home这个框架,在分布式计算的时候会在client和server之间进行数据传输,所以它更适合于计算密集型任务,而不适合于数据密集型任务。那么在大数据环境下,该框架就显得低效了。so,可以很容易想到的一个改进就是不进行大量的数据迁移,这就是Hadoop的思想,“将代码向数据迁移,尽量让计算发生在数据驻留之地”,这就与Hadoop**“面向数据密集型处理”**的设计目标一致。
2.作为
数据处理框架,与SQL数据库有什么不同?
1)Hadoop多面向非结构化文本数据的处理(使用key-value对),SQL是结构化数据库;
2)可以使用MR建立复杂的数据统计模型,SQL使用基本的操作语句;
3)Hadoop是面向离线批量处理,SQL多是在线操作。
二、理解MapReduce
MapReduce是Hadoop的数据处理模型,其基本原语是Mapper(过滤、转换)和Reducer(聚合)。再后面的介绍中我们还会发现MapReduce过程中还有Partitioning和Shuffling,这两者是通用过程,已经默认实现在MapReduce处理过程中了,不需要再编程设计实现了。
所以MR的数据流是:
三、从WordCount理解
下面我们从一个简单的wordcount例子来理解Hadoop的设计思想,看看这样一个框架到底带给我们什么?
给定一个句子,统计其中的单词数目。
1)遍历取词,通过多重集合wordcount统计,即wordcount中的相应项加1。【一般多重集合使用散列表实现。】
但是当数据量很大时,这样做十分耗时,效率很低,于是:
2)分布式:每台机器处理文档的不同部分,然后合并。
这样做也有问题,需要将数据分发到不同机器,然后机器再处理,这明显很蠢嘛,所以会考虑分布式存储,从而将存储和处理紧紧绑定起来。
还有,第二阶段的合并只能在一个机器上运行么?这会很大的效率瓶颈,更大的问题是,内存限制导致不能处理那么大的数据量,如果用硬盘散列的话,工作量会很大,很复杂。于是:
3)第二阶段的合并也扩展成并行化处理:
问题在于:如何分裂数据集才能扩展?一个例子是每台机器只处理某个字幕开头的单词。这个洗牌分区的过程,就是Hadoop在Map和Reduce之间自动实现的partition和shuffle过程。
以上,我们看懂了一般地处理模型会遇到的问题:
1)内存不够将整条数据读入;
2)带宽限制导致处理数据密集任务时效率低下;
3)没有容错措施
4)…….
资源参考:
wiki_Apache Hadoop
hadoop官网
The original papers on the Google File System and MapReduce are well worth
reading. Appreciate their underlying design and architecture:
■
The Google File System
—
http://labs.google.com/papers/gfs.html
■
MapReduce: Simplified Data Processing on Large Clusters
—
http://labs.google.com/ papers/mapreduce.html