Spark(五) -- Spark Streaming介绍与基本执行过程
Spark Streaming作为Spark上的四大子框架之一,肩负着实时流计算的重大责任
而相对于另外一个当下十分流行的实时流计算处理框架Storm,Spark Streaming有何优点?又有何不足呢?
首先,对于Storm实时流处理惊人的低延迟性,Spark Streaming的不足很明显
Storm官方说的最低延迟可以使多少毫秒级别的
而Spark Streaming只能做到压秒,也就是零点几秒
相对于Storm的实时性来说,Spark Streaming甚至只能说是准实时的
But,Spark Streaming虽然在延迟性方面比不过Storm,但是Spark Streaming有太多太多的优点,以至于能够让人的注意力从Storm转移到Spark Streaming身上
第一,Spark Streaming是Spark的核心子框架之一。
说到Spark核心,那就不得不说RDD了。
Spark Streaming作为核心的子框架,对RDD的操作支持肯定是杠杠的,这又说明了什么?
Spark Streaming可以通过RDD和Spark上的任何框架进行数据共享和交流,这就是Spark的野心,一个堆栈搞定所有场景
第二,虽然Spark Streaming的延迟性比不过Storm,但是Spark Streaming也有自己的优势,那就是巨大的吞吐量,这点是Storm所比不上的
第三,由于Spark上子框架的编程模型基本都是一个套路,所以Spark Streaming的API也是十分易于掌握的
第四,Spark Streaming支持多语言编程,并且各个语言之间的编程模型也是类似的
第五,Spark Streaming的容错机制。Spark Streaming在读取流数据进入内存的时候会保存两个副本,计算只用一个,当出现问题的时候可以快速的切换到另外一个副本;在规定的时间内进行数据的固化;由于支持RDD操作,所以RDD本身的容错处理机制也被继承
Spark Streaming的处理过程:
- 以时间片为单位划分形成数据流形成RDD(DStream)
- 对每个划分数来的RDD以批处理的方式处理数据
- 每个划分出来的RDD地处理都会提交成Job
比较适用的场景:
- 历史数据和实时数据结合进行分析
- 对实时性要求不是很苛刻的场景
重要的组件:
- Job Scheduler:周期性查询DStream生成的DAG图,将其转换为Job提交到Job Manager
- Job Manager:维护Job队列,将Job提交到Spark运行
一些调优方式:
1、运行时间调优
- 并行度优化,确保任务使用集群所有资源,防止数据倾斜
- 减少数据序列化、反序列化的次数
- 合理调整批处理窗口
2、空间占用调优
- 定时清理不用的数据
- 控制批处理量,确保当前节点Spark的可用内存能够容纳这个batch窗口的所有数据
下面给出一个Spark Streaming的简单实例代码:
//根据sparkConf(spark配置信息)和Seconds(多少秒处理一次流数据)创建一个StreamingContext对象 val ssc = StreamingContext(sparkConf,Seconds(1)) //调用ssc的socketTextStream根据参数接收指定地址的数据,根据ssc的Seconds参数配置决定多长时间处理一次。这里的socketTextStream是专门处理socket数据的方法,对于其他数据来源,例如Flume,Kafka,Twitter等都有专门的方法来处理 val lines = ssc.socketTextStream(servIp,servPort) //对每一行数据进行分割 val words = lines.flatMap(_.Split(" ")) //统计word的数量 val pairs = words.map(word => (word,1)) val wordCounts = pairs.reduceByKey(_ + _) //输出结果 wordCounts.print() //开始 ssc.start() //计算完毕退出 ssc.waitTermination()
从以上代码中就很明显的可以看出Spark Streaming的编程模型和Spark上的其他子框架是差不多的,只不过针对实时流处理多了一些自身的操作而已
在执行这行代码的时候
val lines = ssc.socketTextStream(servIp,servPort)
lines其实是一个DStream的RDD对象
每一秒流进来的数据都会被处理成DStream对象,也就是一个个lines
在处理流进来的数据时,Spark Streaming是串行处理的,也就是说,当前面这个DStream在一秒之内还没有被处理完毕时,新的数据来了,那么此时的新数据会被阻塞住,直至当前的DStream处理完毕之后才处理下一个数据
如同上图所示,interval[0,1)和interval[1,2)是串行执行的,当interval1执行完毕(经过reduce操作到达第三个阶段时),才会处理interval2
但是我们可以看到每一行的产生的结果,也就是第三个阶段之间也会进行一些操作运算,这时是交给Spark内核引擎来并行处理的
对于串行引起的阻塞问题就涉及到Spark Streaming的一些优化了,如,Batch Size,每个数据分块的大小应该分为多少才会在规定的时间内处理完毕而不会引起阻塞?
答案是没有最好的Size,只有最合适的Size。
一切都是根据当前系统的状况来进行决定的,以系统反馈的数据说话

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spark(四) -- Spark工作机制
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/45728173 一、应用执行机制 一个应用的生命周期即,用户提交自定义的作业之后,Spark框架进行处理的一系列过程。 在这个过程中,不同的时间段里,应用会被拆分为不同的形态来执行。 1、应用执行过程中的基本组件和形态 Driver: 运行在客户端或者集群中,执行Application的main方法并创建SparkContext,调控整个应用的执行。 Application: 用户自定义并提交的Spark程序。 Job: 一个Application可以包含多个Job,每个Job由Action操作触发。 Stage: 比Job更小的单位,一个Job会根据RDD之间的依赖关系被划分为多个Stage,每个Stage中只存有RDD之间的窄依赖,即Transformation算子。 TaskSet: 每个Stage中包含的一组相同的Task。 Task: 最后被分发到Executor中执行的具体任务,执行Stage中包含的算子。 明确了一个...
- 下一篇
Spark(六) -- Spark计算模型
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/45788083 整个Spark框架都是基于RDD算子来进行计算的。 What is RDD? Resilient Distributed Dataset(RDD),分布式弹性数据集,是Spark上的一个核心抽象 表示用于并行计算的,不可修改的,对数据集合进行分片的数据结构 简单地,可以将RDD看成是Spark平台上的通用货币 在Spark上,针对各种各样的计算场景存在着各种各种的RDD,这些RDD拥有一些共同的操作,例如map,filter,persist等,就好像RDDs都是一个总RDD的子类一样,拥有所有RDD的共同特性 同时RDDs也拥有能表达自己特性的操作,例如PairRDDR有groupByKey,join等操作,而DoubleRDD有Doubles操作 所有的RDD都有以下特性: 可以表示数据分片的列表集合。将原始数据经过某些分片处理生成RDDs,这些RDD将用于并行计算 通用的算子来计算每个数据分片 包括transf...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境