《Data-intensive Text Processing with MapReduce》读书笔记第1章:引言
本读书笔记的目录地址:http://www.cnblogs.com/mdyang/archive/2011/06/29/data-intensive-text-prcessing-with-mapreduce-contents.html
MapReduce是什么?
MapReduce是一个编程和执行模型。使用MapReduce,你可以编写大规模分布式数据处理程序。使用MapReduce模型编写的程序可以运行在由普通PC机构成的集群上。
本书介绍什么?
本书介绍基于MapReduce的可扩展大规模文本处理方法。
为什么介绍这些?
要处理的数据规模越来越大了,比如:
1) 大规模数据管理。现在任何基于数据构建(指收集、分析、监测、过滤、搜索、整理等)的Web应用都必须直面这样一个问题:如何支持Web规模(Web-scale)的数据管理?
2) 数据分析。数据分析对于商务智能(Business Intellegence)、决策制定(Decision Making)都有重要意义。数据分析通常基于日志系统产生的大量历史数据。对于数据分析来说,数据规模、涉及的计算量都很大。
我们谈论的数据到底有多大规模?
一些例子:
1) Google 2004年每天使用MapReduce处理的数据量为100TB (1TB=1024GB);
2) eBay的两个大规模数据仓库(2009年4月的一篇日志介绍):一个存有2PB的用户数据(1PB=1024TB);另一个存储了6.5PB的用户数据,涵盖了超过1,700,000亿(170 trillion)条数据,并以每天1,500亿(150 billion)条的速度增长;
3) Facebook曾披露了2.5PB的用户数据集,并以每天15TB的速度增长。
PB级的数据集正变得越来越稀松平常。现在的趋势非常明显:我们存储的数据正在变得越来越大,变得难以处理。过于注重提高存储容量(从1980年代中期的几十MB到现在的几个TB,增长了好几个数量级),而对于传输带宽和延迟却少有改进(带宽50x改进,延迟2x改进)使得即使是仅仅把我们存储起来的海量数据读出来(不用说进一步的计算处理了)都很困难。
不仅是常见的大规模Web应用,科学计算领域,处理PB级别的数据集也正变得越来越平常(详情略)。
虽然大规模数据集的形式多种多样,但本书主要探讨大规模文本数据(也会接触其他数据,例如关系数据、图数据等)的处理。涉及自然语言处理(NLP)与信息检索(IR)。在这些领域主要采用数据驱动的实证验证法(data-driven, empirical approach)进行研究,基本思想是通过算法捕捉数据中的规律。这种研究方法包括三个要素:数据、数据表示(特征)与捕捉特征的方法(算法)。
1.1 云计算
在云计算中,大量的存储、计算等资源被聚合,以服务的方式提供。MapReduce提供了一种抽象,这种抽象将你要做的事情(what)和具体做事情的方法(how)区分开来(这句话有待斟酌),简化了程序设计。因此MapReduce很适合云环境。
1.2 MapReduce的思想
1) 通过横向扩展(scale-out),而不是纵向扩展(scale-up)提高计算能力。
横向扩展:增加普通PC机,加大集群规模。这是基于MapReduce计算集群的扩展方式。优点:
纵向扩展:更换性能更好的计算机。这是传统的高性能计算(High-Performance Computing, HPC)集群扩展方法。
MapReduce优势:性价比更高,更节能。
2) Down机很正常。
举例:假设集群内机器具有1,000天的MTBF(mean-time between failures)
含有10,000台这种机器的集群,每天将有10台机器故障。
假设具有10,000天的MTBF(这不太可能),每天仍将有1台机器故障。
几种故障:
单机:磁盘故障、内存故障。
机房:计划内(系统维护、硬件升级)、计划外(断电、断网)
因此容错性不可或缺:集群应该有在多点发生故障的情况下仍能正确提供服务的能力。
3) 将计算分布至数据存储节点。
HPC集群中,数据存储与处理(计算)通常由不同节点负责,节点间使用网络互联。但数据密集型处理对于计算能力的需求往往并不非常高,因此存储与计算间的分离使得网络带宽成为整个系统的瓶颈。
MapReduce将数据分布至各个节点存储,计算任务也由这些节点承担。这样很好地利用了局部数据,避免了过多的网络传输。
4) 顺序处理数据,避免随机访问。
数据密集型处理意味着数据集太大,无法一次性读入内存,必须先放置进磁盘。
磁盘的随机访问性能不高是由磁盘的机械原理决定的(盘片旋转,磁头寻道、读取)。
磁盘在顺序访问数据时吞吐量最大。因此应该尽量顺序访问,避免随机访问。
例子:
一个1TB的数据集,包含1010条数据,每条100B. 单机处理。
随机访问:随机更新其中1%的条目,耗费1个月。
顺序访问:顺序读入->更新->顺序写出。遍历处理整个数据集,1天内完成。
MapReduce适合设计在大数据集上进行批处理的算法。分布至本节点的数据集被顺序读入,批量处理,最大程度利用了本地磁盘的I/O带宽。
5) 对开发者隐藏系统级细节。
写程序难:程序员需要同时考虑的问题太多(代码设计细节,算法,系统等)
写分布式程序更难:需要处理线程、进程、机器通信。且各处理机并行运行,执行序列不可知,出现问题难以调试。
MapReduce模型抽象了系统底层的细节(锁、进程通信等),程序员只需要关注与数据处理相关的算法细节。运行时,MapReduce执行框架确保执行操作的正确性。
对分离what和how的理解: 有了MapReduce,程序员只需要描述你要做什么(what),而对于系统是怎么去做的(how),MapReduce已经抽象好了,无需程序员操心。
6) 无缝扩展能力。
对扩展能力的需求:(1) 需要处理更大的数据集 (2) 即使数据规模不变,扩展集群也可以使得现有任务的执行更快。
因为5),使用MapReduce编写的程序具有很好的扩展性:运行在包含10台机器的集群上的程序,只需很少的改动(甚至完全不需改动)就可以运行在包含100台机器的集群上。
1.3 MapReduce的不同之处
一方面,单机性能的增长已经接近极限:频率、带宽、延迟很难再有突破性的发展。多核时代已经到来,并行处理算法是唯一解决之道。
另一方面,大数据处理已经变得颇为棘手。以前只有有限的几个大公司有大数据处理的需求,但随着存储器价格的下降与Web上用户产生内容的增加,出现了越来越多的大数据处理需求。受此启发,Google提出了MapReduce框架。现在,每个人都可以使用Hadoop(一个MapReduce的开源实现)编写程序,然后租用云提供商的计算环境完成大数据处理。
MapReduce为什么重要?简单来说,它是一个处理大数据极为有效的工具。更深一层,它改变了我们构建大规模计算的方式。MapReduce本质上是一个桥接模型,将分布式算法的设计与底层的分布式硬件执行环境桥接起来。它在将算法设计从冯氏物理计算机模型中剥离出来的道路上走出了第一步。这是MapReduce之前的分布式计算模型(例如PRAM、LogP、BSP等)所没有做到的。
MapReduce之后会是什么?谁也说不好。但不知道MapReduce能做什么、不能做什么,是不可能对这个问题作出回答的。