Structured streaming
Structured streaming是spark 2.0以后新增的用于实时处理的技术。与spark streaming不同的是,Structured streaming打开了数据源到数据落地之间的限制,它这两个端整合起来,形成真正的“流”,形成一张巨大的表。同时也正因为此特点,真正实现了exactly once语义。
传统的spark streaming处理流程

在spark streaming中可能实现从数据源到计算的"exactly once",但在数据落地的时候,并不能。比如,数据处理完毕,写入redis的过程中,集群崩掉。那么重启后,这部份数据会丢掉或者重复消费。除非自己去实现。而在Structured streaming中都已经得到了较好的实现。
Structured streaming处理流程

话不多说,先来个官网的例子,最直观的感受
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.streaming.ProcessingTime object structured{ def main(args: Array[String]) {
val spark = SparkSession
.builder
.appName("StructuredNetworkWordCount")
.master("local")
.getOrCreate() import spark.implicits._ val ds1 = spark
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "master:9092")
.option("subscribe", "test2")
.load() System.setProperty("hadoop.home.dir", "\\hadoop-common-2.2.0-bin-master")
spark.sparkContext.setCheckpointDir("/chekpoint") val ds2 = ds1.selectExpr("CAST (value as STRING) ").as[String] val words = ds2.as[String].flatMap(_.split(" ")) val wordCounts = words.groupBy("value").count() val query = words
.writeStream
.outputMode("append")
.format("console")
.trigger(ProcessingTime("11 seconds"))
.start() query.awaitTermination()
} }
最直观的可以看到:
1:跟spark streaming不同,Structured streaming已经纳入了spark sql的框架
2:统一了api,以kafka作为消息源为例,原来的KakfaUtils.Dsteam或才directDstream统一变成了read,readStream,输出统一为write,writeStream
3:没有了sparksteramingcontext,计算的启动和等待,任务执行间隔时间设置都变成了由数据启动
需要注意的地方
1:.master("local")
2:System.setProperty("hadoop.home.dir", "e:\\hadoop-common-2.2.0-bin-master") 如果是在windows本地测试,需要设置hadoop本地环境
3:spark.sparkContext.setCheckpointDir("e:/chekpoint") Structured streaming 目前(2.1.1)支持三种输出模式,除了append以外都需要checkpoint的支持,可是append不支持聚合操作(Append output mode not supported when there are streaming aggregations on streaming DataFrames/DataSets),使用场景实在有限
4:ds1.selectExpr 一定要使用一个dataset去接收
5:定时设置 .trigger(ProcessingTime("10 seconds")) 或者 .trigger(ProcessingTime(10,TimeUnit.SECONDS))
问题
1:没有了sparksteramingcontext,一些sparkconf参数怎么设置。比如说,控制kafka消费速率,
.set("spark.streaming.backpressure.enabled", "true")
.set("spark.streaming.receiver.maxRate", "3")
.set("spark.streaming.kafka.maxRatePerPartition", "12")由spark.sparkContext.getConf.set(key, value)设置?效果如何?有无其它方法?
2:统一了读取消息的api以后,就kafka而言,还有没有低阶和高阶api之分(DStream和DirectDStream)?是否需要自己自己去控制offset?
3:输出模式的异同。append不允许聚合操作,那么使用场景非常有限,意义何在?complete会保留完整的数据(以往各批次),在窗口操作方面较以前的话更有优势,但是时间长了会不会占用非常多的资源?它的内部机制?如何只想得到当次数据,但又要做聚合操作,有没有方法?update是最新(2.1.1)才正式上线的功能。
4:实现exactly once依靠的是 .foreach(new ForeachWriter[Row]一条一条处理来实现的?那么,可以批量写提升效率吗?
未完待续
Structured streaming的更多相关文章
- Structured Streaming Programming Guide
https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html http://www.slidesha ...
- Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...
- Spark Structured streaming框架(1)之基本使用
Spark Struntured Streaming是Spark 2.1.0版本后新增加的流计算引擎,本博将通过几篇博文详细介绍这个框架.这篇是介绍Spark Structured Streamin ...
- Spark Structured Streaming框架(2)之数据输入源详解
Spark Structured Streaming目前的2.1.0版本只支持输入源:File.kafka和socket. 1. Socket Socket方式是最简单的数据输入源,如Quick ex ...
- Structured Streaming从Kafka 0.8中读取数据的问题
众所周知,Structured Streaming默认支持Kafka 0.10,没有提供针对Kafka 0.8的Connector,但这对高手来说不是事儿,于是有个Hortonworks的邵大牛(前段 ...
- Structured Streaming Programming Guide结构化流编程指南
目录 Overview Quick Example Programming Model Basic Concepts Handling Event-time and Late Data Fault T ...
- Spark2.3(四十二):Spark Streaming和Spark Structured Streaming更新broadcast总结(二)
本次此时是在SPARK2,3 structured streaming下测试,不过这种方案,在spark2.2 structured streaming下应该也可行(请自行测试).以下是我测试结果: ...
- Structured Streaming教程(1) —— 基本概念与使用
近年来,大数据的计算引擎越来越受到关注,spark作为最受欢迎的大数据计算框架,也在不断的学习和完善中.在Spark2.x中,新开放了一个基于DataFrame的无下限的流式处理组件--Structu ...
- Structured Streaming教程(2) —— 常用输入与输出
上篇了解了一些基本的Structured Streaming的概念,知道了Structured Streaming其实是一个无下界的无限递增的DataFrame.基于这个DataFrame,我们可以做 ...
- Structured Streaming教程(3) —— 与Kafka的集成
Structured Streaming最主要的生产环境应用场景就是配合kafka做实时处理,不过在Strucured Streaming中kafka的版本要求相对搞一些,只支持0.10及以上的版本. ...
随机推荐
- Loadrunner:win10下Vuser 运行脚本通过,Controller执行用户并发报错
现象:win7安装LR可以正常使用,将win7升级到win10之后,运行场景之后报错:Error (-81024): LR_VUG: The 'QTWeb' type is not supported ...
- StorageLevel
val NONE = new StorageLevel(false, false, false, false) val DISK_ONLY = new StorageLevel(true, fals ...
- PHP 服务 php-fpm 的一些常见配置
< 操作系统 Centos7,PHP版本7.2.7 > 已下所有配置涉及到时间单位均使用 => 秒(s) 分 (m) 时 (h) 天(d) [ 以下为全局配置 ] 01,关于,进程文 ...
- 使用jquery刷新当前页面、刷新父级页面
如何使用jquery刷新当前页面 下面介绍全页面刷新方法:有时候可能会用到 window.location.reload(); //刷新当前页面.(我用的这个一个,非常好) parent.locati ...
- configparser 模块
import configparser #按字典方式操作 config = configparser.ConfigParser() #创建config 对象 #config对象test 等于 {'na ...
- LeetCode 312. Burst Balloons(戳气球)
参考:LeetCode 312. Burst Balloons(戳气球) java代码如下 class Solution { //参考:https://blog.csdn.net/jmspan/art ...
- 在Linux中简单实现回收子进程
学习到wait函数了,这个函数的作用是用来回收进程.一般来说,正常退出的进程是不需要我们来专门回收的.但是进程有这两种:孤儿进程和僵尸进程. 孤儿进程: 通俗点说就是父进程先于子进程死亡.此时子进程就 ...
- 在新安装的Linux系统中,防火墙默认是被禁掉的,一般也没有配置过任何防火墙的策略,所有不存在/etc/sysconfig/iptables文件。
原因:在新安装的Linux系统中,防火墙默认是被禁掉的,一般也没有配置过任何防火墙的策略,所有不存在/etc/sysconfig/iptables文件. 解决办法: .随便写一条iptables命令配 ...
- python小实例一:简单爬虫
本文所谓的爬虫就是通过本地远程访问url,然后将url的读成源代码形式,然后对源代码进行解析,获取自己需要的数据,相当于简单数据挖掘.本文实现的是将一个网页的图片爬出保存到本地的过程,例子很简单,用的 ...
- 给tkinter文本框添加右键菜单
给tkinter文本框添加右键菜单 需求:直接右键点击使用tkinter创建的文本框是不会弹出菜单的.我们需要实现右键点击tkinter框架下的Entry对象.Text对象后弹出右键菜单可复制.粘贴和 ...