第一章 初识Hadoop
1 ZB (zettabytes) = 10^21 B = 1000 EB (exabytes) = 1 000 000 PB (petabytes) = 10亿 TB (terrabytes)
有句话说得好:“大数据胜于好算法。” 意思是说对于某些应用,不管算法多牛,基于小数据的推荐效果往往都不如基于大量数据的一般算法的推荐效果。
在硬盘存储容量多年来不断提升的同时,访问速度(硬盘数据读取速度)却没有与时俱进。1990年,一个普通硬盘可以存储1370 MB数据,传输速度为4.4 MB/s,因此只需要5分钟就可以读完整个硬盘中的数据。20年过去了,1 TB的硬盘成为主流,但其数据传输速度约为100 MB/s,读完整个硬盘中的数据至少得花2.5个小时。写入速度更慢。
试想,如果我们有100个硬盘,每个硬盘存储1%的数据,并行读取,那么不到两分钟就可以读完所有数据。
仅使用1%似乎很浪费。但是我们可以存储100个数据集,每个数据集1TB,并实现共享硬盘的读取。可以想象,用户肯定很乐于通过硬盘共享来缩短数据分析时间;并且,从统计学角度来看,用户的分析工作都是在不同时间点进行的,所以彼此之间的干扰并不太大。
MapReduce 看似采用了一种蛮力的方法。每个查询需要处理整个数据集或至少一个数据集的绝大部分。但反过来想,这正是它的能力。MapReduce 是一个批量查询处理器,能够在合理的时间范围内处理针对整个数据集的动态查询。
从MapReduce的所有长处来看,它基本上是一个批处理系统,并不适合交互式分析。你不可能执行一条查询在几秒内或更短的时间内得到结果。典型情况下,执行查询需要几分钟或更多时间。因此,MapReduce 更适合那种没有用户在现场等待查询结果的离线使用场景。
Hadoop的发展已经超越了批处理本身。名词“Hadoop”有时被用于指代一个更大的、多个项目组成的生态系统,而不仅仅是HDFS和MapReduce。
第一个提供在线访问的组件是HBase,一种使用HDFS做底层存储的键值存储模型。HBase不仅提供对单行的在线读/写访问,还提供对数据块读/写的批操作,这对于在HBase上构建应用来说是一种很好的解决方案。
Hadoop 2中YARN(Yet Another Resource Negotiator)的出现意味着Hadoop有了新处理模型。YARN是一个集群资源管理系统,允许任何一个分布式程序(不仅仅是MapReduce)基于Hadoop集群的数据而运行。
为什么不能用配有大量硬盘的数据库来进行大规模数据分析?我们为什么需要Hadoop?这两个问题的答案来自于计算机硬盘的另一个发展趋势:寻址时间的提升远远不敌于传输速率的提升。寻址是将磁头移动到特定磁盘位置进行读/写操作的过程。它是导致硬盘操作延迟的主要原因,而传输速率取决于硬盘的带宽。
如果数据访问模式中包含大量的硬盘寻址,那么读取大量数据集就必然会花更长的时间(相较于流数据读取模式,流读取主要取决于传输速率)。另一方面,如果数据库系统只更新一小部分数据,那么传统的B树(关系型数据库中使用的一种数据结构,受限于寻址的速率)就更有优势。但数据库系统如果有大量数据更新时,B树的效率就明显落后于MapReduce,因为需要使用“排序/合并”(sort/merge)来重建索引。
传统 的关系型数据库 | MapReduce |
---|---|
GB | PB |
交互式和批处理 | 批处理 |
多次读/写 | 一次写入,多次读取 |
ACID | 无事务 |
写时模式 | 读时模式 |
完整性高 | 完整性低 |
非线性 | 横向线性扩展 |
Hadoop尽量在计算节点上存储数据,以实现数据的本地访问。数据本地化(data locality)特性是Hadoop数据处理的核心,并因此而获得良好的性能。
MapReduce有三大设计目标:
- 为只需要短短几分钟或几个小时就可以完成的作业提供服务;
- 运行于同一个内部有高速网络连接的数据中心内;
- 数据中心内的计算机都是可靠的、专门的硬件。
Hadoop 是由Apache Lucene 创始人道格·卡丁(Doug Cutting)创建的,Lucene是一个应用广泛的文本搜索系统库。Hadoop 起源于开源网络搜索引擎Apache Nutch,后者本身也是Lucene项目的一部分。