[Spark] 08 - Structured Streaming
基本了解
响应更快,对过去的架构进行了全新的设计和处理。
核心思想:将实时数据流视为一张正在不断添加数据的表,参见Spark SQL's DataFrame。
一、微批处理(默认)
写日志操作 保证一致性。
因为要写入日志操作,每次进行微批处理之前,都要先把当前批处理的数据的偏移量要先写到日志里面去。
如此,就带来了微小的延迟。
数据到达 和 得到处理 并输出结果 之间的延时超过100毫秒。
二、持续批处理
例如:"欺诈检测",在100ms之内判断盗刷行为,并给予制止。
因为 “异步” 写入日志,所以导致:至少处理一次,不能保证“仅被处理一次”。
Spark SQL 只能处理静态处理。
Structured Streaming 可以处理数据流。
三、与spark streaming的区别
过去的方式,如下。Structured Streaming则采用统一的 spark.readStream.format()。
lines = ssc.textFileStream('file:///usr/local/spark/mycode/streaming/logfile') # <---- 这是文件夹!
lines = ssc.socketTextStream(sys.argv[1], int(sys.argv[2]))
inputStream = ssc.queueStream(rddQueue)
Structured Streaming 编程
一、基本步骤

二、demo 示范
代码展示
统计每个单词出现的频率。
from pyspark.sql import SparkSession
from pyspark.sql.functions import split
from pyspark.sql.functions import explode if __name__ == "__main__":
spark = SparkSession.builder.appName("StructuredNetworkWordCount").getOrCreate()
spark.sparkContext.setLogLevel('WARN')
# 创建一个输入数据源,类似"套接子流",只是“类似”。
lines = spark.readStream.format("socket").option("host”, “localhost").option("port", 9999).load()
# Explode得到一个DataFrame,一个单词变为一行;
# 再给DataFrame这列的title设置为 "word";
# 根据word这一列进行分组词频统计,得到“每个单词到底出现了几次。
words = lines.select( explode( split( lines.value, " " ) ).alias("word") )
wordCounts = words.groupBy("word").count() # <--- 得到结果
# 启动流计算并输出结果
query = wordCounts.writeStream.outputMode("complete").format("console").trigger(processingTime="8 seconds").start()
query.awaitTermination()
程序要依赖于Hadoop HDFS。
$ cd /usr/local/hadoop
$ sbin/start-dfs.sh
新建”数据源“终端
$ nc -lk 9999
新建”流计算“终端
$ /usr/local/spark/bin/spark-submit StructuredNetworkWordCount.py
输入源
一、File 输入源
(1) 创建程序生成JSON格式的File源测试数据
例如,对Json格式文件进行内容统计。目录下面有1000 json files,格式如下:

(2) 创建程序对数据进行统计
import os
import shutil
from pprint import pprint from pyspark.sql import SparkSession
from pyspark.sql.functions import window, asc
from pyspark.sql.types import StructType, StructField
from pyspark.sql.types import TimestampType, StringType TEST_DATA_DIR_SPARK = 'file:///tmp/testdata/' if __name__ == "__main__": # 定义模式
schema = StructType([
StructField("eventTime" TimestampType(), True),
StructField("action", StringType(), True),
StructField("district", StringType(), True) ]) spark = SparkSession.builder.appName("StructuredEMallPurchaseCount").getOrCreate()
spark.sparkContext.setLogLevel("WARN") lines = spark.readStream.format("json").schema(schema).option("maxFilesPerTrigger", 100).load(TEST_DATA_DIR_SPARK) # 定义窗口
windowDuration = '1 minutes'
windowedCounts = lines.filter("action = 'purchase'") \
.groupBy('district', window('eventTime', windowDuration)) \
.count() \
.sort(asc('window''))
# 启动流计算
query = windowedCounts \
.writeStream \
.outputMode("complete") \
.format("console") \
.option('truncate', 'false') \
.trigger(processingTime = "10 seconds") \ # 每隔10秒,执行一次流计算
.start() query.awaitTermination()
(3) 测试运行程序
a. 启动 HDFS
$ cd /usr/local/hadoop
$ sbin/start-dfs.sh
b. 运行数据统计程序
/usr/local/spark/bin/spark-submit spark_ss_filesource.py
c. 运行结果

二、Socket源和 Rate源
(因为只能r&d,不能生产时间,故,这里暂时略)
一般不用于生产模式,实验测试模式倒是可以。
from pyspark.sql import SparkSession
if __name__ == "__main__":
spark = SparkSession.builder.appName("TestRateStreamSource").getOrCreate()
spark.sparkContext.setLogLevel('WARN')
紧接着是下面的程序:

# 每秒钟发送五行,属于rate源;
# query 代表了流计算启动模式;
运行程序
$ /usr/local/spark/bin/spark-submit spark_ss_rate.py
输出操作
一、启动流计算
writeStream()方法将会返回DataStreamWrite接口。
query = wordCounts.writeStream.outputMode("complete").format("console").trigger(processingTime="8 seconds").start()

输出 outputMode 模式

接收器 format 类型
系统内置的输出接收器包括:File, Kafka, Foreach, Console (debug), Memory (debug), etc。
生成parquet文件
可以考虑读取后转化为DataFrame;或者使用strings查看文件内容。
代码展示:StructuredNetworkWordCountFileSink.py
from pyspark.sql import SparkSession
from pyspark.sql.functions import split
from pyspark.sql.functions import explode
from pyspark.sql.functions import length

只要长度为5的dataframe,也就是单词长度都是5。

"数据源" 终端
# input string to simulate stream.
nc -lk 9999
"流计算" 终端
/usr/local/spark/bin/spark-submit StructuredNetworkWordCountFileSink.py
End.
[Spark] 08 - Structured Streaming的更多相关文章
- Spark之Structured Streaming
目录 Part V. Streaming Stream Processing Fundamentals Structured Streaming Basics Event-Time and State ...
- Structured Streaming Programming Guide结构化流编程指南
目录 Overview Quick Example Programming Model Basic Concepts Handling Event-time and Late Data Fault T ...
- Structured Streaming编程 Programming Guide
Structured Streaming编程 Programming Guide Overview Quick Example Programming Model Basic Concepts Han ...
- 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 ...
- Spark2.3(四十二):Spark Streaming和Spark Structured Streaming更新broadcast总结(二)
本次此时是在SPARK2,3 structured streaming下测试,不过这种方案,在spark2.2 structured streaming下应该也可行(请自行测试).以下是我测试结果: ...
- Spark2.2(三十三):Spark Streaming和Spark Structured Streaming更新broadcast总结(一)
背景: 需要在spark2.2.0更新broadcast中的内容,网上也搜索了不少文章,都在讲解spark streaming中如何更新,但没有spark structured streaming更新 ...
- Spark2.2(三十八):Spark Structured Streaming2.4之前版本使用agg和dropduplication消耗内存比较多的问题(Memory issue with spark structured streaming)调研
在spark中<Memory usage of state in Spark Structured Streaming>讲解Spark内存分配情况,以及提到了HDFSBackedState ...
随机推荐
- [ZJOI2011]看电影(组合数学,高精度)
[ZJOI2011]看电影 这题模型转化很巧妙.(神仙题) 对于这种题首先肯定知道答案就是合法方案除以总方案. 总方案显然是\(k^n\). 那么考虑怎么算合法方案. 当\(n>k\)的时候显然 ...
- 纯数据结构Java实现(5/11)(Set&Map)
纯数据结构Java实现(5/11)(Set&Map) Set 和 Map 都是抽象或者高级数据结构,至于底层是采用树还是散列则根据需要而定. 可以细想一下 TreeMap/HashMap, T ...
- ES6之解构
1.ES6允许按照一定的模式,从数组中和对象中提取值,对变量进行赋值,这种称为解构(Distructuring): let [a,b,c] = [3,5,6];// 相当于 a=3,b=5,c=6 本 ...
- 从零开始搭建Java开发环境第二篇:如何在windows10里安装MySQL
1 下载安装包 1.1 压缩包 https://dev.mysql.com/downloads/mysql/ [外链图片转存失败(img-oesO8K09-1566652568838)(data:im ...
- JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序
1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...
- CF 1206D - Shortest Cycle Floyd求最小环
Shortest Cycle 题意 有n(n <= 100000)个数字,两个数字间取&运算结果大于0的话连一条边.问图中的最小环. 思路 可以发现当非0数的个数很大,比如大于200时, ...
- CCPC 网络赛
array 做法 比赛中的表现..... 已经无法言语形容了. 题意是,查询前缀中大于某个数字的 mex,在线. 一下把问题转化为偏序问题.... 带修主席树?????这下好,直接一箭穿心,武将被移除 ...
- HDU2222Keywords Search AC_自动机
http://blog.csdn.net/niushuai666/article/details/7002823 #include <iostream> #include <cstd ...
- UVALive - 6667 Longest Chain CDQ3维问题
题意:现在有一个点堆, 一开始先给你m个点,然后再用题目中的rand函数生成剩下的n个点,问在这个点堆中可以找到的最长严格递增序列的长度是多少. 题解: 很常见的一个3维CDQ. 先按照z轴 sort ...
- CodeForces 982 D Shark
Shark 题意:一个研究员观察了一条鲨鱼n天的运动,然后这条鲨鱼他只会往前走,不会回到去过的地方,现在有一个k,,如果鲨鱼当天游过的距离 >= k, 代表的鲨鱼在这天会前往下一个地点,现在求鲨 ...