我们正面临着大数据时代带给我们的数据冲击,衍生出一系列的大数据产品,比如:Hadoop、HDFS、MapReduce、Yarn、Spark、Mahout、Hive、Pig、HBase、NoSQL、Redis等等。图1为大数据技术生态架构图。
大数据是个很宽泛的概念,大数据技术生态的构成也是为了解决单机无法进行大数据的 存储 和 处理。可以将大数据生态比作厨房,生态中的各种技术可以看做厨房中的工具:刀子、锅碗瓢盆。每个工具各司其职,又可互相组合使用,比如,用汤碗代替碗吃饭。
大数据需要解决数据存储和数据处理两大问题。
数据存储:传统的文件存储都是单机的,无法存储大数据。因此HDFS(Hadoop Distributed File System)作为分布式文件存储,设计初衷就是为了将文件存储到多台机器中,而用户面对的仅是一个文件系统,而不必关心文件具体存储在哪台机器中,就像你不必知道在单机下文件分散在哪些磁盘扇区当中,磁盘管理会进行管理。相应的HDFS会管理分布式的数据。
数据处理:数据存储后,考虑如何处理数据。现在面临着大数据存储在多台机器中,如何让多台机器进行互相通信交换数据以完成复杂的计算。这就是MapReduce/Tez/Spark的功能。MapReduce是第一代计算引擎,Tez和Spark是第二代计算引擎。MapReduce简化了计算方式,只有Map和Reduce计算过程。虽然好用,但是计算笨拙,需要频繁访问磁盘以获得中间计算结果。第二代的Tez和Spark除了基于内存Cache的计算特点,本质上是使Map/Reduce模型更通用,模糊Map和Reduce间的界限,数据交换更灵活,更少的磁盘读写。
(总结:MapReduce基于磁盘,Tez和Spark基于内存)
有了MapReduce、Tez和Spark后,但MapReduce程序写起来很麻烦,好比有了汇编语言觉得很繁琐,希望有更高层更抽象的语言来描述算法和数据处理流程,于是有了Pig和Hive。Pig采用接近脚本方式去描述MapReduce过程,Hive则采用SQL。将脚本和SQL语言翻译成MapReduce程序,丢给计算引擎去计算,从繁琐的MapReduce程序中解脱出来。
有了Hive后,发现SQL相对于Java有更大优势。容易写,且门槛低,非计算机背景人员、数据分析人员都能操作。因此,Hive逐渐成为大数据仓库的核心组件,甚至很多公司的流水线作业完全是SQL描述,易写易改易维护。
之后采用Hive后,又发现在MapReduce上跑速度很慢,于是Impapa、Presto、Drill(著名的交互SQL引擎)。核心理念是,MapReduce引擎太慢,SQL需要更轻量的引擎,需要对SQL做优化,不需要那么多的容错性保证(因为系统出错,大不了重新启动任务,假设了整个处理时间更短)。
紧接着,Hive on Tez/Spark和SparkSQL,设计理念是MapReduce慢,用新的计算引擎Tez/Spark来跑SQL,能跑的更快。
总结来说,一个数据仓库架构显现:底层HDFS,上面跑MapReduce/Tez/Spark,在上面跑Hive/Pig。或者HDFS上直接跑Impala,Drill,Presto。
如果需要更高速的处理,比如类似微博热搜,更新延迟在一分钟内,就需要Streaming流计算框架,Storm是最流行的流计算平台,达到实时的更新需求,在数据流进来的时候就处理数据,一边数据流入,一边处理。
还有些为高效存取而设计的存储数据库,比如Redis缓存数据库,KV Store,HBase,MongoDB。设计键值对,能够根据键 快速获取 值内容。不同的设计有不同的取舍、需求。有些更快、有些容量更高,有些可以支持复杂操作。
除此之外,还有一些特制的组件,Mahout用于分布式机器学习,Protobuf数据交换的编码和库,ZooKeeper是高一致性的分布存取协同系统。以及在集群中统一管理调度的Yarn组件,负责中央管理监控。