随着Hadoop/Spark技术的蓬勃发展,用于解决大数据分析的技术平台开始涌现。Hadoop/Spark凭借性能强劲、高度容错、调度灵活等技术优势已渐渐成为主流技术,业界大部分厂商都提供了基于Hadoop/Spark的技术方案和产品。
在使用Hadoop/Spark作为大数据计算平台的解决方案中,有两种主流的编程模型,一类是基于Hadoop/Spark API或者衍生出来的语言,另一种是基于SQL语言。SQL作为数据库领域的事实标准语言,相比较用API(如MapReduce API,Spark API等)来构建大数据分析的解决方案有着先天的优势:一是产业链完善,各种报表工具、ETL工具等可以很好的对接;二是用SQL开发有更低的技术门槛;三是能够降低原有系统的迁移成本等。因此,SQL语言渐渐成为大数据分析的主流技术标准之一。
让我们首先回头看看Hadoop/Spark的发展史。
Hadoop生态圈基本上是为了处理超过单机尺度的数据处理而诞生的。你可以把生态圈比作一个厨房所需要的各种工具:锅碗瓢盆,各有各的用处,互相之间又有重合。你可以用汤锅直接当碗吃饭喝汤,你也可以用小刀或者刨子去皮。每个工具都有自己的特性,也能组合起来工作,但要达到最佳效果,则需要一番努力。
首先你要能存的下大数据。
传统的文件系统是单机的,不能横跨不同的机器。HDFS(Hadoop Distributed File System)的设计本质上是为了大量的数据能横跨成百上千台机器,但是你看到的是一个文件系统而不是很多文件系统。比如你说我要获取路径为“/hdfs/tmp/file1”的数据,你可以只用引用一个文件路径,但是实际的数据存放在很多不同的机器上。你作为用户,不需要知道这些,就好比在单机上你不关心文件分散在什么磁道什么扇区一样。HDFS为你透明地管理这些分布式的数据。
存下数据之后,你就开始考虑怎么处理数据。虽然HDFS可以为你整体管理不同机器上的数据,但是这些数据太大了。如果只让一台机器读取成T上P的数据,很多时候需要好几天甚至好几周的时间。因此,对于很多应用场景来说,单机处理是不可忍受的,比如微博要更新24小时热博,它必须在24小时之内跑完这些处理。那么我如果要用很多台机器处理,我就面临了如何分配工作,如果一台机器挂了如何重新启动相应的任务,机器之间如何互相通信交换数据以完成复杂的计算等等。这就是MapReduce/Tez/Spark的功能。MapReduce是第一代计算引擎,Tez和Spark是第二代。MapReduce的设计,采用了很简化的计算模型,只有Map和Reduce两个计算过程(中间用Shuffle串联),用这个模型,已经可以处理大数据领域很大一部分问题了。
那么什么是Map什么是Reduce?
考虑如果你要统计一个巨大的文本文件存储在类似HDFS上,你想要知道这个文本里各个词的出现频率。你启动了一个MapReduce程序。在Map阶段,几百台机器同时读取这个文件的各个部分,分别把各自读到的部分分别统计出词频,产生类似(hello, 12100次),(world,15214次)等等这样的Pair;这几百台机器各自都产生了如上的集合,然后又有几百台机器启动Reduce处理。Reducer机器A将从Mapper机器收到所有以A开头的统计结果,机器B将收到B开头的词汇统计结果。然后这些Reducer将再次汇总,(hello,12100)+(hello,12311)+(hello,345881)= (hello,370292)。每个Reducer都如上处理,你就得到了整个文件的词频结果。
这看似是个很简单的模型,但很多算法都可以用这个模型描述了。
Map + Reduce的简单模型虽然好用,但是很笨重。第二代的Tez和Spark本质上来说,是让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小时内跑完就算了。但是数据分析,人们总是希望能跑更快一些。比如我希望看过去一个小时内多少人在某一页面驻足,分别停留了多久,对于一个巨型网站海量数据下,这个处理过程也许要花几十分钟甚至很多小时。于是Impala,Presto,Drill等诞生了。三个系统的核心理念是,MapReduce引擎太慢,因为它太通用,太强壮,太保守,我们SQL需要更轻量,更激进地获取资源,更专门地对SQL做优化,而且不需要那么多容错性保证。这些系统让用户更快速地处理SQL任务,牺牲了通用性稳定性等特性。如果说MapReduce是大砍刀,砍啥都不怕,那上面三个就是剔骨刀,灵巧锋利,但是不能搞太大太硬的东西。
上述这些系统一直没有达到人们期望的需求,因此,又有两个新的解决方案出来了,他们就是Hive on Tez/Spark和Spark SQL。它们的设计理念是,MapReduce慢,但是如果我用新一代通用计算引擎Tez或者Spark来跑SQL,那我就能跑的更快。而且用户不需要维护两套系统。这就好比如果你厨房小,人又懒,对吃的精细程度要求有限,那你可以买个电饭煲,能蒸能煲能烧,省了好多厨具。
上面的这些介绍,基本就是一个数据仓库的构架了。底层HDFS,上面跑MapReduce/Tez/Spark,再往上跑Hive,Pig;或者HDFS上直接跑Impala,Drill和Presto。这解决了中低速数据处理的要求。
那如果我要更高速的处理呢?比如一个类似微博的公司,我希望显示的不是一个24小时的热博,而是想看一个不断变化的热播榜,更新延迟在一分钟之内,上面的手段都将无法胜任。于是又一种计算模型被开发出来,这就是Streaming(流)计算。Storm是最流行的流计算平台。流计算的思路是,如果要达到更实时的更新,应该在数据流进来的时候就处理了。比如还是词频统计的例子,我的数据流是一个一个的词,我就让他们一边流过我就一边开始统计了。流计算很厉害,基本无延迟,但是它的短处是不灵活,你想要统计的东西必须预先知道,毕竟数据流过就没了,你没算的东西就无法补算了。因此它是个很好的东西,但是无法替代上面数据仓库和批处理系统。
除了上述围绕SQL的技术路线,还有一个与SQL对应的技术路线,这就是NoSQL。
由于传统的关系数据库所固有的局限性,如峰值性能、伸缩性、容错性、可扩展性差等特性,很难满足海量数据的柔性管理需求。为此,面向海量数据管理的新模式NoSQL出现了。
NoSQL是指那些非关系型的、分布式的、不保证遵循ACID原则的数据存储系统,并分为key-value 存储、文档数据库和图数据库这3类。其中,key-value存储备受关注,已成为NoSQL 的代名词。典型的NoSQL产品有Google的BigTable、基于HDFS的HBase、Amazon的Dynamo、Apache的Cassandra、MongoDB和Redis等。
key-value 存储就是说,我有一堆键值,我能很快速地获取与这个Key绑定的数据。比如我用身份证号,能取到你的身份数据。这个动作用MapReduce也能完成,但是很可能要扫描整个数据集。而key-value 存储专用来处理这个操作,所有存和取都专门为此优化了。从几个P的数据中查找一个身份证号,也许只要零点几秒。这让大数据公司的一些专门操作被大大优化了。比如网页上有个根据订单号查找订单内容的页面,而整个网站的订单数量无法单机数据库存储,这时就可以考虑用key-value 存储技术来存。key-value存储的理念是,基本无法处理复杂的计算,大多没法JOIN,也许没法聚合,没有强一致性保证(不同数据分布在不同机器上,你每次读取也许会读到不同的结果,也无法处理类似银行转账那样的强一致性要求的操作)。
NoSQL典型地遵循CAP理论和BASE原则。CAP理论可简单描述为:一个分布式系统不能同时满足一致性(consistency)、可用性(availability)和分区容错性(partition tolerance)这3 个需求,最多只能同时满足两个。因此,大部分key-value 数据库系统都会根据自己的设计目的进行相应的选择,如Cassandra,Dynamo满足AP;BigTable,MongoDB满足CP;而关系数据库,如Mysql和Postgres满足AC。
BASE即Basically Available(基本可用)、Soft state(柔性状态)和Eventually consistent(最终一致)的缩写。Basically Available是指可以容忍系统的短期不可用,并不强调全天候服务;Soft state是指状态可以有一段时间不同步,存在异步的情况;Eventually consistent是指最终数据一致,而不是严格的时时一致。因此,目前NoSQL数据库大多是针对其应用场景的特点,遵循BASE设计原则,更加强调读写效率、数据容量以及系统可扩展性。
NoSQL对海量数据的存储管理能力强大,但是对ACID和SQL支持不佳。而RDBMS虽然有着ACID和SQL但是对海量数据比较乏力。这种情况下,NewSQL就运应而生。NewSQL是对各种新的可扩展/高性能数据库的简称,这类数据库不仅具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性。
NewSQL系统虽然在的内部结构变化很大,但是它们有两个显着的共同特点:它们都支持关系数据模型、它们都使用SQL作为其主要的接口。
NewSQL系统包括:Clustrix、GenieDB、ScalArc、Schooner、VoltDB、RethinkDB、ScaleDB、Akiban、CodeFutures、ScaleBase、Translattice和NimbusDB,以及Drizzle、带有NDB的MySQL集群和带有Handler Socket的MySQL。相关的“NewSQL作为一种服务”类别则包括亚马逊关系数据库服务,微软的SQL Azure等。
因此,没有任何一款可以应对所有的应用场景,应该根据应用场景选择对的技术。
最后再来看一个大数据商业平台的实际例子。
星环科技大数据处理平台的一个核心产品组件叫Inceptor,是基于Spark的分析引擎。Inceptor可以分析存储在HDFS、HBase中的数据,可以处理的数据量从GB到数十TB,即使数据源或者中间结果的大小远大于内存容量也可高效处理。
Inceptor提供两种编程模型:一是基于SQL的编程模型,用于常规的数据分析、数据仓库类应用市场;二是基于数据挖掘编程模型,可以利用R语言或者Spark MLlib来做一些深度学习、数据挖掘等业务模型。
他们的另外两款产品组件Hyperbase和Stream则是分别针对NoSQL和流计算的应用场景的。这样,多种数据分析语言和工具结合起来,同时统一在一个产品平台当中,就可以对应不同的场景和需求功能了,即所谓的一站式大数据平台。
总结,大数据生态圈和SQL/NoSQL/NewSQL就是一个厨房工具生态圈。为了做不同的菜,中国菜,日本菜,法国菜,你需要各种不同的工具。而且客人的需求正在复杂化,你的厨具不断被发明,也没有一个万用的厨具可以处理所有情况,因此它会变的越来越复杂。
参考文献:
申德荣,于戈,王习特,聂铁铮,寇月.支持大数据管理的NoSQL系统研究综述, 软件学报, 2013, 24(8): 1786-1803.
知乎 - 大数据
---------------------
作者:willtongji
来源:CSDN
原文:https://blog.csdn.net/willtongji/article/details/52874734
版权声明:本文为博主原创文章,转载请附上博文链接!