上一篇分享,我们了解了一些关于Spark架构,应用程序,结构化API,核心概念的内容,有了这些作为基础,这期我们将对Spark工具集的相关内容进行译文和学习,分享过程中若有错谬,欢迎拍砖。

Charpter 3.A Tour of Spark’s Toolset

  在第一期分享中,有下述图例,事实上,除了低级API和结构化API,Spark还提供了一系列标准库来实现额外功能,比如图分析,机器学习,流处理,以及其他计算和存储系统的集成能力等。

  本期分享的主要内容有:

  1、spark-submit;
  2、dataset;
  3、结构化流处理;
  4、机器学习和高级分析;
  5、RDD;
  6、SparkR;
  7、第三方软件包生态系统。

Running Production Applications

  Spark让开发和创建大数据程序变得容易,其内置命令行工具 spark-submit,让用户可以将交互式开发程序转变为生产应用程序。spark-submit首先将应用程序发送到集群,然后启动它并在集群中执行。一旦提交,应用程序就会运行至结束或抛出报错。spark-submit支持在所有集群管理器(Standalone,Mesos和YARN)中执行。spark-submit 提供了一些控制选项,用户可以指定applications所需资源,运行应用程序运行方式,命令行参数。用户可以用Spark支持的所有语言编写程序并提交执行,最简单的就是在本地计算机上运行application。
  现在我们运行一个Spark的example,它的功能是按一定精度计算pi值,local参数值表示本地运行,通过更改master参数也可以将应用提交给运行着Spark独立集群管理器,Mesos或YARN的集群,10是目标jar包的程序入参。

Datasets:Type-Safe Structured APIs

  我们要说的第一个Spark结构化API是Dataset,它是类型安全版本,被用在Java和Scala中编写静态类型代码。它在Python和R中不可用,因为这些语言是动态类型的。上一篇博文分享的DataFrame是Row类型对象的分布式集合,被用来存储各种类型的表格数据。而Dataset API让用户可以用Java / Scala类,去定义DataFrame的每条记录,并将其作为类型对象集合进行操作,如Java的ArrayList,Scala的Seq。 Dataset上可用的API是类型安全的,即Dataset对象不会被视为与初始定义类不相同的另一个类。这在编写大型应用程序时十分有效,不同开发者可通过定义好的接口进行交互。
  Dataset类通过内部包含对象的类型进行参数化,如Java的Dataset ,Scala的Dataset [T] 。举个例子,Dataset [Person]只包含Person类的对象。从Spark 2.0开始,受支持的类型遵循Java的JavaBean模式,或Scala的case类。这些类型之所以受限,是因为Spark需要可以自动分析类型T,并为Dataset中的表格数据创建适当模式。
  Dataset的一个优点是,只有当你需要时才可以使用它们。下面例子中,我们将定义自己的数据类型,并通过某种map函数和filter函数来操作它。操作完成后, Spark可以将其自动重新转换为DataFrame,且可以用Spark包含的数百个函数对其进行进一步操作,这样可以很容易地降到较低级的API,以便于在必要时执行类型安全的编码,同时,也可以将其升级到更高级的SQL,进行更快速的分析。下面的例子,展示了如何用类型安全函数和类似于DataFrame的SQL表达式来快速编写业务逻辑。

  当对Dataset使用collect或take时,它将会收集Dataset中合适类型的对象,而不是DataFrame的Row对象。这样可以更容易地保证类型安全,用分布式或本地方式更安全地执行操作,而无需更改代码。   上图的逻辑是,取出国家不为加拿大的5条记录。

Structured Streaming

  结构化流处理是用来处理数据流的高级API,Spark 2.2及之后版本可用。用户可以像在批处理模式下一样,用Spark的结构化API执行结构化流处理,结构化流处理可以减少等待时间,且允许增量处理。它能让用户快速从流式系统中提取有价值的信息,而且几乎不需要更改代码。用户可以按批处理模式进行设计,然后将其转换为流式作业,即增量处理数据,这使得流处理任务变得更简单。
  下面举个例子,看如何使用Spark结构化流处理。我们用到销售数据集(/tree/master/data/retail-data),该数据集有特定日期和时间信息,我们将使用按天分组的文件,每个文件代表一天的数据。我们用另外一个进程来模拟持续产生的数据,假设这些数据是由零售商持续生成的,并由我们的结构化流式处理作业进行处理。这里先简单展示一个数据样本,以便看到数据格式。

  我们首先将其看作静态数据集,而后创建一个DataFrame来进行分析,接着将该静态数据集创建一个schema。

  tips:spark-shell中有很多命令都是以:开始,比如退出为:quit。:paste 可以让spark-shell进入复制模式,复制完代码后,按下ctrl + D开始执行代码。(有兴趣可以参考https://blog.csdn.net/Android_xue/article/details/100517574)

  由于我们处理的是时间序列数据,因此需要提一下Spark是如何对数据进行分组和聚合的。在下面的例子中,我们将查看特定客户(主键为CustomerId)进行大笔交易的时间。我们会添加一个总费用列,并查看客户花费最多的时间。window函数包含每天的所有数据,它在我们的数据中,充当的是时间序列栏的窗口作用,这是一个用来处理日期和时间戳的有用工具,我们可以通过时间间隔来指定我们的需求,而Spark会把所有数据集合起来传递给用户。

  如果是运行在本地模式,最好将shuffle分区数设置为更适合本地模式的数量,该配置指定了在shuffle后,应该创建的分区数量。默认值是200(但由于本书作者机器上没有足够的执行进程,他把分区数减少为5)。

  了解了工作原理后,接着来看流处理代码,可以看到,代码改动很小,最大的变化是使用readStream而不是read,maxFilesPerTrigger选项指定我们每次读入的文件数。最后通过streamingDataFrame.isStreaming指令,可以看到,确实正在进行流处理。

  我们对流数据执行与之前静态DF一样的业务逻辑(按时间窗口统计花费)。

  由于是一个lazy操作,我们要调用流action操作来执行此数据流。流action与静态action有所不同,因为首先要将流数据缓存到某个地方,而不是像对静态数据那样直接调用count函数(对流数据没有任何意义)。流数据将被缓存到内存上的一个数据表里,在每次被触发器触发后更新这个内存缓存。上面将maxFilesPerTrigger设置为1,表示每次读完一个文件后都会被触发,Spark会基于新读入的文件更新内存数据表的内容,以便于聚合操作始终维护着历史数据的最大值。   启动数据流后,可以查看结果是否已被写入结果的接收器。

Machine Learning and Advance Analysis

  Spark使用MLlib机器学习算法内置库,来支持大规模机器学习。Mllib支持对数据进行预处理、整理、模型训练和大规模预测,甚至可以用MLlib中训练的模型在结构化流处理中对流数据进行预测。 Spark提供了一个复杂的机器学习API,用于执行各种机器学习任务,从分类到回归,从聚类到深度学习。为了说明这个功能,我们将使用称为k-means的标准聚类算法对数据执行一些基本的聚类操作。k-means是一种聚类算法。首先从数据中随机选出k个初始聚类中心,最接近某个中心的那些点被分配到一个聚类里,并根据分配到该聚类的点计算它们的中心,这个中心被称为centroid。然后,将最接近该centroid的点标记为属于该centroid的点,并根据分配到某个centroid的点群计算新的中心用来更新centroid。 重复这个过程来进行有限次的迭代,或者直到收敛(中心点停止变化)。
  Spark准备了许多内置的预处理方法,下面将演示这些预处理方法,这些预处理方法将原始数据转换为合适的数据格式,它将在之后用于实际训练模型中,并进一步进行预测。
  之前的案例,其数据由多种不同类型表示,包括时间戳、整数和字符串等。而MLlib中的机器学习算法要求将数据表示为数值形式,因此我们需要将这些数据进行转换。下面我们将用几个DataFrame转换来处理日期数据。

  我们也要将数据分成训练和测试集。在该例中,我们手动将某个购买日期前的数据作为训练集,之后的数据为测试集。我们也可以用MLlib的转换API,通过训练验证分割或交叉验证来创建训练和测试集。   现在我们已经准备好了数据,再把它分成一个训练集和一个测试集。由于这是一组时间序列数据,因此我们在数据集中选择一个一个的日期作为分割,虽然这可能不是训练集和测试集的最佳分割,但对于当前的这个例子来说,这种分割已经足够好了。可以看到我们的数据集被大致分为两部分。   这些转换是DataFrame转换,Spark的Mllib也有提供一些转换,可以用它们自动化一些常用转换。例如StringIndexer。   这将使每周的星期几转换成相应的数值,比如将星期六表示为6,但是,通过此编号方案,我们隐式指出星期六大于星期一(因为6大于1),这显然不正确。为了解决该问题,还要使用一个OneHotEncoder来将每个值编码为其原来对应的列,这些布尔变量标识了该数值是否为与星期几相关的日子。   其中每一个都会产生一组列,我们将它们组合成一个向量。 Spark中的机器学习算法输入都为vector类型,即一组数值。   我们有三个关键特征:价格、数量和星期几。接下来,把这些操作设置为流水线处理模式,就可以通过完全相同的流程对未来新产生的数据进行转换。   训练的准备过程要两步,首先需要为我们的数据设置合适的转换操作,且StringIndexer需要知道有多少非重复值,这样才能对应每个字符串一个数值,另外编码操作很容易,但Spark必须查看要索引的列中存在的所有不同值,这样才可以在稍后存储这些值。   在配置好了训练数据后,下一步是采用流水线处理模型完成整个数据的预处理过程,以持续的和可重复的模式来转换我们的所有数据。   我们可以将模型训练过程也加入到流水线处理过程中,但我们不这样做是为了缓存整个训练数据,以便于对模型训练过程中的参数进行调整,避免持续重复训练过程中的转换操作。缓存过程能将中间转换数据集的副本立即放入内存,使我们可以用较低代价反复访问数据,这远比重新运行整个流水线处理得到训练数据集节省开销。   我们现在有了一套训练数据集,可以开始训练这个模型了。首先,导入我们想用的相关模型包,并对其实例化。   在Spark中训练机器学习模型是具有两阶段。首先,需要初始化一个未经训练的模型,然后进行训练。在MLlib的DataFrame API中,每种算法都有两种类型,对于未经训练的算法版本,它们遵循“XX Algorithm”的命名方式,对于训练后的算法版本,我们使用“XXX AlgorithmModel”的命名方式。在我们的例子中,就是未训练的“KMeans”和训练完的“KMeansModel”。MLlib的DataFrame API中的预测器与我们之前看到的像StringIndexer这样的预处理转换操作使用大致相同的接口,它使得整个流水线处理过程(包括模型训练)变得简单。在这里,我们希望一步一步地解释,所以在这个例子中我们选择不把模型训练包含到流水线处理过程中。   在训练完这个模型后,我们可以使用kmModel.computeCost(transformedTraining),根据训练集的一些评价指标来评估开销。处理这个数据集带来的开销实际上相当高,这可能是由于我们的预处理和数据扩展部分没有做好,当然,我们可以继续改进这个模型,执行更多的预处理过程,以及执行超参数调整,确保获得一个更好的模型。

Lower-Level APIs

  Spark包含很多低级原语,以支持用RDD对任意Java和Python对象进行操作,事实上, Spark所有对象都建立在RDD之上。DataFrame操作也是基于RDD的,这些高级操作会被编译到较低级的RDD上执行,以便实现极其高效的分布式执行。有些时候你可能会使用RDD,尤其是在读取或操作原始数据时,但大多时候你应该坚持用高级的结构化API。 RDD比DataFrame更低级,因为它向终端用户暴露物理执行特性(如分区)。可以用RDD来并行化已经存储在驱动器机器内存中的原始数据。例如,让我们并行化一些简单的数字并创建一个DataFrame,我们可以将RDD转换为DataFrame,以便与其他DataFrame一起使用它。

  RDD可以在Scala和Python中使用,但它们并不完全等价,这与DataFrame API(执行特性相同)有所不同,这是由于RDD某些底层实现细节导致的区别。 Spark最新版本基本上没有RDD的实例,所以除了处理一些非常原始的未处理和非结构化数据之外,你应该使用结构化API而不是RDD。

SparkR

  SparkR是一个在Spark上运行的R语言工具,它具有与Spark其他支持语言相同的设计准原则。要使用SparkR,只需将SparkR库导入到环境中并运行。它与Python API非常相似,只是它遵循R的语法而不是Python的。大多时候, SparkR支持Python支持的所有功能。

Spark’s Ecosystem and Packages

  Spark最好的地方就在于开源社区维护的工具包和支持它的生态系统,工具在成熟并广泛使用后甚至可以直接进入Spark的核心项目。我们可以在https://spark-packages.org/找到Spark Packages的索引,所有用户都可以将自己开发的工具包发布到此代码库中,还可以在网上(如GitHub)找到各种其他项目和工具包。

Conclusion

  本章展示了将Spark应用到业务与技术中的多种方法, Spark简单强大的编程模型使其可以轻松应用于各类问题的处理,并且还有大量开发人员创建围绕它的软件包,这帮助Spark可以处理大量的业务问题与挑战。随着生态系统和社区的增长,越来越多的工具包可能会持续出现。

《Spark -- The Definitive Guide》学习笔记Note.3相关推荐

  1. 《Spark -- The Definitive Guide》学习笔记Note.2

      上一期中,通过翻译与凝练<Spark – The Definitive Guide>,我们初步解决了Spark是什么的问题,今天我们将继续学习Spark的基本架构,应用程序,结构化AP ...

  2. 《Spark -- The Definitive Guide》学习笔记Note.1

      华罗庚先生说过,"把薄书读厚,把厚书读薄".厚书读薄是梳理脉络,让整体结构变清晰.薄书读厚则是通过查证思考,对原文加以扩增,甚至达到批驳原文的程度.自小偏爱闲书,但在" ...

  3. 《Spark The Definitive Guide》Spark 权威指南学习计划

    本书出自OReilly的<Spark: The Definitive Guide Big Data Processing Made Simple>,由Matei Zaharia, Bill ...

  4. Spark The Definitive Guide Spark权威指南中文笔记

    目前在做Spark开发,所用到的参考资料便是Spark: The Definitive Guide.目前暂时没有中文版,为了记录学习和工作的过程,顺便等待中文版的推出,便将每章节的学习过程总结下来,以 ...

  5. 《Spark The Definitive Guide》Chapter 6:处理不同类型的数据

    前言 更多内容,参见:<Spark The Definitive Guide>Spark 权威指南学习计划 Chapter 6:处理不同类型的数据 这一章如题所示讲的就是如何使用DataF ...

  6. 第13课 spark内核架构解密学习笔记

    第13课 spark内核架构解密学习笔记  2016.01.16 内容: 1.通过手动绘图的方式解密spark内核架构 2.通过案例验证spark内核架构 3.spark架构思考 第一阶段:彻底精通s ...

  7. VCS User Guide学习笔记【使用精简版】

    VCS_UG学习笔记 除了说明性质的内容,关于命令和仿真,均是默认Verilog语言,暂不考虑SystemVerilog相关的内容. 环境: 运行脚本来验证你的系统配置:syschk.sh 库: 名称 ...

  8. 《Spark -- The Definitive Guide》学习笔记Note.4

      这一期开始,我们将要深入讨论Spark的结构化API,主要有DataFrame,SQL,Dataset,分享过程中若有错谬,欢迎拍砖. Part 2.Structured APIs--DataFr ...

  9. ICC使用----ICC 1 Lab Guide学习笔记

    文章目录 Preface ICC 1 Lab Guide Note: 1.Data Setup & Basic Flow(P27) Learning Objectives Create a M ...

最新文章

  1. R语言文摘:Subsetting Data
  2. Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组、split函数水平(按列)拆分二维numpy数组
  3. android jsoup简书,jsoup爬虫简书首页数据做个小Demo
  4. Git 基础 —— 安装 配置 别名 对象
  5. python3精要(40)-数组与矩阵
  6. git查看分支记录_git原理
  7. Fastreport.Net用户手册:报表对象
  8. Picture POJ - 1177(矩形周长并))
  9. ip,子网与子网掩码
  10. 剩余大学时光里要做的事
  11. 一杯水怎么测试_天气渐热食欲差、体质虚怎么办?每天一杯能量水——驼奶
  12. Internet Download Manager(IDM下载器)
  13. 矩阵的秩的一些定理证明
  14. Ubuntu卸载Anaconda步骤
  15. 霍尔编码器-STM32读取
  16. 【ThinkPHP】后台数组,赋值到前台模板HTML文件中的JS的变量,且以JSON对象形式存放
  17. 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
  18. 次氯酸钠发生器选型依据,再也不怕选不对设备了
  19. 使用ffmpeg剪辑视频【删除视频头部,尾部,中间,视频拼接,获取视频指定时间截图】
  20. 微信公众平台开发[3] —— 微信公众号支付功能(PHP)

热门文章

  1. 人气比较高的gitee开源项目,都是带有源码介绍的!
  2. html中设置背景透明,css如何设置背景透明
  3. 【图文解析 】Linux命令终端,又看会了,浮夸
  4. xml做配置文件 php,使用 PHP 处理 XML 配置文件
  5. 可信安全-1-安全可信网络安全观
  6. 红外发射管的使用以及发射角度与强度问题
  7. Linux学习04---用户与用户组管理
  8. 最新程序员工资统计表
  9. 无纸化测评计算机基础知识,《计算机应用基础》自考计算机无纸化考试
  10. H3C S12500X-AF系列交换机产品及维护介绍--优化