前言

关于本书

要真正理解大数据,需要一些历史背景的帮助。大约在2001年,Gartner给出了大数据的定义:Big data is data that contains greater variety arriving in increasing volumes and with ever-higher velocity。其意思是大数据是这样的数据,随着其不断增加的容量和更快的速度,数据类型具有更大的多样性,这就是所谓的3V(Variety、Volume和Velocity)。简言之,大数据是更大、更复杂的数据集,尤其是来自更多的新数据源。这些数据集非常庞大,传统的数据处理软件无法管理它们。但是,这些大量的数据可以用来解决以前无法解决的业务问题。

尽管大数据的概念相对较新,但大数据集的起源可追溯到20世纪60年代和70年代,当数据世界刚刚起步时,出现了第一个数据中心和关系数据库。大约在2005年,人们开始意识到通过Facebook、YouTube和其他在线服务产生巨量的用户数量。Hadoop是在同一年开发的,是专门为存储和分析大数据集而创建的开源框架,NoSQL在这段时间也开始流行起来。类似于Hadoop这样的开源框架,Spark的发展对于大数据的发展至关重要,因为它们使得大数据更容易处理,并且更便宜地存储。在之后的几年中,数据量急剧上升,用户仍然在生成大量的数据。随着物联网(IoT)的出现,更多的物体和设备连接到互联网,收集关于客户使用模式和产品性能的数据,以及机器学习的出现产生了更多的数据。虽然大数据已经走了很长的路,但其实用性只是刚刚开始。

我们编写本书的目的在于介绍大数据的发展趋势和基于Spark的生态环境,全面系统地提供Spark开发的基础知识,提供基于Docker容器的开发环境和编程实例。在本书的编写中,把Spark的基础知识与教学经验和学习体会结合起来,希望可以引导Spark技术学习者快速入门,系统地掌握Spark的编程技术。本书围绕Spark技术开发,共11章。其中加∗的章节属于选学章节,加∗∗的章节属于难度更大的章节,可以酌情选学。

第1章介绍Spark生态环境,其中包括关键技术、Spark技术特征、编程语言、虚拟环境和HBase等,并且提供了实际的操作方法,这部分技术和知识会在后面的章节详细说明,并加以应用。

第2章介绍Spark数据处理的基本机制。Apache Spark是一个在Hadoop上运行并处理不同类型数据的集群计算框架,对于许多问题来说,可以一站式解决方案。另外,通过本章的学习,理解RDD的基本概念,RDD支持两种类型的操作:转换(Transformation)——从现有数据集创建新数据集,以及动作(Action)——在数据集上运行计算后将值返回给驱动程序。使用Scala和Spark是学习大数据分析很好的组合。Scala允许将两种方法结合使用,即以面向对象编程(Object-Oriented Programming)和函数式编程(Functional Programming)两种风格编写代码。

第3章重点讲解键值对RDD功能,学习如何创建键值对RDD和进行键值对RDD的相关操作,如Spark RDD中的转换和动作。这里的转换操作包括groupByKey、reduce-ByKey、join、leftOuterJoin和rightOuterJoin等,而countByKey等是针对键值对RDD的动作。本章还讨论Spark中的分区和洗牌,数据分区和洗牌的概念对于Apache Spark作业的正常运行至关重要,并且会对性能产生很大影响,决定了资源的利用情况。共享变量是许多函数和方法必须并行使用的变量,可以在并行操作中使用。另外,本章还介绍了Scala的高级语法。

第4章介绍Spark SQL,是用于结构化数据处理的Spark模块,提供很多有关数据结构和类型的信息,Spark SQL使用这些额外的信息执行性能优化。本章还介绍DataFrame和DataSet相关API的概念,并且区分两种接口API的特征,然后介绍RDD、DataFrame和DataSet三种数据结构的转换,最后介绍结构化数据的操作方法。

第5章了解实时流传输体系结构如何工作,以提供有价值的信息,以及三种流处理范式。Spark Streaming是Spark核心的扩展组件之一,可扩展地实现实时数据流的高吞吐量、容错处理。通过本章可学习Spark Streaming的基础知识,包括流式传输的需求、体系结构和传输方式,了解Spark Streaming的输入源类型以及各种数据流操作。结构化流是基于Spark SQL引擎构建的可伸缩且容错的流处理引擎,可以像对静态数据进行批处理计算一样表示流计算。

第6章Spark GraphX是一个分布式图处理框架,是基于Spark平台的提供对图计算和图挖掘简洁易用的、丰富的接口,极大地满足了对分布式图处理的需求。通过本章可学习属性图的概念,GraphX将图计算和数据计算集成到一个系统中,数据不仅可以被当作图进行操作,同样也可以被当作表进行操作。它支持大量图计算的基本操作,如subgraph()、mapReduceTriplets()等,也支持数据并行计算的基本操作,如map()、reduce()、filter()、join()等。从本章中可以学习如何使用计算模型Pregel完成平行图处理任务。

第7章讨论机器学习概念以及如何使用Spark MLlib和ML库运行预测分析,使用示例应用程序说明Spark机器学习领域中功能强大的API。MLlib和ML支持单个机器上存储的局部向量和矩阵,以及由一个或多个RDD支持的分布式矩阵。MLlib库也提供了一些基本的统计分析工具,包括相关性、分层抽样、假设检验、随机数生成等,在RDD和数据帧数据进行汇总统计功能;使用皮尔森或斯皮尔曼方法计算数据之间的相关性;还提供了假设检验和随机数据生成的支持。MLlib中包括Spark的机器学习功能,实现可以在计算机集群上并行完成的机器学习算法。MLlib拥有多种机器学习算法,用于二元以及多元分类和回归问题的解决,这些方法包括线性模型、决策树和朴素贝叶斯方法等;使用基于交替最小二乘算法建立协同过滤推荐模型。

第8章特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好作用的过程。这个过程包含特征提取、特征构建、特征选择等模块。本章学习了特征工程的工具集。根据具体问题,执行特征选择有很多不同的选项,如TF-IDF、Word2Vec和Vectorizers用于文本分析问题,适合文本的特征选择;对于特征转换,可以使用各种缩放器、编码器和离散器;对于向量的子集,可以使用VectorSlicer和Chi-Square Selector,它们使用标记的分类特征决定选择哪些特征。

第9章决策树和集成树是分类和回归的机器学习任务流行的方法,MLlib包支持二元分类、多元分类和回归分析的各种方法,总结各种机器学习算法,分类和回归:支持向量机、逻辑回归、线性回归、决策树、朴素贝叶斯分类;协作过滤技术包括交替最小二乘(ALS);聚类分析方法包括K均值和潜在狄利克雷分配(LDA)等。

第10章讲述如何设置一个完整的开发环境开发和调试Spark应用程序。本章使用Scala作为开发语言,SBT作为构建工具,讲述如何使用管理依赖项、如何打包和部署Spark应用程序。另外,本章还介绍Spark应用程序的几种部署模式。而在Spark 2.0中,通过SparkSession可以实现相同的效果,而不会显式创建SparkConf、SparkContext或SQLContext,因为它们被封装在SparkSession中。

第11章提供有关如何调整Apache Spark作业的相关信息,如性能调优介绍、Spark序列化库(如Java序列化和Kryo序列化)、Spark内存调优,还介绍了Spark数据结构调优、Spark数据区域性和垃圾收集调优。

本书已修改、更新和校对多次,但由于作者水平有限,加之Spark技术的快速更新和发展,书中疏漏和不足在所难免,真诚希望读者不吝赐教,不胜感激。

致谢

在本书的写作过程中,得到很多人士的悉心帮助,在此谨向给予本书帮助的诸位及本书所参考的官方网站和网站社区表示诚挚的感谢!

特别感谢对外经济贸易大学信息学院为本书的教学和实践提供了支持平台。

特别感谢软件工程师伊凡对本书中的代码进行了整理和调试,并提出了宝贵的意见。

代码和数据

本书涉及的Docker环境的部署脚本、代码以及数据,可以从Github资源库中得到,地址为https://github.com/leeivan/env.lab.spark.docker.git。

另一种方式是直接下载封装好的Docker镜像文件,地址为https://hub.docker.com/repository/docker/leeivan/spark-lab-env。

编者

2020年9月