Spark结构化数据流StructuredStreaming
- 格式:docx
- 大小:29.47 KB
- 文档页数:8
SparkStreaming实时数据分析与处理Spark Streaming是基于Apache Spark的分布式实时数据处理引擎,允许用户在实时处理中使用Spark的强大算法和可扩展性。
Spark Streaming可以从多种数据源接收数据,如Kafka、Flume、Twitter和网络套接字,并可将处理后的数据发送到HDFS、Cassandra、HBase和其他数据存储或查询系统中。
本文将介绍Spark Streaming的基础知识、架构、应用场景和优势,并展示如何利用Spark Streaming进行实时数据分析与处理。
一、Spark Streaming的基础知识Spark Streaming是Spark的一部分,它利用Spark的核心计算引擎实现了实时数据处理。
Spark Streaming将数据流划分为一系列小的批处理作业,这些批处理作业在Spark引擎上运行,可以使用全面的Spark API、Streaming API和第三方库。
Spark Streaming允许与许多数据源和数据存储系统进行无缝集成,包括Kafka、Flume、Twitter、HDFS、Cassandra和HBase等。
Spark Streaming的目标是为大规模实时数据处理提供高性能、低延迟和易于开发的平台。
二、Spark Streaming的架构Spark Streaming的架构基于微批处理模型,其核心是DStream (离散流),DStream是一组连续的RDD(弹性分布式数据集),RDD是Spark计算引擎的基本抽象。
每个DStream都代表一个由连续数据组成的流,其RDD是离散的,每个RDD包含一定的数据,它们被分配给Spark集群中的不同计算节点进行并行处理。
Spark Streaming中的每个批处理作业都由一个或多个RDD组成,这些作业可以使用全面的Spark API编写。
Spark Streaming还提供了内置的窗口和滑动窗口运算功能,使用户可以对时间序列数据进行聚合、过滤、转换和操作。
ict大数据复习题(含参考答案)一、单选题(共62题,每题1分,共62分)1.用户将证书上传到弹性负载均衡中,在创建()协议监听的时候绑定证书,提供HTTPS或TCP服务。
A、HTTPSB、HTTPC、TCPD、UDP正确答案:A2.LVS、Nginx节点服务正常时,每隔()秒会对ETCD节点连接,如果连续三次所有的ETCD节点都连接失败,产生集群健康检查告警。
A、1B、2C、3D、5正确答案:D3.ELB七层基于()实现。
A、LVSB、NginxC、HaproxyD、Apache正确答案:B4.常用的数据收集工具不包括?A、LoaderB、SparkC、KettleD、Sqoop正确答案:B5.为了提高Kafka的容错性,Kafka支持Partition的复制策略,以下关于Leader Partition和Follower Partition的描述错误的是:()。
A、Kafka针对Partition的复制需要选出一个Leader。
由该Leader负责Partition的读写操作。
其他的副本节点只是负责数据同步B、由于Leader Server承载了全部的请求压力。
因此从集群的整体考虑,Kafka会将Leader均衡的分散在每个实例上,来确保数据均衡C、一个Kafka集群各个节点间不可能互为Leader和FlowerD、如果Leader失效。
那么将会有其他follower来接管(成为新的Leader)正确答案:C6.Numpy包中创建数组的函数为(____)。
A、arrayB、ndimC、reshapeD、shape正确答案:A7.以下不属于CN自动剔除约束的是:()。
A、设置CN心跳超时时间的值大于0B、集群中的CN 总数必须大于等于3C、多CN故障时只能剔除一个CND、CN剔除以后,逻辑集群的创建、删除、扩容、缩容、回滚、显示操作可以执行正确答案:D8.以下不属于数据科学家主要职责的是(____) 。
cda level 考试大纲一、知识要求针对不同知识,掌握程度的要求分为【领会】、【熟知】、【应用】三个级别,考生应按照不同知识要求进行学习。
1、领会:考生能够领会了解规定的知识点,并能够了解规定知识点的内涵与外延,了解其内容要点和它们之间的区别与联系,并能做出正确的阐述、解释和说明。
2、熟知:考生须掌握知识的要点,并能够正确理解和记忆相关理论方法,能够根据不同要求,做出逻辑严密的解释、说明和阐述。
此部分为考试的重点部分。
3、应用:考生须学会将知识点落地实践,并能够结合相关工具进行商业应用,能够根据具体要求,给出问题的具体实施流程和策略。
二、考试范围1、大数据基础理论占比(8%)a.大数据分析基础(1%)b.Python 基础(5%)c.Linux & Ubuntu 操作系统基础(2%)2、Hadoop 理论占比(12%)a.Hadoop 安装配置及运行机制解析(2%)b.HDFS 分布式文件系统(2%)c.MapReduce 理论及实战(2%)d.Hadoop 生态其他常用组件(6%)3、大数据分析之数据库理论及工具占比(16% )a.数据库导论(2%)b.MySQL 理论及实战(3%)c.HBase 安装及使用(3%)d.Hive 安装及使用(5%)e.Sqoop 安装及使用(3%)4、大数据分析之数据挖掘理论基础占比(10%)a.数据挖掘的基本思想(2%)b.数据挖掘基本方法介绍(2%)c.有监督学习算法(4%)d.无监督学习算法(2%)5、大数据分析之 Spark 工具及实战占比(35%)a.Spark 基础理论(2%)b.Spark RDD 基本概念及常用操作(3%)c.Spark 流式计算框架 Spark Streaming 、Structured Streaming(5%)d.Spark 交互式数据查询框架 Spark SQL(5%)e.Spark 机器学习算法库 Spark MLlib 基本使用方法(15%)f.Spark 图计算框架 GraphX(5%)6、大数据分析之数据可视化方法占比(4%)a.数据可视化入门基础(1%)b.Python 数据可视化入门(2%)c.Python 高级数据可视化方法(1%)7、大数据分析实战占比(15%)a.利用 HDFS Shell 操作 HDFS 文件系统(1%)b.利用 Hive SQL 进行数据清洗(2%)c.利用 Sqoop 进行数据传输(1%)d.利用 Spark SQL 进行数据读取(2%)e.利用 Spark MLlib 进行机器学习建模(8%)f.利用 Python 进行建模结果数据可视化(1%)二、考试内容PART 1 大数据基础理论1 、大数据分析基础【领会】大数据技术诞生技术背景大数据技术实际应用分布式处理技术概念数据分析和数据挖掘的概念【熟知】明确数据分析的目标和意义明确分布式技术在进行海量数据处理时起到的关键作用数据分析方法与数据挖掘方法的区别和联系明确数据分析流程中不同软件工具的作用常用描述性统计方法常用数据挖掘方法2、Python 基础【领会】Python 语言的特点、语法、应用场景【熟知】Python 基础语法,包括基本数据类型、运算符、条件控制语句、循环语句等;Python 函数式编程,常用高阶函数,包括 map 函数、reduce 函数、filter 函数及模块相关功能Python 面向对象编程特性,包括类和实例、继承、多态利用 Python 链接数据库Python 可视化常用包及其基本使用方法3、Linux 与 Ubuntu 基础【领会】Linux 入门Linux 与 Ubuntu 的关系Ubuntu 的安装及配置Ubuntu 文件组织形式Ubuntu 操作系统的常用命令SSH 理论基础了解其他常用 Linux 系统,如 CentOS ,RedHat ,SUSE 等【熟知】Ubuntu 操作系统命令及使用命令编辑文件IP 地址的基础理论SSH 命令使用方法利用 SSH 基于密匙的安全验证进行多个节点间的无密码登陆【应用】安装配置 Linux 操作系统利用 SSH 基于密匙的安全验证进行多个节点间的无密码登陆掌握部分 shell 命令进行 Linux 操作,如 awk 、grep 、sed 典型的文本处理工具PART 2 Had oop 理论1、Had oop 安装配置及运行机制解析【领会】分布式系统设计的基本思想Hadoop 概念、版本、历史Hadoop 单机、伪分布及集群模式的安装配置步骤如何通过命令行和浏览器观察 Hadoop 的运行状态【熟知】Hadoop 单机、伪分布及集群模式的安装配置过程和内容Hadoop 参数格式Hadoop 参数的修改与优化Hadoop 的安全模式【应用】进行 Hadoop 集群的配置查看和管理 Hadoop 集群Hadoop 运行的日志信息查看与分析2、HDFS 分布式文件系统【领会】HDFS 的概念及设计HDFS 体系结构及运行机制,NameNode 、DataNode 、SecondaryNameNode 的作用及运行机制HDFS 的备份机制和文件管理机制【熟知】HDFS 的运行机制NameNode 、DataNode 、SecondaryNameNode 的配置文件HDFS 文件系统的常用命令【应用】使用命令及 Java语句操作 HDFS 中的文件使用 JPS 查看 NameNode 、DataNode 、SecondaryNameNode 的运行状态3、MapReduce 理论及实战【领会】MapReduce 的概念及设计MapReduce 运行过程中类的调用过程Mapper 类和 Reducer 类的继承机制job 的生命周期MapReduce 中 block 的调度及作业分配机制【熟知】MapReduce 程序编写的主要内容MapReduce 程序提交的执行过程MapReduce 程序在浏览器的查看【应用】Mapper 类和 Reducer 类的主要编写内容和模式job 的实现和编写编写基于 MapReduce 模型的 wordcount 程序相应jar 包的打包和集群运行4、Had oop 生态其他常用组件【领会】HBase 基本功能、Hive 基本功能、Sqoop 基本功能、ZooKeeper 的基本功能、Flink 基本功能【熟知】HBase 的安装配置及常用命令、Hive 的安装配置及常用命令、Sqoop 的安装配置及常用命令、ZooKeeper 的安装配置及常用命令、Flink 安装配置及常用命令【应用】HBase 、Hive 、Sqoop 、Flink 及 ZooKeeper 的安装与运行PART 3 大数据分析之数据库理论及工具1、数据库导论【领会】数据、数据库、数据库管理系统、数据库系统、数据仓库的概念数据管理发展的三个阶段,不同阶段数据管理的特点,特别是数据库系统的特点数据依赖及数据规范化理论、数据模型理论及方法【熟知】SQL 的基本概念和特点SQL 的数据定义功能SQL 的数据查询功能CRUD 操作SQL 的数据更新功能不同 NoSQL 数据库的特点及使用场合2、MySQL 理论及实战【领会】数据库、表、索引和视图的相关概念数据库完整性约束的概念、定义及使用方法数据库、表、索引和视图的维护方法【熟知】MySQL 中 SELECT 命令的基本格式掌握单表查询的方法和技巧掌握多表连接查询的方法和技巧掌握嵌套查询、集合查询的方法和技巧【应用】MySQL 平台下的 SQL 交互操作3、Hive 数据仓库基础【领会】Hive 数据仓库在 Hadoop 生态系统中的地位【熟知】Hive 与 HBase 的区别【应用】使用 Hive 进行频率统计4、Hive 的基本命令【领会】Hive 中的数据库概念、修改数据库【熟知】创建表、管理表、外部表、分区表、删除表【应用】向表中增加数据通过查询语句向表中插入数据单个查询语句中创建表并加载数据导出数据5、Hive 中检索数据【领会】Hive 中的命令语句是类 SQL 语句【熟知】SELECT …FROM 语句【应用】使用列值进行计算、算术运算符、使用函数、列别名、嵌套 SELECT 语句、WHERE 语句、group by 语句、集合运算、多表连接、内连接、外连接、笛卡尔积连接、order by 语句、抽样查询、视图。
SparkStreamingKafka是⼀种⾼吞吐量的发布订阅消息系统,它可以处理消费者在⽹站中的所有动作流数据。
概述 SparkStreaming简称DStream(离散流) 流式处理:数据源源不断的产⽣并且不断的处理 采样时间:每隔⼀段时间去拿⼀次数据2.原理与架构1.原理2.sparkstreaming数据处理流程特点3.sparkstreaming的数据容错4.实时性对于⽬前版本的Spark Streaming⽽⾔,其最⼩的Batch Size的选取在0.1秒钟之间(Storm⽬前最⼩的延迟是100ms左右),所以Spark Streaming能够满⾜除对实时性要求⾮常⾼(如⾼频实时交易)之外的所有流式准实时计算场景。
对⽐storm,storm实时性⾮常⾼,数据来⼀条处理⼀条针对于实时性⾮常⾼的业务场景可以选择storm或者flink针对于实时性不是⾮常⾼的业务场景,允许有⼀点点延迟,可以选⽤Sparkstreaming5.spark的架构3.DStream3.1什么是Dstream?(Dstream就是包含了⼀堆的⼩RDD)Discretized Stream是Spark Streaming的基础抽象,代表持续性的数据流和经过各种Spark算⼦操作后的结果数据流。
在内部实现上,DStream是⼀系列连续的RDD来表⽰。
每个RDD含有⼀段时间间隔内的数据,4.Dstream相关操作4.1:Transformations on DStreams ⽐较特殊的算⼦: (updateStateByKey有缺点,⼯作中不常⽤) transform(func)通过RDD-to-RDD函数作⽤于DStream中的各个RDD,可以是任意的RDD操作,从⽽返回⼀个新的RDDupdateStateByKey(func)根据key的之前状态值和key的新值,对key进⾏更新,返回⼀个新状态的DStreamtransform算⼦(1)UpdateStateByKey OperationUpdateStateByKey⽤于记录历史记录,保存上次的状态(2)Window Operations(开窗函数)窗⼝函数:需要两个参数(窗⼝长度,滑动距离)窗⼝长度和滑动距离必须是采样时间的整数倍滑动窗⼝转换操作:4.2:Output Operations on DStreamskafka中的topic的分区和sparkstreaming中⽣成的rdd没有啥关系,早kafkaUtils.createStream中增加分区foreachRDD(func)对Dstream⾥⾯的每个RDD执⾏func开窗函数开窗函数:需要两个参数(窗⼝长度,滑动距离)kafka与streaming的集成⽀持两种消费⽅式:Receiver DStream(使⽤spark中⾼层次的api)Direct DStream(使⽤spark中低层次的api)kafka中:0.8版本在zookeeper中维护0.10版本在broker中维护kafka集成streaming 0.8 与 kafka集成streaming 0.10 的区别Kafka direct 跟receiver ⽅式接收数据的区别?Receiver是使⽤Kafka的⾼层次Consumer API来实现的。
⼤数据开发实战:SparkStreaming流计算开发 1、背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop⽣态对实时和离线数据处理的⼀套完整处理解决⽅案。
除了此套解决⽅案之外,还有⼀种⾮常流⾏的⽽且完整的离线和 实时数据处理⽅案。
这种⽅案就是Spark。
Spark本质上是对Hadoop特别是MapReduce的补充、优化和完善,尤其是数据处理速度、易⽤性、迭代计算和复杂数据分析等⽅⾯。
Spark Streaming 作为Spark整体解决⽅案中实时数据处理部分,本质上仍然是基于Spark的弹性分布式数据集(Resilient Distributed Datasets :RDD)概念。
Spark Streaming将源头 数据划分为很⼩的批,并以类似于离线批的⽅式来处理这部分微批数据。
相对于Storm这种原⽣的实时处理框架,Spark Streaming基于微批的的⽅案带来了吞吐量的提升,但是也导致了数据处理延迟的增加---基于Spark Streaming实时数据处理⽅案的数据 延迟通常在秒级甚⾄分钟级。
2、Spark⽣态和核⼼概念 2.1、Spark概览 Spark诞⽣于美国伯克利⼤学的AMPLab,它最初属于伯克利⼤学的研究性项⽬,与2010年正式开源,于2013年成为Apache基⾦项⽬,冰⾬2014年成为Apache基⾦的顶级项⽬。
Spark⽤了不到5年的时间就成了Apache的顶级项⽬,⽬前已被国内外的众多互联⽹公司使⽤,包括Amazon、EBay、淘宝、腾讯等。
Spark的流⾏和它解决了Hadoop的很多不⾜密不可分。
传统Hadoop基于MapReduce的⽅案适⽤于⼤多数的离线批处理场景,但是对于实时查询、迭代计算等场景⾮常不适合,这是有其内在局限决定的。
1、MapReduce只提供Map和Reduce两个操作,抽象程度低,但是复杂的计算通常需要很多操作,⽽且操作之间有复杂的依赖关系。
对比介绍spark的两大流计算组件Spark是一个用于大数据处理的开源分布式计算系统。
它提供了许多组件和库,用于处理各种数据处理任务。
其中,两个最重要的流计算组件是Spark Streaming和Structured Streaming。
Spark Streaming是Spark的实时数据处理引擎。
它允许以微批处理的方式处理数据流,即将连续的数据流切分成一小段一小段的数据(称为微批),然后将每个微批作为RDD(弹性分布式数据集)进行处理。
Spark Streaming支持各种数据源,如Kafka、Flume、HDFS等,并且可以将数据流处理结果输出到各种目标,如HDFS、数据库等。
Spark Streaming的主要特点是低延迟和高吞吐量,适用于对实时性要求不高的实时数据处理任务。
Spark Structured Streaming是Spark 2.0版本引入的新的流计算组件。
它基于Spark的DataFrame和Dataset API,提供了更高级别的抽象,使得流计算任务可以像批处理任务一样进行编写,从而简化了流计算的开发过程。
Structured Streaming支持连续的数据流处理,而不是将数据流切分成微批进行处理。
它通过将输入数据流转换为一系列的DataFrame,然后使用DataFrame的操作进行处理,最后将处理结果输出到目标。
Structured Streaming的主要特点是完全的端到端的容错性和一致性,以及更好的开发人员体验。
Spark Streaming和Structured Streaming之间有几个重要的区别。
首先,Spark Streaming是基于RDD的,而Structured Streaming是基于DataFrame的。
RDD是一个分布式的弹性数据集,可以在内存中进行操作,而DataFrame是一个分布式的数据集,可以进行优化的查询。
另外,Spark Streaming使用微批处理的方式处理数据流,而StructuredStreaming使用连续的方式处理数据流。
SparkStreaming的原理与实现随着大数据时代的来临,实时处理数据已经成为了一个非常重要的需求。
在这个背景下,SparkStreaming应运而生。
SparkStreaming是一个分布式流处理系统,通过对来自各种数据源的实时数据进行处理,可以实现各种实时应用程序的构建。
本文将从SparkStreaming的原理、实现、应用场景以及与其他流处理系统的对比等方面进行探讨,以期对该系统有更深入的理解。
一、SparkStreaming的原理SparkStreaming的核心是基于Spark引擎来处理实时数据流。
Spark本身是一个大规模分布式计算框架,它主要是针对离线批处理任务优化的。
为了应对实时数据流处理的需求,Spark引擎在进行批处理的同时,还可以进行数据流的处理。
SparkStreaming的实现原理可以简述为:SparkStreaming会将接收到的数据流按照一定时间窗口进行批量处理,转化成RDD (Resilient Distributed Dataset),然后对RDD进行计算。
为了实现流式处理,SparkStreaming采用微批处理的方式,即接收到的流数据被按照一定时间间隔分成一批,称之为DStream(Discretized Stream),每个DStream里包含了一个或多个RDD。
在SparkStreaming中,DStream是一种高级别的抽象,可以进行快速开发。
DStream是由数据流实时生成的RDD序列组成,底层实现是一个RDD的序列,因此操作DStream与操作RDD一样,可以应用原本针对批处理设计的大部分算子。
通过这种方式,就可以在原有Spark框架的基础上,实现流处理的功能,从而提供快速、高效、可扩展的实时数据处理能力。
二、SparkStreaming的实现1.数据源SparkStreaming可以支持各种数据源,包括Kafka、Flume、HDFS,还可以有自己的数据源。
2.SparkStreaming运⾏机制和架构1 解密Spark Streaming运⾏机制上节课我们谈到了技术界的寻龙点⽳。
这就像过去的风⽔⼀样,每个领域都有⾃⼰的龙脉,Spark就是龙脉之所在,它的龙⽳或者关键点就是SparkStreaming。
这是上⼀节课我们⾮常清晰知道的结论之⼀。
⽽且上⼀节课,我们采⽤了降维的⽅式。
所谓降维的⽅式,是指把时间放⼤,就是把时间变长的情况下,我们做SparkStreaming的案例演⽰的实战,实战的结果是,我们发现在特定的时间段⾥⾯,确实是具体的RDD在⼯作,那么这⼀节课有必要在上⼀节课的基础上去谈⼀下它的运⾏机制和具体架构。
SparkStreaming在运⾏的时候,与其说是基于Spark Core上的⼀个流式处理的框架,不如说是它更像是SparkCore上的⼀个应⽤程序。
⽽且在我们上⼀节课演⽰的时候,Spark Streaming在运⾏的时候启动了很多的Job,这个Job包含了两个层⾯,第⼀个就是围绕你每个batch,或者每个window运⾏的具体的Job,也有是为了框架正常运⾏⽽启动的Job,例如我们Receiver启动的时候,它启动了Job,⽽这个启动的Job是为其他Job服务的,我们由此得出了⼀个结论:要做复杂的Spark应⽤程序,往往多个Job之间会进⾏配合。
所以,我们看SparkStreaming运⾏的时候,我们更多的是感受它是⼀个复杂的应⽤程序。
上⼀节课我们说过这样⼀句话,SparkStreaming就是最复杂的应⽤程序。
如果你对Spark Streaming了如指掌,你对任意的Spark程序的编写也⼀定没有问题。
我们以前基于SparkCore的时候都是基于RDD编程,包括以前的DataFrame,以及Spark 1.6.x推出的DataSet(据说Spark 2.x会成为主流),其实都是基于RDD编程。
整个Spark都是基于RDD构建起来的,SparkCore的处理每⼀步都基于RDD进⾏操作的,RDD之间有依赖关系,这已经是⼤家的常识了。
strunctured streaming原理
结构化流媒体(structured streaming)是一种现代化的流处理
引擎,构建在Apache Spark之上。
它提供了一种简单易用的
编程模型,用于处理连续的,且有序的数据流。
结构化流媒体的原理如下:
1. 输入数据流:结构化流媒体通过从不同的数据源接收输入数据流。
这些数据源可以包括文件系统、消息队列、Socket连接等。
输入数据流可以是实时产生的数据,也可以是历史数据。
2. 时间和窗口:结构化流媒体将输入数据流划分成小的时间间隔,称为批处理间隔。
每个批处理间隔都会产生一个微批处理作业。
窗口是一个时间段,在窗口内的数据可以进行聚合操作。
3. 数据转换:在每个微批处理作业中,结构化流媒体应用相应的转换操作,如过滤、映射、聚合等。
这些转换操作被应用到当前微批处理作业中的数据,生成结果。
4. 输出流:结构化流媒体可以输出结果到不同的数据接收器,如控制台、文件系统、数据库等。
输出结果可以是实时推送的,也可以是周期性批量输出的。
5. 检查点:为了容错和恢复功能,结构化流媒体会定期将应用程序的状态和元数据保存到持久化存储,称为检查点。
检查点可以用于在应用程序发生故障时,从上一次检查点恢复应用程序。
通过这种原理,结构化流媒体实现了实时和连续的数据处理,能够在小批量数据上进行高性能的转换和分析操作。
它具有高度可靠性、容错性和可伸缩性,适用于大规模的数据流处理应用。
使⽤Spark进⾏实时流计算的⽅法Spark Streaming VS Structured StreamingSpark Streaming是Spark最初的流处理框架,使⽤了微批的形式来进⾏流处理。
提供了基于RDDs的Dstream API,每个时间间隔内的数据为⼀个RDD,源源不断对RDD进⾏处理来实现流计算Apache Spark 在 2016 年的时候启动了 Structured Streaming 项⽬,⼀个基于 Spark SQL 的全新流计算引擎 Structured Streaming,让⽤户像编写批处理程序⼀样简单地编写⾼性能的流处理程序。
Structured Streaming是Spark2.0版本提出的新的实时流框架(2.0和2.1是实验版本,从Spark2.2开始为稳定版本)从Spark-2.X版本后,Spark Streaming就进⼊维护模式,看见Spark已经将⼤部分精⼒投⼊到了全新的Structured Streaming中,⽽⼀些新特性也只有Structured Streaming才有,这样Spark才有了与Flink⼀战的能⼒。
1、Spark Streaming 不⾜Processing Time ⽽不是 Event Time⾸先解释⼀下,Processing Time 是数据到达 Spark 被处理的时间,⽽ Event Time 是数据⾃带的属性,⼀般表⽰数据产⽣于数据源的时间。
⽐如 IoT 中,传感器在12:00:00 产⽣⼀条数据,然后在 12:00:05 数据传送到 Spark,那么 Event Time 就是 12:00:00,⽽ Processing Time 就是 12:00:05。
我们知道 Spark Streaming 是基于DStream 模型的 micro-batch 模式,简单来说就是将⼀个微⼩时间段,⽐如说 1s,的流数据当前批数据来处理。
Spark结构化数据流StructuredStreaming是一个构建在Spark SQL之上的一个高容错可扩展的流处理引擎。
当然你的流计算也可以用相同的方式对静态数据进行批处理计算。
它可以不断更新持续流进来的递增数据,并且将计算结果也持续的更新。
目前的Dataset/DataFrame的API支持的语言有Scala,Java和Python三种语言。
可以实现流聚合,事件窗口,Join聚合等。
结构化流处理是建立在Spark SQL优化引擎Catylist之上的又一引擎。
所以,其性能也是非常好的。
未来的发展的空间也是巨大的。
该种流处理保证有且只处理数据一次,同时实现端到端的数据。
通过检查点checkpoint和Write Ahead Logs机制实现高容错。
在Spark2.1版本中,其API仍然还是试验性质的,接下来我们就来一起走进StructuredStreaming的殿堂吧。
import org.apache.spark.sql.SparkSessionimport org.apache.spark.SparkConfobject Test {def main(args: Array[String]): Unit = {/** 配置信息:配置应用名称*StructuredStreaming Test* Master为local[3]*/val conf = new SparkConf().setAppName("StructuredStreaming Test").setMaster("local[3]")val spark =SparkSession.builder().config(conf).getOrCreate()import spark.implicits._//获取一行一行的数据,注意,此时的host对应的、//master为数据源那台机器的主机名//并且已经配置好了hosts文件里的ip与主机映射//此时的lines是一个DataFrame对象val lines = spark.readStream.format("socket").option("host", "master").option("port", 9999).load()//用Dataset里的flatMap方法将每行转换为一个一//个的单词val words = lines.as[String].flatMap(_.split(" ")) //单词计数val wordCounts = words.groupBy("value").count()//返回一个流查询对象val query =wordCounts.writeStream.outputMode("complet").format("console").start()//等待终端query.awaitTermination()}}图1-1 StructuredNetworkWordCount代码实现以上这段代码是处理的数据源是一台主机名为master的9999端口。
通过监听TCP端口实时监听获取流数据源。
因此,我们需要通过以下的方式来开启TCP端口的监听nc -lk 9999通过观察console的终端输出的结果,我们可以判定,这段程序处理的是以10秒为单位的微批数据,也就是说,每隔10秒钟进行一次计算。
此外,你还可以通过Spark官方提供的案例来运行你的第一个结构化流处理的应用程序。
在Spark官方提供的二进制包里面的bin目录下有一个run-examples的脚本,当加上org.apache.spark.examples.sql.streaming.StructuredNetworkWordCount的参数后,运行这个脚本,这样也能运行您的第一个结构化流处理程序。
运行了第一个结构化流程序之后,我们再回过头来看看Spark源码中提供给我们的三类案例。
这三类案例在Spark源码包中的路径为examples/src/main/java/org.apache.spark.sql.streaming/streaming和examples/src/main/scala/org.apache.spark.sql.streaming/streaming(源码的导入方法详见第xxx章第xxx节)在Java代码包路径下,一共有三个案例,分别为Java StructuredNetworkWo rdCount, Java StructuredKafkaworkWordCount, Java StructuredNetworkWor dCountWindowed。
在Scala代码包路径下,也是有三个案例,分别为StructuredNetworkWordC ount,StructuredKafkaworkWordCount,StructuredNetworkWordCount Windowed。
Java StructuredNetworkWordCount和StructuredNetworkWordCoun t的实现方法和图1-1是一样的。
那么我们接下来以kafka作为数据源来试验一下结构化流处理的实现方法。
首先创建一个类StructuredKafkaworkWordCountTest这里还有俩个案例没有试验完成:程序模型介绍:结构化流处理Structured Streaming的关键的思想是将一个实时流数据看做是一张持续动态追加数据的一张表。
这种思想产生了一种新的流处理模型。
这种流处理模型从某种程度上与批处理模型相似。
通过这种模型,我们可以采用批处理编程模型类似的方式进行编程,从而对流数据进行处理,就像标准批处理一样,对静态表数据进行查询,只不过这种查询通常会伴随着频繁的增量数据查询。
Spark官方也把这种处理数据的方式叫做类批处理。
值得注意的是,在图1-1的程序中,outputMode()的参数有三种方式,也就是说流数据写出到外部的存储系统有三种方式:CompleteAppendUpdate基本组件:Concepts将输入的数据流当做一张表,每一条新的数据流进来的时候,就被追加到新的输入表中,基于输入的查询操作将会生成一张结果表,无论什么时候结果表进行了更新,我们都将要写数据到外部的下游数据系统中。
处理Event-Time和延迟数据本身就内嵌到了Event-time之中了,对于一些应用来说,有可能会基于event-time进行统计,比如,如果你想要统计IoT设备每一分钟产生的数据的数量。
然后,你可能想基于数据产生的时间来统计,而不是数据到达Spark这一端时的处理时间,event这个概念在结构化流处理中非常的有用。
设备产生的每一个event在表中就是一行,而event-time就是该行中的一个字段属性,这使得基于window的聚合操作非常方便。
实质上,所谓的窗口函数,其实就是根据event-time或者Process-time进行特殊的分组,然后聚合。
每个窗口,就是一组。
此外,这个模型很自然的解决了处理延迟数据的问题,究竟要不要将延迟的数据加入统计结果当中。
如果要加,那么是将所有的都加吗?还是符合条件的才加,也就是延迟时间超过一定大小,我们就丢掉延迟数据,反之,我们仍然将数据添加进来。
Spark官方对此应用了watermarking的概念。
通过watermarking来作为评判标准和二者的分界线。
高容错语义的实现端到端的exactly-once语义是结构化流处理设计出来的关键目标。
Spark官方为了实现它,因而设计了结构化流处理的sources,sinks以及执行引擎engine去追踪数据的处理的进度,从而可以处理重新开始或者数据重复消费等任何情况下的各种失败。
首先,我们假设每个数据源都有offsets偏移量(类似kafka的偏移量),我们定位到了上一次消费的流数据的位置,引擎用checkpinting和write ahead logs去记录偏移量。
同时,结构化流sinks被设计成是幂等的。
这样,二者合在一起,通过可复制的数据源,Write Ahead Logs记录offset,checkpoint记录state,数据处理后的下游sinks又是幂等的。
最终就可以做到exactly once。
Spark2.0以及之后,DataFrame和Dat aset都可以通过SparkSession对象来静态调用对应的方法来创建,如果您还不太熟悉SparkSession,那就应该多看看Spark1.6后的Spark2.0了。
SparkSession.readStream()会返回一个DataStreamReaderData Source∙File source∙Kafka source∙Socket source (for testing) -DataStreamReader在Spark2.1.0的源码中是一个final类型的类,其只能是org.apache.spark.sql包下的其他类才能访问。
其成员方法format()指定输入数据源的数据格式,schema()指定数据的结构信息。
一些像Json这样的数据格式,DataStreamReader可以推断出来它的数据结构,所以不用显示定义其schema。
但是如果显示指定了其schema的话,加载数据的时候会跳过这个步骤,从而加速读取数据过程。
除此之外,还有如下的一些重要的方法。
在开发和性能调优的过程中可能会经常用到。
Option()方法:该方法通过传入字符串key和value的值,从而显示指定应用程序的配置属性值,比如应用的名称,应用的Master等。
每调用一次,就返回一个新的DataStreamReader。
Load()方法:该方法返回一个DataSet对象(也可以说是Dataframe对象,Dataframe是Dataset 的一种特殊形式,但是2.1.0版本的源码中又没有这个类存在了)。
DataStreamWriter同DataStreamReader类似,也是final类型,且访问权限也只是开放给sql 包。
其主要的方法和作用如下所示对于progress,这是一个只在outputMode为update的时候才用到的一个类,用于记录更新读写的进度。
由于都还处于试验阶段的API并且用到的场景比较有限,所以笔者就不过多的介绍了。
StreamingQuery 流查询,流查询是一个trait,对于StreamingQuery来说,我们只需要大概了解一下其定义的一些抽象的字段,从而对流查询这个概念有个大致的印象。