以Hadoop入门大数据

一、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上的大数据并行计算模型
  • 其他相关project

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生态圈:
    • 2
    • 大数据本身是个很宽泛的概念,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生态圈
    • 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对比Hadoop重要优势
    • Spark最重要优点就是快。为什么Spark比较快呢?我们来看看下图。
    • spark-hadoop2
    • 传统Hadoop计算过程中,MapReduce任务需要跑很多次,需要多次迭代,每次迭代计算的结果都需要存下来,存到HDFS,而HDFS本身就是一些硬盘,所以本质上就是把每次计算的结果存到硬盘上。而且存到硬盘上还需要考虑备份,一般是三次备份。于是计算总时间中一大部分将花到硬盘存储上。之前我们提到程序运行时间,知道它包括四个因素:计算时间,数据传输时间,任务调度时间,和并行度。在传统MapReduce计算当中,存储占用了大部分时间。而Spark不同,它是将中间计算的结果放在内存当中,然后在内存中进行迭代计算,速度自然更快。另外,Spark还存下了计算结果从何而来,即Lineage。如果内存数据丢失,通过Lineage再找父母要,再计算一遍。虽然重复计算丢失的数据将花费较多时间,但是数据丢失的概率很低,所有Spark整体计算的速度将提升10到100倍。
    • 我们再来看看Spark之所以快的一些数字。
    • spark-hadoop3
    • 由上图可见,CPU直接访问内存,速度将达到10GB/s。而访问本地硬盘,速度降为100MB/s,跟访问内存的速度相差100倍。如果访问SSD硬盘,速度可以达到600MB/s,但是SSD的价格很高。如果是同机架网络访问,速度差不多是125MB/s,比访问本地硬盘还要稍快一些。而如果是跨机架网络访问,速度仅为12.5MB/s。
  • 批处理和流处理计算
    • storm是典型的流计算系统,mapreduce是典型的批处理系统。下面对流计算和批处理系统流程
    • 这个个数据处理流程来说大致可以分三个阶段:
      1. 数据采集与准备
      2. 数据计算(涉及计算中的中间存储), 题主中的“那些方面决定”应该主要是指这个阶段处理方式。
      3. 数据结果展现(反馈)
    • 数据采集阶段,目前典型的处理处理策略:数据的产生系统一般出自页面打点和解析DB的log,流计算将数据采集中消息队列(比如kafaka,metaQ,timetunle)等。批处理系统一般将数据采集进分布式文件系统(比如HDFS),当然也有使用消息队列的。我们暂且把消息队列和文件系统称为预处理存储。二者在延时和吞吐上没太大区别,接下来从这个预处理存储进入到数据计算阶段有很大的区别,流计算一般在实时的读取消息队列进入流计算系统(storm)的数据进行运算,批处理一系统一般会攒一大批后批量导入到计算系统(hadoop),这里就有了延时的区别。
    • 数据计算阶段,流计算系统(storm)的延时低主要有一下几个方面(针对题主的问题)

      A: storm 进程是常驻的,有数据就可以进行实时的处理。mapreduce 数据攒一批后由作业管理系统启动任务,Jobtracker计算任务分配,tasktacker启动相关的运算进程
      B: stom每个计算单元之间数据之间通过网络(zeromq)直接传输。mapreduce map任务运算的结果要写入到HDFS,在于reduce任务通过网络拖过去运算。相对来说多了磁盘读写,比较慢
      C: 对于复杂运算,storm的运算模型直接支持DAG(有向无环图)。mapreduce 需要肯多个MR过程组成,有些map操作没有意义的

    • 数据结果展现:流计算一般运算结果直接反馈到最终结果集中(展示页面,数据库,搜索引擎的索引)。而mapreduce一般需要整个运算结束后将结果批量导入到结果集中。实际流计算和批处理系统没有本质的区别,像storm的trident也有批概念,而mapreduce可以将每次运算的数据集缩小(比如几分钟启动一次),facebook的puma就是基于hadoop做的流计算系统。
  • MR计算模型mr
    • The Domain Language of Batch
    • Apache Beam
    • 流式大数据处理的三种框架:Storm,Spark和Samza
    • 流处理技术应用场景
      • 1、无应答模式:该模式下数据流产生者并不关心数据流的用途,数据流处理模块根据对数据流的解析,规则匹配发现重要的业务事件,并根据业务规则发起动作。如用户业务量数据时不断变化的,可以根据数据量的变化检测是否即将达到用户套餐的范围,如果接近一定范围,则对用户进行提醒或者营销。
      • 2、无呼叫应答模式:呼叫应答模式是目前应用最广泛的模式,该模式下数据流产生者需要得到数据流处理模块对每个细粒度数据流对象的应答信息,并对收到的信息进行处理。如在线个性化推荐,用户在网页点击产生数据流 A,流处理模块通过对数据单元 A 的处理,向数据流生产模块反馈对此次点击的响应信息 B,数据流生产模块完成对响应信息 B 的处理(如展现);在这种模式下,数据响应等级要求较高,往往是微秒到毫秒级的数据响应要求。
      • 3、准实时跟踪模式:该模式常用于业务监控,通过对数据流生产者产生的数据进行微批处理的数据统计,并将统计结果展示。如对分布式集群的运行状态监控,通过读取各节点的 CPU/IO 等信息进行展示,或者对业务办理量的监控。将较小单位时间的业务办理量进行展示。比如,阿里云ECS实例的CPU、内存、入出流量监控等
    • 流处理在电信运营商的应用场景
    • 中国移动几年前手机还有几毛钱的时候再打差不多一个小时电话都没事,现在几乎占不了移动的便宜了。以前没有大数据、电信运营商的老旧机器扛不住,计费延迟特别大,现在应用了Hadoop、spark等云计算、实时流处理技术,在想用几毛钱的余额使劲打电话、上网超流量几乎是不可能了(无信用额度的手机号)。

(全文完)

(转载本站文章请注明作者和出处 以Hadoop入门大数据