大数据生态及其技术栈

大数据生态及其技术栈

原文:大数据生态及其技术栈html

如何用形象的比喻描述大数据的技术生态?Hadoop、Hive、Spark 之间是什么关系?对于大部分人来讲都是傻傻分不清楚。程序员

今年来大数据、人工智能得到了IT界大量的关注。若是一个企业不玩大数据,都很差意思说本身是在IT圈混的。我敢打赌,你在中关村西二旗地铁站溜一圈,保准你会听到以下名词:Hadoop、Spark、MapReduce、NoSQL、离线计算、实时计算、实时推送等等一大串名称。程序猿哥哥们就是有这么实在,坐在地铁上还能那么投入的讨论技术问题。那么,这些听起来高大上的技术,究竟都是干什么用的呢?他们之间的有什么区别和联系?算法

一般,一个技术的兴起,都是由现实需求驱动的。了解了咱们面临的问题,就能更好的理解各个大数据技术的使用场景,各种大数据技术的区别也就显而易见了。sql

网易大数据工程师@Xiaoyu Ma对大数据的话题进行了通俗的解读,各位准备好小板凳,开讲啦...数据库

首先上一张大数据生态系统的图:apache

hadoop-ecosystem

Hadoop生态系统概览编程

而后了解大数据技术栈中常见的概念:架构

Hadoop:Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特色,而且设计用来部署在低廉的(low-cost)硬件上;并且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,能够以流的形式访问(streaming access)文件系统中的数据。app

Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。框架

HDFS:Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有不少共同点。但同时,它和其余的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,很是适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是做为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。HDFS有着高容错性(fault-tolerant)的特色,而且设计用来部署在低廉的(low-cost)硬件上。并且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样能够实现流的形式访问(streaming access)文件系统中的数据。

Spark: Spark是一个高效的分布式计算系统,相比Hadoop的Mapreduce计算框架,它在性能上比Mapreduce要高100倍。Spark提供比Hadoop更上层的API,一样的算法在Spark中实现每每只有Hadoop的1/10或者1/100的长度。Shark相似“SQL on Spark”,是一个在Spark上数据仓库的实现,在兼容Hive的状况下,性能最高能够达到Hive的一百倍。

HBase:是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化数据集群。像Facebook,都拿它作大型实时应用 Facebook's New Realtime Analytics System: HBase to Process 20 Billion Events Per Day

Pig:Yahoo开发的,并行地执行数据流处理的引擎,它包含了一种脚本语言,称为Pig Latin,用来描述这些数据流。Pig Latin自己提供了许多传统的数据操做,同时容许用户本身开发一些自定义函数用来读取、处理和写数据。在LinkedIn也是大量使用。

Hive:Facebook领导的一个数据仓库工具,能够将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,能够将sql语句转换为MapReduce任务进行运行。其优势是学习成本低,能够经过类SQL语句快速实现简单的MapReduce统计。像一些data scientist 就能够直接查询,不须要学习其余编程接口。

Cascading/Scalding:Cascading是Twitter收购的一个公司技术,主要是提供数据管道的一些抽象接口,而后又推出了基于Cascading的Scala版本就叫Scalding。Coursera是用Scalding做为MapReduce的编程接口放在Amazon的EMR运行。

Zookeeper:一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。

Oozie:一个基于工做流引擎的开源框架。由Cloudera公司贡献给Apache的,它可以提供对Hadoop MapReduce和Pig Jobs的任务调度与协调。

Azkaban: 跟上面很像,Linkedin开源的面向Hadoop的开源工做流系统,提供了相似于cron 的管理任务。

Tez:Hortonworks主推的优化MapReduce执行引擎,与MapReduce相比较,Tez在性能方面更加出色。

Mesos:一个分布式环境的资源管理平台,它使得Hadoop、MPI、Spark做业在统一资源管理环境下执行。它对Hadoop2.0支持很好。Twitter,Coursera都在使用。

Tachyon:是一个高容错的分布式文件系统,容许文件之内存的速度在集群框架中进行可靠的共享,就像Spark和MapReduce那样。有幸跟项目发起人李浩源聊过几回,这个项目目前发展很是快,甚至比Spark当时还要惊人。目前到0.6版本,参与开源的规模和版本迭代速度都很快。已经拿到著名VC A16Z 750万美金的投资,https://www.crunchbase.com/organization/tachyon-networks

看了这么多大数据相关概念,相信你对大数据技术栈更迷糊了。下面是一段更加通俗的解读:

大数据自己是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的。你能够把它比做一个厨房因此须要的各类工具。锅碗瓢盆,各有各的用处,互相之间又有重合。你能够用汤锅直接当碗吃饭喝汤,你能够用小刀或者刨子去皮。可是每一个工具备本身的特性,虽然奇怪的组合也能工做,可是未必是最佳选择。

大数据,首先你要能存的下大数据。
传统的文件系统是单机的,不能横跨不一样的机器。HDFS(Hadoop Distributed FileSystem)的设计本质上是为了大量的数据能横跨成百上千台机器,可是你看到的是一个文件系统而不是不少文件系统。好比你说我要获取/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(我这里把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。这解决了中低速数据处理的要求。

那若是我要更高速的处理呢?
若是我是一个相似微博的公司,我但愿显示不是24小时热博,我想看一个不断变化的热播榜,更新延迟在一分钟以内,上面的手段都将没法胜任。因而又一种计算模型被开发出来,这就是Streaming(流)计算。Storm是最流行的流计算平台。流计算的思路是,若是要达到更实时的更新,我何不在数据流进来的时候就处理了?好比仍是词频统计的例子,个人数据流是一个一个的词,我就让他们一边流过我就一边开始统计了。流计算很牛逼,基本无延迟,可是它的短处是,不灵活,你想要统计的东西必须预先知道,毕竟数据流过就没了,你没算的东西就没法补算了。所以它是个很好的东西,可是没法替代上面数据仓库和批处理系统。

还有一个有些独立的模块是KV Store,好比Cassandra,HBase,MongoDB以及不少不少不少不少其余的(多到没法想象)。因此KV Store就是说,我有一堆键值,我能很快速滴获取与这个Key绑定的数据。好比我用身份证号,能取到你的身份数据。这个动做用MapReduce也能完成,可是极可能要扫描整个数据集。而KV Store专用来处理这个操做,全部存和取都专门为此优化了。从几个P的数据中查找一个身份证号,也许只要零点几秒。这让大数据公司的一些专门操做被大大优化了。好比我网页上有个根据订单号查找订单内容的页面,而整个网站的订单数量没法单机数据库存储,我就会考虑用KV Store来存。KV Store的理念是,基本没法处理复杂的计算,大多无法JOIN,也许无法聚合,没有强一致性保证(不一样数据分布在不一样机器上,你每次读取也许会读到不一样的结果,也没法处理相似银行转帐那样的强一致性要求的操做)。可是丫就是快。极快。
每一个不一样的KV Store设计都有不一样取舍,有些更快,有些容量更高,有些能够支持更复杂的操做。必有一款适合你。

除此以外,还有一些更特制的系统/组件,好比Mahout是分布式机器学习库,Protobuf是数据交换的编码和库,ZooKeeper是高一致性的分布存取协同系统,等等。

有了这么多乱七八糟的工具,都在同一个集群上运转,你们须要互相尊重有序工做。因此另一个重要组件是,调度系统。如今最流行的是Yarn。你能够把他看做中央管理,比如你妈在厨房监工,哎,你妹妹切菜切完了,你能够把刀拿去杀鸡了。只要你们都服从你妈分配,那你们都能愉快滴烧菜。

你能够认为,大数据生态圈就是一个厨房工具生态圈。为了作不一样的菜,中国菜,日本菜,法国菜,你须要各类不一样的工具。并且客人的需求正在复杂化,你的厨具不断被发明,也没有一个万用的厨具能够处理全部状况,所以它会变的愈来愈复杂。

相关文章
相关标签/搜索