1.1 大数据开发基础
本节的内容包括:大数据的定义、大数据开发步骤以及大数据开发中所涉及的技术。
如果把大数据学习比作一段旅程,那么本节就是一张地图,它会指明学习大数据的正确路线。
本节不涉及具体技术,弄清方向、抬头看路在某种程度上会比学习某个具体的技能更重要!
本节只需要理解大数据定义和大数据开发步骤,对于本节所提到的具体技术只需有一个基本印象,不需要深究细节,待后续积累一定的开发经验后,再回过头来看本节内容,会有不同的理解。
1.1.1 什么是大数据
1.大数据定义
维基百科对大数据的定义如下。
大数据是指传统数据处理应用软件无法充分处理的太大或太复杂的数据集。
本书采用上述定义作为大数据定义,因为它描述了大数据的本质,而大数据的其他特性都可以由此定义推导出来。
2.理解大数据
大数据与普通数据不同之处就在于“大”,这个“大”有以下3层含义。
(1)存储空间大
大数据对存储空间的要求超出了普通数据。普通数据通常情况一台机器就能装下。而大数据的存储空间可能远远超出普通机器的容量。例如,1PB的数据,如果每台机器有2TB的存储空间,至少需要500台机器才能存储得下。但是,要注意的是,使用数据占用存储空间的绝对值作为大数据的判断标准是不准确的,例如,Google成立时,硬盘容量通常是在10GB左右,有的甚至更小,1TB的数据,可能就需要100块甚至更多的硬盘来存储,当时的1TB数据是可以称之为大数据的;而到了现在,一块普通SATA硬盘的空间就在2TB以上,1TB的数据1块硬盘就可以存储,1TB的数据再称之为大数据,似乎就不太合适了。
(2)数据量大
这个数据量是指数据记录的条数,不是指它所占用的存储空间大小。最典型的是海量数据库,例如,超过亿条级别的Oracle单表,或者超过千万条级别的MySQL单表。这样的单表可能并不占用很大的存储空间,但是,记录的条数超出了传统数据库处理的范围,因此,也可以称之为大数据。
(3)计算量大
如果数据处理的算法复杂度高,需要远超单机的计算力,那么即使数据的存储空间、数据量规模都不大,也可称之为大数据。例如,同构子图的查询算法,在一个几千万个节点目标图中,给定一个小的查询图(点、边的集合),要查询目标图中和查询图结构相同的子图,在这个算法中,目标图和查询图在存储空间和数据量方面,都是单机可以处理的范围,但是,整个搜索匹配过程是一个NP完全问题,传统的单机方法无法处理。因此,如果待处理的数据,其计算量大,超出传统单机处理范围,也可以称之为大数据。
结论:如果数据的特性符合上述3个特性之一,就可以称之为大数据!
1.1.2 大数据开发的通用步骤
大数据的开发步骤如图1-1所示。
图1-1 大数据开发通用步骤图
图1-1只是一个简化后的步骤和流程,实际开发中,有的步骤可能不需要,有时还需要增加步骤,有的流程可能更复杂,视具体情况而定。下面以Google搜索引擎为例,来说明以上步骤。
1.大数据采集
Google的数据主要来自互联网上的网页,它们由Google Spider(蜘蛛、爬虫、机器人)来抓取,抓取的原理也很简单,就是模拟人的行为来访问各个网页,然后保存网页内容。
Google Spider是一个程序,运行在全球各地的Google服务器之中,Spider们非常勤奋,日夜不停地工作。Google的统计数据表明,Google Spider们每天都会访问大约200亿个网页,而在总量上,它们追踪着300亿个左右的独立URL链接。可以说,只要是互联网上的网站,只要没有在robots.txt文件禁止Spider访问的话,其网页数据基本上都会在很短的时间内被抓取到Google的服务器上。
全球的网页数据,是典型的大数据,Google Spider所做的就是典型的大数据采集工作。
2.大数据预处理
Google Spider爬取的网页数据,无论是从格式还是结构都是不统一的,需要先做一些处理,例如,在存储之前先转码,使用统一的格式对网页数据进行编码,这些工作就是大数据预处理。
3.大数据存储
网页数据经过预处理后,就可以存储到Google的服务器上。2008年,Google已经索引了全世界 1 万亿个网页,到2014年,这个数字变成了30万亿个。为了减少开销,节约空间,Google将多个网页文件合并成一个大文件,文件大小通常在1GB以上。
为了实现这些大文件高效、可靠、低成本地存储,Google发明了一种构建在普通商业机器之上的分布式文件系统:Google File System,缩写为GFS,用来存储文件(又称之为非结构化数据)。
网页文件存储下来后,就可以对这些网页进行处理了,例如统计每个网页出现的单词以及次数、统计每个网页的外链次数等。这些被统计的信息就成为数据库表中的一个属性,每个网页最终就会成为数据库表中的一条或若干条记录。由于Google存储的网页太多(30万亿个以上)因此这个数据库表也是超级庞大的,传统的数据库像Oracle等根本无法处理这么大的数据,因此Google基于GFS,发明了一种存储海量结构化数据(数据库表)的分布式系统Bigtable。
上述两个系统(GFS和Bigtable)并未开源,Google仅通过文章的形式描述了它们的设计思想。所幸的是,基于Google的这些设计思想,业界出现了不少开源大数据分布式文件系统,如HDFS等,也出现了许多开源结构化大数据分布式系统,如 HBase、Cassandra等,它们分别用于不同类型大数据的存储。
总之,如果采集过来的大数据需要存储,要先判断数据类型,再确定存储方案选型;如果不需要存储(如有的流数据不需要存储,直接处理),则直接跳过此步骤进行处理。
4.大数据处理
网页数据存储后,就可以对其进行处理了。对于搜索引擎来说,主要有以下3步。
1)单词统计:统计网页中每个单词出现的次数;
2)倒排索引:统计每个单词所在的网页URL(Uniform Resource Locator,统一资源定位符,俗称网址)以及次数;
3)计算网页级别:根据特定的排序算法(如PageRank)来计算每个网页的级别,越重要的网页,级别越高,以此决定网页在搜索返回结果中的排序位置。
例如,当用户在搜索框输入关键词“足球”后,搜索引擎会查找倒排索引表,得到“足球”这个关键词在哪些网页(URL)中出现,然后,根据这些网页的级别进行排序,将级别最高的网页排在最前面,返回给用户,这就是单击“搜索”后,看到的最终结果。
在进行大数据处理时,往往需要从存储系统读取数据,处理完毕后,其结果也往往需要输出到存储。因此,大数据处理阶段和存储系统的交互是非常频繁的。
大数据处理和大数据预处理,在技术上是相通的,只是所处阶段不同;
大数据处理环节是大数据开发阶段的一个必需的环节!
5.大数据可视化
大数据可视化是将数据以图表的方式展现出来,与纯粹的数字表示相比,图表方式更为直观,更容易发现数据之间的规律。
例如,Google Analytics是一个网站流量分析工具,它统计每个用户使用搜索引擎访问网站的数据,然后得到每个网站的流量信息,包括网站每天的访问次数,访问量最多的页面、用户的平均停留时间、回访率等,所有数据都以图表的方式直观地显示出来,如图 1-2所示。
图1-2 Google网站访问量分析图
1.1.3 大数据开发技术
上节介绍了大数据开发的通用步骤,本节介绍大数据开发中所涉及的技术。由于技术的通用性,有些步骤所涉及的技术会有重合,例如大数据预处理和大数据处理阶段,两者所涉及的技术重合度较高,故将其合并统一介绍。
下面按照大数据采集、大数据存储、大数据处理(大数据预处理)、大数据可视化的顺序,介绍各阶段所涉及的技术。
1.大数据采集技术
(1)大数据采集技术的特点
和传统的数据采集技术相比,大数据采集技术有两个特点。
1)大数据采集通常采用分布式架构。这是因为大数据采集的数据流量大,数据集记录条数多,传统的单机采集方式在性能和存储空间上都无法满足需求;
2)多种采集技术混合使用。这是因为大数据不像普通数据采集那样单一,往往是多种数据源同时采集,而不同的数据源对应的采集技术通常不一样,很难有一种平台或技术能够统一所有的数据源,因此大数据采集时,往往是多种技术混合使用,对技术要求更高。
(2)大数据采集技术(按数据源分类)
大数据的采集从数据源上可以分为Web数据(包括网页、视频、音频、动画、图片等)、日志数据、数据库数据以及其他数据4类。不同的数据源对应不同的采集技术,如图1-3所示。
图1-3 大数据采集技术的分类
(3)大数据采集技术(按知识层次分类)
根据图1-3内容,对大数据采集技术按照知识层次进行以下分类。
1)数据采集相关的基础知识。包括操作系统的相关知识和操作,如Linux常用命令等,因为采集程序和被采集的对象都是运行在操作系统上的,必须要有相应的基础知识;TCP/IP网络协议原理,因为所有采集到的数据都是通过网络传输和存储的,因此了解相应的网络传输协议是必需的;HTTP相关协议,Web 数据的采集是通过HTTP协议完成的,还需要有HTML、CSS等Web相关知识;数据库原理及SQL操作,这个是采集数据库数据所必需的;数据提取及清洗技术,基本的数据格式,如CSV、JSON等常见格式以及它们的转换操作是必须掌握的;HDFS和HBase的运行机制和基本操作,分别用于结构化和非结构化海量数据的存储;由于大数据采集的架构通常是分布式的,因此,在开发专门的采集程序时,还需要掌握分布式应用开发的技术,如自定义网络协议、网络异常处理、应用间的同步与异常处理等。
2)常用的数据采集工具。不同的数据源对应不同的采集工具,也可能多个数据源可以用同一个采集工具,例如,Flume可以采集数据库和日志数据。但是很难有一种工具能覆盖所有的数据源。因此,不同的采集需求需要掌握不同采集工具的使用。如果是采集数据库、日志文件,则涉及Flume、Fluentd等工具,如果是采集Web页面数据,则涉及HtmlUnit/webmagic等爬虫框架,同时还可能会涉及反爬虫技术。此外,如果要实现大规模的数据采集、分发、订阅,还需要Kafka等组件。
3)Shell脚本。和采集工具相比,Shell脚本采集数据更为灵活,和Python相比,Shell脚本更方便,开发简单、效率高,因此,在能满足需求的情况下,完全可以采用Shell脚本快速完成数据的采集,在数据量大的情况下,可以使用Shell脚本采集部分数据,快速完成原型验证。
很多资料提到数据采集,就要用Python,使用Python进行数据采集似乎更高级。但是,Python也好,Shell脚本也罢,它们都只是实现数据采集的一个工具而已,技术选型应以“满足需求”为第一要务,哪种语言能够以最简单地方式达到目的,就选它。
4)编程语言。在采集工具和Shell脚本都无法满足需求的情况下,就需要使用编程语言来编写特定的采集程序了。常用的编程语言有 Python、Java和Scala等,当然,不只这些,其他的编程语言只要能达到同样的目的皆可。就Python、Java和Scala而言,除了基础语法、基本数据类型、控制结构等知识点外,还涉及网络编程、文件I/O等。这些语言都提供了丰富的函数库资源用于采集数据,例如各种数据格式的转换、数据库连接访问、网络传输、应用层网络协议库等,这些也是所涉及的技术;此外,采集的数据要通过API调用存储到分布式数据库中,因此,诸如HDFS、HBase的读写接口也是所涉及的技术。
自己编写采集程序是最为灵活可控的方式,基本上只要数据源采集的通道打通了,后续的数据采集就不成问题。但是,这也是最耗时、门槛最高的一种方式,尽管每种语言都提供了丰富的函数库,但仍然需要自己编写逻辑把这些库函数组合利用起来,同时,如果是分布式架构的话,还要考虑处理分布式系统中的通信、同步、一致性和异常处理等问题,因此,自己编写采集程序的工作量是很大的,要求也比较高。
2.大数据存储技术
(1)大数据存储的特点
大数据对存储系统的要求和常规数据对存储的要求是不一样的,其特点包括以下4点。
1)存储空间超出了单机的容量和一般分布式存储系统所支持的上限;
2)数据集中记录的条数超出了传统数据库可处理的上限;
3)网络带宽以及磁盘I/O的吞吐量超出了单机的上限;
4)此外,按照常规方法采用专用存储设备存储数据由于规模小,总的经济成本还可以接受,但是,如果存储海量数据,采用专用存储设备时单位容量的存储代价昂贵,此种方式在经济上会变得不可行。
(2)大数据存储分类
由于上述原因,从Google的GFS开始,近十几年来,出现了很多的大数据存储系统,根据存储对象的类型,可以分为两类:非结构化数据(即平时所说的文件)存储,结构化数据(即数据库)存储,其中结构化数据存储根据技术特性又可以分为两类:NoSQL数据库和NewSQL数据库。
因此,加上非结构化数据的存储,大数据存储可分3类:分布式海量文件存储、NoSQL数据库和NewSQL数据库。每种存储对应的典型系统及技术要求如图1-4所示。
图1-4 大数据存储技术的分类
根据上图内容,大数据存储技术可以分为两个层次。
使用者层次。
●存储系统的基础架构和运行原理。一般来说,分布式存储系统的架构有主/从式和对等式两种。HDFS、MooseFS、HBase 是典型的主从式架构,包括一个管理节点和多个数据存储节点,这样的好处是架构简单,设计和实现都可以简化,有利于构建稳定健壮的系统;不足之处是,管理节点是整个存储系统的单点,管理节点不可用会导致整个存储系统不可用。当然,HDFS 目前也提供了相应的 HA 机制来提高管理节点的可用性。Gluster则是典型的对等式架构,该架构可用性很高,任何一个节点不可用都不会导致整个存储系统不可用;不足之处是,Gluster架构的设计和实现比较复杂,在性能和可靠性上需要做更多的工作;
● 各存储系统的构建、基本命令、帮助文件和日志文件的查看等基本技能,如果要操作NewSQL数据库,还涉及SQL的规范和使用;
●如果要编写程序使用存储系统的话,相关技术还涉及各存储系统的基本API函数、各功能实现的调用顺序等,此外,还需要掌握某种编程语言,如Java、Python、Scala等,具体的技术涉及语言与存储系统之间的调用机制,包括函数库直接调用,或通过第三方的thrift服务等进行调用等;
●对于一些高级使用方法,如HDFS的HA、纠删码的使用等,在缺乏资料的情况下,还需要阅读源代码,搞清楚实现机制。
我们在与360联合实验室的项目中,对HDFS的可用性机制进行了研究,当时的HDFS并没有 NameNode(管理节点)的热备机制,这是一个很大的隐患,一旦出现问题,在生产环境中是不可容忍的,所以选择了当时Facebook提出的Avatrar技术方案。由于资料少,如何高效可靠地使用并不清楚,而这些操作又涉及文件系统中的元数据,一不小心就可能导致整个文件系统不可访问,为此,我们深入分析了Avatrar的源码,深入理解其实现和运行机制,针对每种异常情况提出了对应的解决方案,得到了360方面的高度认可。
开发者、设计者层次。
●分布式系统设计和开发的相关基础,如网络编程接口、RPC调用、自定义消息及交互协议、进程间的同步、节点管理、系统扩展、节点可用性、故障恢复、各类异常的处理等;
● 文件系统、数据库系统的理论基础和开发经验,如元数据管理、名字空间、数据分布、资源调度、数据冲突处理、数据模型、一致性保证、SQL处理引擎等;
●精通某一种开发语言,例如HBase是用Java开发的,MooseFS是用C++开发的;掌握相对应的开发语言是必需的。
●针对开发者、设计者而言,需要掌握的技术还涉及:操作系统与I/O相关的接口,例如 MooseFS支持Posix接口,需要了解这些接口的功能、参数和返回值以及实现机制;还有像CEPH文件系统,它有专门的内核模块,开发者还需要熟悉Linux内核模块的开发,清楚 Linux 内核的运行机制、内部接口、使用方法、调试技术;内核开发必须使用C语言,因此,掌握C语言是必需的;
● 一个高性能存储系统一定是软硬件相结合的,因此,需要掌握操作系统、硬件等底层机制,并结合开发语言的特性将硬件性能利用到极致;
● 如果是基于现有系统进行修改,需要对现有系统的运行、实现机制有深入理解,最主要的途径就是阅读其源码。
我们在与中兴通讯合作项目中,实现了纠删码高性能编解码,并将其应用到分布式文件系统MooseFS上,替换原有的副本机制,这样可以在相同可靠性的情况下大幅节约存储空间的。我们当时的一个很重要的工作就是阅读MooseFS的源码,深入理解其实现机制,由于MooseFS是通用文件系统,不像HDFS只支持有限的文件操作(例如,只支持数据的追加,不支持数据修改),要考虑的因素更多,设计和实现更复杂。
3.大数据处理技术(大数据预处理技术)
大数据处理和预处理所用技术基本相同,在此统一介绍。
(1)大数据和普通数据的处理技术对比
大数据和普通数据的处理技术不同之处在于:处理方法和处理框架。
普通数据的传统处理方法有串行处理、多线程处理和分布式处理,而大数据处理则主要采用MapReduce方法来处理数据;普通数据通常不需要特定的处理框架。大数据处理则需要针对特定的处理框架,如MapReduce框架(Hadoop),Spark框架等,需要编写专门的程序。在这些处理框架中,Spark由于其灵活和高性能的特点,已经成为主流的大数据处理框架。
(2)大数据处理所涉及的技术
按照大数据处理的技术方向,可以分为4类,每类所涉及的技术如下。
1)大数据处理系统运维。
此方向主要是从事大数据处理系统的运行和维护工作,技术涉及:Linux平台的基本知识和操作;常用的大数据处理系统,如Hadoop平台(包括Yarn、HDFS和MapReduce)、Spark和Storm等,要熟悉这些平台的运行机制、构建方法、常用命令、日志查看方法等;常用的运维工具(如SaltStack)和常用的监控工具(如Zabbix);Shell编程,很多批处理操作和复杂逻辑可以使用Shell脚本完成。
Linux的基本操作是从事大数据工作的必备技能可通过网易云课堂的免费高清视频课程《艾叔:Linux入门——零基础2小时用会Linux》学习掌握。资源获取方式参见1.6.2节内容。
2)大数据应用开发。
此方向主要是开发面向大数据应用的程序,实现大数据处理逻辑,并进行相应的优化。涉及的技术除大数据处理系统运维基础外,还包括以下三点。
●与大数据处理框架相关的编程语言,例如,使用MapReduce框架,Java语言是最合适的,因为Hadoop就是用Java写的,可以无缝对接。如果使用Spark框架,Scala是最合适的,因为Spark就是用Scala开发的。但这不是绝对的,每个框架都支持多种语言进行交互,例如使用Python也可以编写MapReduce程序和Spark程序。总之,至少要掌握一门框架所支持的语言,除了基本的语法外,要着重掌握框架所提供的API函数及使用方法;
●每个框架所对应的编程模型,例如MapReduce模型将数据的处理过程,分解为Map和Reduce两个阶段。程序启动后,将待处理的数据划分为若干部分,每个部分进行Map处理。所谓 Map 处理,就是做映射,将输入的数据通过Map函数映射为另一部分数据输出。每个Map的输出被分为若干个部分,每个部分称为一个分区(Partition)。如果每个Map上相同id的分区都准备好了,就会发送到同一个节点,进行Reduce(归并)操作。在整个处理过程中,Map 阶段和Reduce阶段都是并行的,这样就实现了整个程序的并行处理,这就是MapReduce的编程模型。如果使用MapReduce编程,就要将程序逻辑分成Map和Reduce两步进行处理;Spark也同样如此,Spark中的核心是RDD(弹性分布式数据集),所有的并行处理都是围绕RDD进行的,所以在进行Spark程序设计时,要设计合理的RDD,以便于进行并行处理;
● 如果要进行大数据应用的优化,还需要深入掌握各个处理框架的运行机制以及编程语言的特性。对于Scala语言来说,同样的功能采用不同的实现,效率可能会有100倍以上的差距;对于MapReduce程序和Spark程序来说,优化是否得当,对程序的性能也会产生重大影响。
3)大数据处理算法。
此方向主要是针对具体的问题选取合适的大数据算法予以解决。对于已有算法在数据预处理后可直接调用。若已有算法无法满足要求,则需要另外编写算法实现。具体涉及的技术包括以下三点。
● 常用的大数据算法,例如分类回归、聚类、关联规则、推荐、降维和特征抽取等,要清楚每种算法的基本原理。例如推荐算法,有很多种不同的类型,要搞清楚这些典型推荐算法之间的优劣对比,特别要关注其中的并行化算法及实现,这样面对具体问题时,就可以实现算法的快速选型;
● 典型大数据算法的实现方法。算法的实现是和特定的处理框架相关的,例如Spark算法主要集中在MLlib库,可以通过阅读源码的方式来学习和积累经验,这些都是自身实现大数据处理算法时所需要的;
● 如果要设计算法,需要有数学、概率论、数理统计、离散数学、数据结构和算法等基础;还要掌握常用的大数据处理算法的原理和实现方法。
4)大数据处理技术研发。
此方向偏向于大数据处理自身技术的研发,例如设计开发类似于Spark的大数据处理框架。除了前面涉及的技术外,还需要掌握分布式处理理论、分布式处理模型设计和分布式系统设计与实现技术等。
4.大数据可视化技术
大数据可视化的主要工作是:将处理后的大数据结果,以图、表等多种形式,呈现给用户。此环节同样涉及数据的处理、存储等过程,所涉及的技术在前面已有说明,在此不再赘述。
(1)大数据可视化和普通数据可视化的区别
大数据可视化和普通数据可视化不同的地方在于以下两点。
1)数据的来源不同。大数据可视化的数据通常来源于分布式存储系统,来源于各个数据源,或者数据订阅系统,它的来源渠道更多,数据量更大。而普通数据可视化的数据则来源于本地文件系统或数据库,来源相对单一,且数据量有限;
2)数据的呈现不同。大数据可视化的数据类型可能更为丰富,需要更多的展现形式,此外由于数据量大,在呈现方式、布局、数据组织上需要有更多的考虑。
(2)大数据可视化所涉及的技术
大数据可视化所涉及技术如下。
●网页设计相关技术基础,如HTML/CSS/JavaScript/Node.js;
●前端开发框架,如React、Vue等;
●可视化组件和库的使用,如Echart、HignCharts、D3和Three.js等;
●后端语言,如Java等;
●美术设计基础,如可视化呈现方式、构图、配色等;
●计算机视觉、交互基础理论和技术。