1.2 数据技术

目前大数据相关的技术可以说是蓬勃发展、百花齐放,对于初入者来说,一个个响亮的名字,一个个眼花缭乱的框架,之前刚了解了一个,很快又跳出来一个,正如白居易的《钱塘湖春行》所言,真的是“乱花渐欲迷人眼”。

但是万变不离其宗,不管这些技术如何变化、名词如何新颖,它们都属于1.1节介绍的某个具体流程和环节,因此下面将结合前面所述的数据流程来介绍当前主要的数据技术和框架。

结合1.1节的数据流程图,当前大数据生态系统的主要开源技术和框架如图1-2所示。

图1-2 当前大数据生态系统的主要开源技术和框架

出于篇幅和开源框架实际情况考虑,图1-2并没有列出所有数据相关的开源技术框架,比如SQL on Hadoop方面的技术还有很多(如Cloudera Impala、Presto、Shark、Dremel等),数据采集传输还有Chukwa、RabbitMQ等,数据存储还包含Redis缓存数据库以及MySQL等关系型数据库。此外,IBM、微软、Oracle、Informatica等大公司的商业软件和技术尚不在此列。

但正是这些所有的数据技术一起构成了目前大数据的生态系统,各种技术你中有我,我中有你,互相借鉴,互相启发。实际上很多技术甚至其基本原理都是类似的,只是由于商业的、社区的或者甚至私人的各种原因,它们才独立出来。也许正是这样,才促成了目前大数据整个生态圈的繁荣和欣欣向上,正如一句诗所言:“一花独放不是春,万紫千红春满园”。

下面逐一介绍图1-2中提到的各种技术。

1.2.1 数据采集传输主要技术

数据采集传输工具和技术主要分为两大类:离线批处理和实时数据采集和传输。顾名思义,离线批处理主要是批量一次性采集和导出数据。离线批处理目前比较有名和常用的工具是Sqoop,下游的用户主要是离线数据处理平台(如Hive等)。实时数据采集和传输最为常用的则是Flume和Kafka,其下游用户一般是实时流处理平台,如Storm、Spark、Flink等。

(1)Sqoop

Sqoop(发音:skup)作为一款开源的离线数据传输工具,主要用于Hadoop(Hive)与传统数据库(MySQL、PostgreSQL等)间的数据传递。它可以将一个关系型数据库(例如MySQL、Oracle、PostgreSQL等)中的数据导入Hadoop的HDFS中,也可以将HDFS的数据导入关系型数据库中。

Sqoop项目开始于2009年,最早作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速地迭代开发,独立为一个Apache项目。

(2)Flume

随着目前业务对实时数据需求的日益增长,实时数据的采集越来越受到重视,而目前这方面主流的开源框架就是Flume,国内很多互联网公司也都是基于Flume搭建自己的实时日志采集平台。

Flume是Cloudera提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统,目前已经是Apache的顶级子项目。使用Flume可以收集诸如日志、时间等数据,并将这些数据资源集中存储起来供下游使用(尤其是流处理框架,例如Storm)。和Flume类似的另一个框架是Scribe(Facebook开源的日志收集系统,它为日志的分布式收集、统一处理提供一个可扩展的、高容错的简单方案)。

(3)Kafka

通常来说Flume采集数据的速度和下游处理的速度通常不同步,因此实时平台架构都会用一个消息中间件来缓冲,而这方面最为流行和应用最为广泛的无疑是Kafka。

Kafka是由LinkedIn开发的一个分布式消息系统,以其可以水平扩展和高吞吐率而被广泛使用,目前主流的开源分布式处理系统(如Storm和Spark等)都支持与Kafka集成。

Kafka是一个基于分布式的消息发布-订阅系统,特点是快速、可扩展且持久。与其他消息发布-订阅系统类似,Kafka可在主题当中保存消息的信息。生产者向主题写入数据,消费者从主题读取数据。作为一个分布式的、分区的、低延迟的、冗余的日志提交服务,得益于其独特的设计,目前Kafka使用非常广泛。

和Kafka类似的消息中间件开源产品还包括RabbitMQ、ActiveMQ、ZeroMQ等。

1.2.2 数据处理主要技术

数据处理是数据开源技术最为百花齐放的领域,离线和准实时的工具主要包括MapReduce、Hive和Spark,流处理的工具主要包含Storm,还有最近较为火爆的Flink、Beam等。

(1)MapReduce

MapReduce是Google公司的核心计算模型,它将运行于大规模集群上的复杂并行计算过程高度抽象为两个函数:map和reduce。MapReduce最伟大之处在于其将处理大数据的能力赋予了普通开发人员,以至于开发人员即使不会任何的分布式编程知识,也能将自己的程序运行在分布式系统上处理海量数据。

MapReduce是第3章的重点介绍内容,在此不做过多阐述,第3章中将会重点介绍其架构和原理等。

(2)Hive

MapReduce将处理大数据的能力赋予了普通开发人员,而Hive进一步将处理和分析大数据的能力赋予了实际的数据使用人员(数据开发工程师、数据分析师、算法工程师和业务分析人员等)。

Hive是由Facebook开发并贡献给Hadoop开源社区的,是一个建立在Hadoop体系结构上的一层SQL抽象。Hive提供了一些对Hadoop文件中的数据集进行数据处理、查询和分析的工具,它支持类似于传统RDBMS的SQL语言的查询语言,以帮助那些熟悉SQL的用户处理和查询Hadoop中的数据,该查询语言称为Hive QL(下文将用Hive SQL指代,因为其更为直观和便于理解)。Hive SQL实际上先被SQL解析器解析,然后被Hive框架解析成一个MapReduce可执行计划,并按照该计划生成MapReduce任务后交给Hadoop集群处理。

Hive目前仍然是包括国际大厂(如Facebook和国内BAT)在内的互联网公司所使用的主流离线数据处理工具,详细内容参见第4章和第5章。

(3)Spark

尽管MapReduce和Hive能完成海量数据的大多数批处理工作,并且在大数据时代成为企业大数据处理的首选技术,但是其数据查询的延迟一直被诟病,而且也非常不适合迭代计算和DAG(有向无环图)计算。由于Spark具有可伸缩、基于内存计算等特点,且可以直接读写Hadoop上任何格式的数据,较好地满足了数据即时查询和迭代分析的需求,因此变得越来越流行。

Spark是UC Berkeley AMP Lab(加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,它拥有Hadoop MapReduce所具有的优点。但不同于MapReduce的是,Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce算法。

Spark也提供类Hive的SQL接口(早期叫Shark,现为Spark SQL),来方便数据人员处理和分析数据。

此外,Spark还有用于处理实时数据的流计算框架Spark Streaming,其基本原理是将实时流数据分成小的时间片断(秒或者几百毫秒),以类似Spark离线批处理的方式来处理这小部分数据。

本书第9章将会专门介绍Spark和Spark Streaming技术。

(4)Storm

MapReduce、Hive和Spark是离线和准实时数据处理的主要工具,而实时数据处理的开山鼻祖毫无疑问是Storm。

Storm是Twitter开源的一个类似于Hadoop的实时数据处理框架,它原来是由BackType开发,后BackType被Twitter收购后,Twitter将Storm作为Twitter的主要实时数据处理系统并贡献给了开源社区。

Storm对于实时计算的意义相当于Hadoop对于批处理的意义。Hadoop提供了Map和Reduce原语,使对数据进行批处理变得非常简单和优美。同样,Storm也对数据的实时计算提供了简单的Spout和Bolt原语。Storm集群表面上看和Hadoop集群非常像,但在Hadoop上面运行的是MapReduce的Job,而在Storm上面运行的是Topology(拓扑),Storm拓扑任务和Hadoop MapReduce任务一个非常关键的区别在于:1个MapReduce Job最终会结束,而1个Topology永远运行(除非显式地杀掉它),所以实际上Storm等实时任务的资源使用相比离线MapReduce任务等要大很多,因为离线任务运行完就释放掉所使用的计算、内存等资源,而Storm等实时任务必须一直占用直到被显式地杀掉。

Storm拥有低延迟、分布式、可扩展、高容错等特性,可以保证消息不丢失,目前Storm、类Storm或者基于Storm抽象的框架技术是实时处理、流处理领域主要采用的技术。

(5)Flink

在数据处理领域,批处理任务与实时流计算任务一般被认为是两种不同的任务,一个数据项目一般会被设计为只能处理其中一种任务,例如Storm只支持流处理任务,而MapReduce、Hive只支持批处理任务。那么两者能够统一用一种技术框架来完成吗?批处理是流处理的特例吗?

Apache Flink是一个同时面向分布式实时流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtime),提供支持流处理和批处理两种类型应用的功能。Flink在实现流处理和批处理时,与传统的一些方案完全不同,它从另一个视角看待流处理和批处理,将二者统一起来。Flink完全支持流处理,批处理被作为一种特殊的流处理,只是它的输入数据流被定义为有界的而已。基于同一个Flink运行时,Flink分别提供了流处理和批处理API,而这两种API也是实现上层面向流处理、批处理类型应用框架的基础。

(6)Beam

Google开源的Beam在Flink基础上更进了一步,不但希望统一批处理和流处理,而且希望统一大数据处理范式和标准。Apache Beam项目重点在于数据处理的编程范式和接口定义,并不涉及具体执行引擎的实现。Apache Beam希望基于Beam开发的数据处理程序可以执行在任意的分布式计算引擎上!

Apache Beam(原名Google Cloud DataFlow)是Google于2016年2月贡献给Apache基金会的Apache孵化项目,被认为是继MapReduce、GFS和Bigtable等之后,Google在大数据处理领域对开源社区的又一个非常大的贡献。

Apache Beam项目重点在于数据处理的编程范式和接口定义,并不涉及具体执行引擎(Runner)的实现。Apache Beam主要由Beam SDK和Beam Runner组成,Beam SDK定义了开发分布式数据处理任务业务逻辑的API接口,生成的分布式数据处理任务Pipeline交给具体的Beam Runner执行引擎。Apache Beam目前支持的API是由Java语言实现的,Python版本的API正在开发之中。Apache Beam支持的底层执行引擎包括Apache Flink、Apache Spark以及Google Cloud Platform,此外Apache Storm、Apache Hadoop、Apache Gearpump等执行引擎的支持也在讨论或开发当中。

1.2.3 数据存储主要技术

(1)HDFS

Hadoop Distributed File System,简称HDFS,是一个分布式文件系统。它是谷歌的Google File System(GFS)提出之后,Doug Cutting受Google启发而开发的一种类GFS文件系统。它有一定高度的容错性,而且提供了高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS提供了一个高容错性和高吞吐量的海量数据存储解决方案。

在Hadoop的整个架构中,HDFS在MapReduce任务处理过程中提供了对文件操作和存储等的支持,MapReduce在HDFS基础上实现了任务的分发、跟踪和执行等工作,并收集结果,两者相互作用,共同完成了Hadoop分布式集群的主要任务。

(2)HBase

HBase是一种构建在HDFS之上的分布式、面向列族的存储系统。在需要实时读写并随机访问超大规模数据集等场景下,HBase目前是市场上主流的技术选择。

HBase技术来源于Google论文《Bigtable:一个结构化数据的分布式存储系统》。如同Bigtable利用了Google File System提供的分布式数据存储方式一样,HBase在HDFS之上提供了类似于Bigtable的能力。HBase解决了传统数据库的单点性能极限。实际上,传统的数据库解决方案,尤其是关系型数据库也可以通过复制和分区的方法来提高单点性能极限,但这些都是后知后觉的,安装和维护都非常复杂。而HBase从另一个角度处理伸缩性问题,即通过线性方式从下到上增加节点来进行扩展。

HBase不是关系型数据库,也不支持SQL,其中的表一般有这样的特点。

大:一个表可以有上亿行、上百万列。

面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。

稀疏:为空(NULL)的列并不占用存储空间,因此表可以设计得非常稀疏。

无模式:每一行都有一个可以排序的主键和任意多的列。列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。

数据多版本:每个单元中的数据可以有多个版本,默认情况下,版本号自动分配,它是单元格插入时的时间戳。

数据类型单一:HBase中的数据都是字符串,没有类型。

1.2.4 数据应用主要技术

数据有很多种应用方式,如固定报表、即时分析、数据服务、数据分析、数据挖掘和机器学习等。下面挑选典型的即时分析Drill框架、数据分析R语言、机器学习TensorFlow框架进行介绍。

(1)Drill

Apache Drill是一个开源实时大数据分布式查询引擎,目前已经成为Apache的顶级项目。

Drill是开源版本的Google Dremel。Dremel是Google的“交互式”数据分析系统,可以组建成规模上千的集群,处理PB级别的数据。MapReduce处理数据一般在分钟甚至小时级别,而Dremel将处理时间缩短到秒级,即Drill是对MapReduce的有力补充。Dremel作为Google BigQuery的报表引擎,获得了很大的成功。

Drill兼容ANSI SQL语法作为接口,支持对本地文件、HDFS、Hive、HBase、MongeDB作为存储的数据查询,文件格式支持Parquet、CSV、TSV以及JSON这种无模式(schema-free)的数据。所有这些数据都可以像使用传统数据库的表查询一样进行快速实时查询。

Drill于2014年年底成为Apache的顶级项目,旨在为基于Hadoop应用的开发者和BI分析人员的工作效率带来巨大提升。

(2)R语言

R是一种开源的数据分析解决方案,其实市面上也有很多优秀的统计和制图软件,如Excel、SAS、SPSS和Stata等。那么为什么R变得这么流行,成了很多数据分析师的主要工具呢?原因如下。

R是自由软件。这意味着它是完全免费的、开放源代码的。可以在官方网站及其镜像中下载任何有关的安装程序、源代码、程序包及其源代码、文档资料,标准的安装文件自身就带有许多模块和内嵌统计函数,安装好后可以直接实现许多常用的统计功能。

R是一种可编程的语言。作为一个开放的统计编程环境,R语言的语法通俗易懂,而且目前大多数最新的统计方法和技术都可以在R中直接得到。

R具有很强的互动性。除了图形输出是在另外的窗口,它的输入/输出都是在同一个窗口进行的,输入语法中如果出现错误会马上在窗口中给出提示,对以前输入过的命令有记忆功能,可以随时再现、编辑、修改以满足用户的需要,输出的图形可以直接保存为JPG、BMP、PNG等图片格式,还可以直接保存为PDF文件。此外,R与其他编程语言和数据库之间有很好的接口。

(3)TensorFlow

随着大数据时代和人工智能热潮的到来,数据已经不仅仅局限在“看”,数据和算法已经是生产系统的一部分,众多的开源机器学习平台和深度学习平台纷纷出现,而TensorFlow无疑是目前最为流行的一个。

TensorFlow是一个非常灵活的框架,它能够运行在个人电脑或者服务器的单个/多个CPU和GPU上,甚至是移动设备上。TensorFlow最早是Google大脑团队为了研究机器学习和深度神经网络而开发的,但后来发现这个系统足够通用,能够支持更加广泛的应用,于是将其开源。

TensorFlow是基于数据流图的处理框架,TensorFlow节点表示数学运算(mathematical operations),边表示运算节点之间的数据交互。TensorFlow从字面意义上来讲有两层含义:第一层含义,Tensor代表的是节点之间传递的数据,通常这个数据是一个多维度矩阵(multidimensional data arrays)或者一维向量;第二层含义,Flow指的是数据流,形象理解就是数据按照流的形式进入数据运算图的各个节点。