大数据生态圈及其衍生物


大数据这个概念本身就太大而且太宽,如果一定要严格定义是非常困难的一件事,不过 Hadoop 生态圈或者由其延伸的泛生态系统,基本上都是为了处理大量数据诞生的——一般而言,这种数据依赖单机很难完成。

这个圈子里的工具,就像是我们厨房里的各种厨具——各自都有不同的用处,但也有一部分功能重合,比如盆和豌都可以用来喝汤,削皮刀和菜刀都可以用来去皮。
大数据_数据分析_数据处理

 

但是,盆用来喝汤未免奇怪,削皮刀切菜也是万万不能。即使你强行要创造一些奇异的组合,即使最终完成工作,却不一定是最快、最好的选择。

大数据,首先你要能存的下大数据

对传统的单机文件系统来说,横跨不同机器几乎是不可能完成的任务。而通过 HDFS(Hadoop Distributed FileSystem),你可以通过横跨上千甚至上万台机器来完成大量数据得存储,同时这些数据全部都能归属在同一个文件系统之下。你可以通过引用一个文件路径获取存储在许多台机器上的数据文件。作为一个使用者,你完全不用去计较文件具体存储的位置,这个文件系统会为你搞定一切。

我们当然不是为了搜集数据而进行存储,我们还要用数据做一些事情。虽然我们通过 HDFS 存下了横跨上千台机器的数据,我们依然面临一个问题——这些数据过于庞大,如果只交给一台机器处理,我们可能得等上几周甚至更长。这些可能以 T 甚至于 P 来计量单位的数据,只靠一台机器真的能跑到地老天荒。

对于很多公司,这是无法接受的事情——我们都知道有各种热度排行,加入一台机器处理这个数据、计算热度、进行发布,可能一周之后出来结果,但大家早已经不关心了。

所以使用大量机器进行处理是必然的选择。在大量机器处理过程中,必须处理一些事务:任务分配、紧急情况处理、信息互通等等,这时候必须引入 MapReduce / Tez / Spark 。这其中,前者可以成为计算引擎的第一代产品,后两者则是经过优化后的下一代。MapReduce 采用了非常简单的计算模型设计,可以说只用了两个计算的处理过程,但是这个工具已经足够应付大部分的大数据工作了。

什么是 Map? 什么是 Reduce?

考虑如果你要统计一个巨大的文本文件存储在类似 HDFS 上,你想要知道这个文本里各个词的出现频率。你启动了一个 MapReduce 程序。Map 阶段,几百台机器同时读取这个文件的各个部分,分别把各自读到的部分分别统计出词频,产生类似 (hello, 12100 次),(world,15214 次) 等等这样的 Pair(我这里把 Map 和 Combine 放在一起说以便简化); 这几百台机器各自都产生了如上的集合,然后又有几百台机器启动 Reduce 处理。Reducer 机器 A 将从 Mapper 机器收到所有以 A 开头的统计结果,机器 B 将收到 B 开头的词汇统计结果(当然实际上不会真的以字母开头做依据,而是用函数产生 Hash 值以避免数据串化。因为类似 X 开头的词肯定比其他要少得多,而你不希望数据处理各个机器的工作量相差悬殊)。然后这些 Reducer 将再次汇总,(hello,12100)+(hello,12311)+(hello,345881)= (hello,370292)。每个 Reducer 都如上处理,你就得到了整个文件的词频结果。

这看似是个很简单的模型,但很多算法都可以用这个模型描述了。

Map+Reduce 的简单模型很黄很暴力,虽然好用,但是很笨重。第二代的 Tez 和 Spark 除了内存 Cache 之类的新 feature,本质上来说,是让 Map/Reduce 模型更通用,让 Map 和 Reduce 之间的界限更模糊,数据交换更灵活,更少的磁盘读写,以便更方便地描述复杂算法,取得更高的吞吐量。

有了 MapReduce,Tez 和 Spark 之后,程序员发现,MapReduce 的程序写起来真麻烦。他们希望简化这个过程。这就好比你有了汇编语言,虽然你几乎什么都能干了,但是你还是觉得繁琐。你希望有个更高层更抽象的语言层来描述算法和数据处理流程。于是就有了 Pig 和 Hive。Pig 是接近脚本方式去描述 MapReduce,Hive 则用的是 SQL。它们把脚本和 SQL 语言翻译成 MapReduce 程序,丢给计算引擎去计算,而你就从繁琐的 MapReduce 程序中解脱出来,用更简单更直观的语言去写程序了。

有了 Hive 之后,人们发现 SQL 对比 Java 有巨大的优势。一个是它太容易写了。刚才词频的东西,用 SQL 描述就只有一两行,MapReduce 写起来大约要几十上百行。而更重要的是,非计算机背景的用户终于感受到了爱:我也会写 SQL! 于是数据分析人员终于从乞求工程师帮忙的窘境解脱出来,工程师也从写奇怪的一次性的处理程序中解脱出来。大家都开心了。Hive 逐渐成长成了大数据仓库的核心组件。甚至很多公司的流水线作业集完全是用 SQL 描述,因为易写易改,一看就懂,容易维护。

自从数据分析人员开始用 Hive 分析数据之后,它们发现,Hive 在 MapReduce 上跑,真鸡巴慢! 流水线作业集也许没啥关系,比如 24 小时更新的推荐,反正 24 小时内跑完就算了。但是数据分析,人们总是希望能跑更快一些。比如我希望看过去一个小时内多少人在充气娃娃页面驻足,分别停留了多久,对于一个巨型网站海量数据下,这个处理过程也许要花几十分钟甚至很多小时。而这个分析也许只是你万里长征的第一步,你还要看多少人浏览了跳蛋多少人看了拉赫曼尼诺夫的 CD,以便跟老板汇报,我们的用户是猥琐男闷骚女更多还是文艺青年 / 少女更多。你无法忍受等待的折磨,只能跟帅帅的工程师蝈蝈说,快,快,再快一点!

于是 Impala,Presto,Drill 诞生了 (当然还有无数非着名的交互 SQL 引擎,就不一一列举了)。三个系统的核心理念是,MapReduce 引擎太慢,因为它太通用,太强壮,太保守,我们 SQL 需要更轻量,更激进地获取资源,更专门地对 SQL 做优化,而且不需要那么多容错性保证 (因为系统出错了大不了重新启动任务,如果整个处理时间更短的话,比如几分钟之内)。这些系统让用户更快速地处理 SQL 任务,牺牲了通用性稳定性等特性。如果说 MapReduce 是大砍刀,砍啥都不怕,那上面三个就是剔骨刀,灵巧锋利,但是不能搞太大太硬的东西。

这些系统,说实话,一直没有达到人们期望的流行度。因为这时候又两个异类被造出来了。他们是 Hive on Tez / Spark 和 SparkSQL。它们的设计理念是,MapReduce 慢,但是如果我用新一代通用计算引擎 Tez 或者 Spark 来跑 SQL,那我就能跑的更快。而且用户不需要维护两套系统。这就好比如果你厨房小,人又懒,对吃的精细程度要求有限,那你可以买个电饭煲,能蒸能煲能烧,省了好多厨具。

上面的介绍,基本就是一个数据仓库的构架了。底层 HDFS,上面跑 MapReduce/Tez/Spark,在上面跑 Hive,Pig。或者 HDFS 上直接跑 Impala,Drill,Presto。这解决了中低速数据处理的要求。
来源:大数据观察
45期CPDA课程