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的更多相关文章

  1. Structured Streaming Programming Guide

    https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html http://www.slidesha ...

  2. Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming

    Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...

  3. Spark Structured streaming框架(1)之基本使用

     Spark Struntured Streaming是Spark 2.1.0版本后新增加的流计算引擎,本博将通过几篇博文详细介绍这个框架.这篇是介绍Spark Structured Streamin ...

  4. Spark Structured Streaming框架(2)之数据输入源详解

    Spark Structured Streaming目前的2.1.0版本只支持输入源:File.kafka和socket. 1. Socket Socket方式是最简单的数据输入源,如Quick ex ...

  5. Structured Streaming从Kafka 0.8中读取数据的问题

    众所周知,Structured Streaming默认支持Kafka 0.10,没有提供针对Kafka 0.8的Connector,但这对高手来说不是事儿,于是有个Hortonworks的邵大牛(前段 ...

  6. Structured Streaming Programming Guide结构化流编程指南

    目录 Overview Quick Example Programming Model Basic Concepts Handling Event-time and Late Data Fault T ...

  7. Spark2.3(四十二):Spark Streaming和Spark Structured Streaming更新broadcast总结(二)

    本次此时是在SPARK2,3 structured streaming下测试,不过这种方案,在spark2.2 structured streaming下应该也可行(请自行测试).以下是我测试结果: ...

  8. Structured Streaming教程(1) —— 基本概念与使用

    近年来,大数据的计算引擎越来越受到关注,spark作为最受欢迎的大数据计算框架,也在不断的学习和完善中.在Spark2.x中,新开放了一个基于DataFrame的无下限的流式处理组件--Structu ...

  9. Structured Streaming教程(2) —— 常用输入与输出

    上篇了解了一些基本的Structured Streaming的概念,知道了Structured Streaming其实是一个无下界的无限递增的DataFrame.基于这个DataFrame,我们可以做 ...

  10. Structured Streaming教程(3) —— 与Kafka的集成

    Structured Streaming最主要的生产环境应用场景就是配合kafka做实时处理,不过在Strucured Streaming中kafka的版本要求相对搞一些,只支持0.10及以上的版本. ...

随机推荐

  1. 初窥GPFS文件系统(转)

    原文地址:http://blog.csdn.net/jznsmail/article/details/5502840?reload 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化 ...

  2. 18.os模块获取url后缀

    针对文件下载文件重命名文件后缀的获取,此方式只适用url里有后缀的情况(其它的要根据情况去用类似方式获取字段后缀). import os A="http://www.铜陵市建筑工程信息网.c ...

  3. 解决在V2.0中子组件使用v-model接收来自父组件的值异常

    当我们使用父组件向子组件传值,当子组件中是v-model使用该值时会报:[Vue warn]: Avoid mutating a prop directly since the value will ...

  4. 3. powerdesigner 生成mysql脚本,要求字段、表名有注释

    1.字段注释设置 : 在 pdm 视图中,Database --> Edit Current DBMS. 找到 MySql5.0 --> Script --> Objects --& ...

  5. journalctl

    systemd 提供了自己的日志系统(logging system),称为 journal.使用 systemd 日志,无需额外安装日志服务(syslog).读取日志的命令: # journalctl ...

  6. Flex+BlazeDS+java通信详细笔记

    整了很长时间的通信,还是一直有一点问题.现在搞定了,记录一下,也跟有需求的同学们共享. 我重新把所有的过程再做一遍. 1新建Flex+BlazeDS+JAVA项目 右键.新建Flex项目 其中blaz ...

  7. 03.设计模式_抽象工厂模式(Abstract Fcatory)

    抽象工厂模式:创建一些列相关或者互相依赖的对象的接口,而无需指定他们具体的类, 1.创建工厂Factory: package patterns.design.factory; import java. ...

  8. PHPExcel在TP下使用

    第一:你要去PHPExcel官网下载,然后放到网站的Vendor文件夹下面.当然这是为了好管理和导入.你放在其他位置也没有关系. 第二:当然是在你需要的地方写代码.我只写样例,你看懂了就可以灵活的使用 ...

  9. Intellij IDEA编辑golang时无法加载系统GOPATH变量

    问题: 编译go项目时,报找不到包.从日志看,GOPATH与系统设置的不一致. 如何解决:系统的gopath路径,加到Project libraries中 参考:https://segmentfaul ...

  10. beego注解路由 [自定义方法]

    背景: beego生成的controller里面,默认get请求到由Get()方法处理:post请求由Post()方法处理 etc. 如果想自定义方法来处理请求,改怎么做? 直接拿beego的文档来说 ...