第1章-初识Hadoop-读书笔记

数据!数据!

曾有这么一句话:“大量的数据胜于好的算法。”意思是说,对于某些应用(譬如基于先前偏好进行电影和音乐推荐),不论你的算法有多好,大量的可用的数据总能带来更好的推荐效果。

现在,我们已经有了大量的数据。不幸的是,我们当下正纠结于存储和分析这些数据。

数据存储与分析

我们遇到的问题很简单:磁盘访问速度跟不上磁盘存储容量增长的速度。

1、一个减少读取磁盘时间的办法?

读取一个磁盘中所有的数据需要很长时间,写甚至更慢。一个很简单减少读取时间的办法是:同时从多个磁盘上读取数据。

试想,如果我们拥有100个磁盘,每个磁盘存储1%的数据,并行读取,那么不到两分钟就可以读取所有数据。

仅使用磁盘容量的1%似乎很浪费。但是我们可以存储100个数据集,每个数据集1TB,并实现共享磁盘的访问。可以想象,该类系统的用户会很乐意使用磁盘共享访问以便缩短数据分析时间;并且,从统计角度来看,用户的分析工作会在不同的时间点进行,所以互相之间的干扰不会太大。

2、要实现对多个磁盘数据的并行读写,还有更多的问题要解决?

问题1)、硬件故障

一旦使用多个硬件,其中任一硬件发生故障的概率将非常高。

避免数据丢失的常用做法是?

常用做法为使用备份避免数据丢失。

系统保存数据的冗余复本,在发生故障后,可以使用数据的另一个可用复本。

例如:冗余磁盘阵列(RAID)就是按这个原理实现的。

另外,Hadoop的文件系统,即HDFS(Hadoop Distributed FileSystem)也用于备份复本。

问题2)、大多数分析任务需要以某种方式结合大部分数据共同完成分析任务

即,从一个磁盘读取的数据可能需要和从另外99个磁盘中读取的数据结合使用。各种分布式系统允许结合多个来源的数据并实现分析,但保证其正确性是一个很大的挑战。

MapReduce提出一个编程模型。该模型将上述磁盘读写的问题进行抽象,并转换为一个数据集(由键/值对组成)的计算。

此计算模型由map和reduce两部分组成,而只有这两部分提供对外的接口。与HDFS类似,MapReduce也具有较高的可靠性。

简而言之,Hadoop提供了一个可靠的共享存储和分析系统。HDFS实现存储,而MapReduce实现分析处理。纵然Hadoop还有其他功能,但这两部分是它的核心。

与其他系统相比

MapReduce似乎采用的是一种蛮力方法。每个查询需要处理整个数据集——或至少数据集的很大一部分。

反过来想,这也正是它的能力。

MapReduce是一个批量查询处理器,并且它能够在合理的时间范围内即时处理针对整个数据集的即时(ad hoc)查询

关系型数据管理系统

1、我们为什么不能使用数据库来对大量磁盘上的大规模数据进行进行批量分析呢?我们为什么需要MapReduce?

这些问题的答案来自磁盘的另一发展趋势:寻址时间的提高远远慢于传输速率的提高。

寻址是将磁头移动到特定磁盘位置进行读写操作的过程。它是导致磁盘操作延迟的主要原因,而传输速率取决于磁盘的带宽

如果数据的访问模式中包含大量的磁盘寻址,那么读取大量数据集所花的时间势必会更长(相较于流式数据读取模式),流式读取主要取决于传输速率

另一方面,如果数据库系统只更新一部分记录,那么传统的B树更有优势(关系型数据库中使用的一种数据结构,受限于寻址的比例)。

但数据库更新大部分数据时,B树的效率比MapReduce低得多,因为需要使用“排序/合并”(sort/merge)来重建数据库。

在许多情况下,可以将MapReduce视为关系型数据库管理系统的补充。

1)、两个系统之间的差异如图所示:

此处缺图一张,占位,下次补。

2)、MapReduce和关系型数据库之间的另一个区别在于它们所操作的数据集的结构化程度

结构化数据:是具有既定格式的实体化数据。

诸如XML文档或满足特定预定义格式的数据库表。这是RDBMS包括的内容。

半结构化数据

比较松散。虽然可能有格式,但经常被忽略,所以它只能用作对数据结构的一般指导。

例如,一张电子表格,其结构是由单元格组成的网格,但是每个单元格自身可保存任何形式的数据

非结构化数据

没有什么特别的内部结构。

例如,纯文本或图像数据。

MapReduce对于非结构化或半结构化数据非常有效。

因为,在处理数据时才对数据进行解释。

换句话说:MapReduce输入的键和值并不是数据固有的属性,而是由分析数据的人员来选择的

2、为什么MapReduce非常适合用于分析各种日志文件?

因为Web服务器日志是一个典型的非规范化数据记录(例如:每次都需要记录客户端主机全名,导致同一客户端全名可能会多次出现),这也是MapReduce非常适用于分析各种日志文件的原因之一。

3、MapReduce是一中线性可伸缩的编程模型

程序员编写两个函数,分别为map和reduce函数——每个函数定义一个键/值对集合到另一个键/值对集合的映射。

这些函数无需关注数据集及其所用集群的大小,因此可以原封不动地应用到小规模数据集或大规模的数据集上。更重要的是,如果输入的数据量是原来的两倍,那么运行的时间也需要两倍。但是,如果集群是原来的两倍,作业的运行仍然与原来一样快。SQL查询一般不具备该特性。

但是,在不久的将来,关系型数据库系统和MapReduce系统之间的差异很可能变得模糊。

关系型数据库都开始吸收MapReduce的一些思路。另一方面,基于MapReduce的高级查询语言(如Pig和Hive)使MapReduce得系统更接近传统的数据库编程方式。

网格计算

MapReduce会尽量在计算节点上存储数据,以实现数据的本地快速访问。

数据本地化特性是MapReduce的核心特征,并因此而获得良好的性能。

意识到网络带宽是数据中心环境最珍贵的资源(到处复制数据很容易耗尽网络带宽)之后,MapReduce通过显示网络拓扑结构尽力保留网络带宽

1、在大规模分布式计算环境下,如何处理系统部分失效问题?

在大规模分布式计算环境下,协调各进程间的执行是一个很大的挑战。最困难的是合理地处理系统部分失效问题——在不知道一个远程进行是否已失效的情况下——同时还需要继续完成整个计算。

MapReduce让程序员无需考虑系统的部分失效问题,因为自身的系统实现能够检测到失败的map或reduce任务,并让正常运行的机器重新执行这些失败的任务。

正是由于采用了无共享框架,所以MapReduce才能够实现失败检测,这意味着各个任务之间彼此独立。(因为MapReduce系统本身控制着mapper的输出结果传给reducer的过程,这种情况下,重新运行reducer比重新运行mapper更需要格外小心。因为reducer需要获取必要的mapper的输出结果,如果没有获得必要的输出结果,必须再次运行相关mapper重新生成输出结果。)

因此,从程序员的角度来看,任务的执行顺序是无关紧要的。相比之下,MPI(消息传递接口)程序必须显式的管理自身的检查点和恢复机制,尽管更多的控制权交给了程序员,但也加大了编程的难度。

2、MapReduce的灵感来自于?

灵感来自于传统的函数式编程、分布式计算和数据库社区,此后该模型在其他行业有着很多其他的应用。

3、MapReduce的设计目标是?

MapReduce的设计目标是服务于那些只需数分钟或数小时即可完成的作业。并且运行于内部通过高速网络连接的单一数据中心内,并且该数据中心内的计算机需要由可靠地、定制的硬件构成。

Hadoop发展简史

Hadoop是Apache Lucene创始人Doug Cutting创建的,Lucene是一个广泛使用的文本搜索系统库。

Hadoop起源于Apache Nutch

Hadoop起源于Apache Nutch,一个开源的网络搜索引擎,它本身也是Lucene项目的一部分。

Nutch项目始于2002年,一个可以运行的网页爬去工具盒搜索引擎。但后来,开发者认为这一架构可扩展度不够,不能解决十亿网页的搜索问题。

2003年谷歌发表的一篇论文为此提供了帮助。文中描述的是谷歌产品架构,该架构称为谷歌分布式文件系统,简称GFS。GFS或类似的架构,可以解决他们在网页爬去和索引过程中产生的超大文件的存储需求。特别关键的是,GFS能够节省系统管理(如管理存储节点)所花的大量时间。

1)、2004年实现Nutch的分布式文件系统 (NDFS)

在2004年,Doug Cutting他们开始着手实现一个开源的实现,即Nutch的分布式文件系统(NDFS)。

2)、2005年初Nutch的开发人员在Nutch上实现MapReduce系统

2004年,谷歌发表论文介绍他们的MapReduce系统。

2005年初,Nutch的开发人员在Nutch上实现了一个MapReduce系统,到年中,Nutch的所有主要算法均完成移植,用MapReduce和NDFS来运行。

3)、NDFS和MapReduce移出Nutch形成Lucene的一个子项目,称为Hadoop

Nutch的NDFS和MapReduce实现不只是适用于搜索领域。在2006年2月,开发人员将NDFS和MapReduce移出Nutch形成Lucene的一个子项目,称为Hadoop。

4)、2008年1月,Hadoop已成为Apache的顶级项目

5)、2008年4月,Hadoop打破世界纪录,成为最快的TB级数据排序系统

6)、Hadoop的大事记


Apache Hadoop和Hadoop生态圈

尽管Hadoop因MapReduce及其分布式文件系统(HDFS,由NDFS改名而来)而出名。但Hadoop这个名字也用于一组相关项目的统称,这些相关项目都使用这个基本平台进行分布式计算和海量数据处理。

书中提到的Hadoop项目简述如下:

Common

一组分布式文件系统和通用I/O的组件与接口(序列化、Java RPC和持久化数据结构)。

Avro

一种支持高效、跨语言的RPC以及永久存储数据的序列化系统。

MapReduce

分布式数据处理模型和执行环境,运行于大型商用机集群。

HDFS

分布式文件系统,运行于大型商用机集群。

Pig

一种数据流语言和运行环境,用以检索非常大的数据集。Pig运行在MapReduce和HDFS的集群上。

Hive

一个分布式、按列存储数据库。HBase使用HDFS作为底层存储,同时支持MapReduce的批量式计算和点查询随机读取。

Zookeeper

一个分布式,可用性高的协调服务。ZooKeeper提供分布式锁之类的基本服务用于构建分布式应用。

Sqoop

在数据库和HDFS之间高效传输数据的工具。


你可能感兴趣的:(第1章-初识Hadoop-读书笔记)