一、hadoop简介
1.什么是hadoop
apache hadoop project 生产出的用于高可靠、可扩展、分布式计算的开源软件,它允许通过集群的方式使用简单的编程模型分布式处理大数据,它可以从单一的服务器扩展到成千上万的机器,每一台机器都能提供本地计算和存储。hadoop认为集群中节点故障为常态,它可以自动检测和处理故障节点,所以它不依赖硬件来提供高可用性。简单的说,我们可以用hadoop分布式存储大量数据,然后根据自己的业务对海量数据进行分布式计算。例如:淘宝网昨天24小时的用户访问量折线图,不同地区、不同时段、不同终端中国apache hadoop project 包含的模块hadoop common :the common utilities that support the other hadoop modules.hadoop distributed file system (hdfs): 高吞吐分布式文件系统hadoop yarn: 作业(job)安排和资源调度平台/框架hadoop mapreduce: 运行在yarn上的大数据并行计算模型其他相关projectambarihbasehivesparkzookeeper...
2.hadoop产生背景
doug cutting是lucene、nutch 、hadoop等项目的发起人hadoop最早起源于nutch。nutch的设计目的是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题:如何解决数十亿网页的存储和索引问题。2003、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。分布式文件系统(gfs),可用于处理海量网页存储分布式计算框架(mapreduce),可用于海量网页的索引计算问题谷歌在03到06年间连续发表了三篇很有影响力的文章,分别是03年sosp的gfs,04年osdi的mapreduce,和06年osdi的bigtable。sosp和osdi都是操作系统领域的顶级会议,在计算机学会推荐会议里属于a类。sosp在单数年举办,而osdi在双数年举办。nutch开发人员完成了相应的开源实现hdfs和mapreduce,并从nutch中剥离成为独立项目hadoop,直到2008年,hadoop成为apache顶级项目,之后快速发展。到现在hadoop已经形成了完善的生态圈,
3.hadoop生态相关
bdas(berkeley data analytics stack),这个伯克利大学提出的关于数据分析的软件栈。从它的视角来看,目前的大数据处理可以分为如以下三个类型。复杂的批量数据处理(batch data processing),通常的时间跨度在数十分钟到数小时之间。基于历史数据的交互式查询(interactive query),通常的时间跨度在数十秒到数分钟之间。基于实时数据流的数据处理(streaming data processing),通常的时间跨度在数百毫秒到数秒之间。
hadoop生态圈:
大数据本身是个很宽泛的概念,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。你可以把他看作中央管理,好比你妈在厨房监工,哎,你妹妹切菜切完了,你可以把刀拿去杀鸡了。只要大家都服从你妈分配,那大家都能愉快滴烧菜。你可以认为,大数据生态圈就是一个厨房工具生态圈。为了做不同的菜,中国菜,日本菜,法国菜,你需要各种不同的工具。而且客人的需求正在复杂化,你的厨具不断被发明,也没有一个万用的厨具可以处理所有情况,因此它会变的越来越复杂。
spark生态圈
谷歌三篇论文(google file system,map reduce,bigtable)发布后,很多人开始进行学习,并在此基础上开发出各种hadoop计算平台,进行通用批处理计算(general batch processing)。之后,人们针对各种不同的计算模型开发了各种专门系统(specialized systems),比如说迭代式的,机器学习的,流处理的,图像的和sql相关的系统。最后就是spark,它作为一种通用的统一的计算引擎(general unified engine),希望能够一统江湖。从内往外看,生态圈核心是spark core,包括各种spark的各种核心组件,它们能够对内存和硬盘进行操作,或者调用cpu进行计算。紧邻核心圈的是与spark相关的各类接口,比如java,python和r等。这些接口的外部是针对不同类型数据的计算引擎。比如说针对关系型数据进行处理的spark sql,针对对流数据进行打包批量处理的spark steam,针对machine learning相关的库mlib,针对图的graphx,以及针对大规模数据进行采样和计算从而缩短计算时间的blinkdb。再往外就是spark运行的各种场景。比如说单机运行,在yarn上进行管理运行等等。最外层就涉及基础数据存储。我们可以用文档型数据库,关系型数据库,图数据库等等。所有这些数据存储系统spark都能访问,这归功于techyon。它对底层不同的数据存储系统进行封装,提供统一的api进行访问。它还可以看作是是对底层数据的缓存,更多关于techyon的内容可以参照深入浅出techyon。spark生态圈的各个部分跟传统hadoop系统的对应关系
spark对比hadoop重要优势spark最重要优点就是快。为什么spark比较快呢?我们来看看下图。
传统hadoop计算过程中,mapreduce任务需要跑很多次,需要多次迭代,每次迭代计算的结果都需要存下来,存到hdfs,而hdfs本身就是一些硬盘,所以本质上就...