基本了解

响应更快,对过去的架构进行了全新的设计和处理。

核心思想:将实时数据流视为一张正在不断添加数据的表,参见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的更多相关文章

  1. Spark之Structured Streaming

    目录 Part V. Streaming Stream Processing Fundamentals Structured Streaming Basics Event-Time and State ...

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

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

  3. Structured Streaming编程 Programming Guide

    Structured Streaming编程 Programming Guide Overview Quick Example Programming Model Basic Concepts Han ...

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

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

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

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

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

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

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

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

  8. Spark2.2(三十三):Spark Streaming和Spark Structured Streaming更新broadcast总结(一)

    背景: 需要在spark2.2.0更新broadcast中的内容,网上也搜索了不少文章,都在讲解spark streaming中如何更新,但没有spark structured streaming更新 ...

  9. 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 ...

随机推荐

  1. Python 数据科学-Numpy

    NumPy Numpy :提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库.用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多.本身是由C语 ...

  2. 2015-11-17 linux基础笔记

    21. 可执行权限不代表能够执行,这得看文件内容 22. 还是可以用适当的拓展名表示该文件是什么种类的*.sh  脚本或批处理文件 *Z.*.tar.*.tar.gz.*.zip.*.tgz 压缩文件 ...

  3. lrzsz——一款好用的文件互传工具

    日常开发中,经常需要在linux服务器和本地计算机(Windows或者Mac)两者之间传输文件,这时候就需要用到文件传输工具了. 最近偶然发现一款很好用的文件互传工具: lrzsz .墙裂推荐,好用指 ...

  4. 2013-2014 ACM-ICPC Pacific Northwest Regional Contest D.Delta Quadrant

    题意略. 思路: 由于这是一颗无根树,我们可以贪心地来删去边. 详见代码: #include<bits/stdc++.h> using namespace std; typedef lon ...

  5. PHP识别简单的图片上面的数字(可扩展)

    1.场景 最近在学习图片处理,就是特意把数字生成一个图片,然后再用程序去识别图片的数字.这就有了一下的学习过程. 2.原理分析 2.1 首先是将图片像素化,二值化,然后和字模去对比(需要相对于配置字模 ...

  6. 【管理学】PDCA

  7. Apache JMeter HTTPS(S) Test Script Recorder

    参考Apache官网资料:http://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.pdf 1. 进入apache-jmeter-2. ...

  8. LuoGu-P1239计数器-强大的贡献

    P1239 计数器 题意:就是求从1到n间,1-9一共出现的次数 这道题直接暴力是不科学的,因为N有 1e9: 然后我就看到了一个很好的从贡献思考的方法: ——>转自洛谷学神的方法: 楼下dal ...

  9. codeforce375div2-D. Lakes in Berland 搜索

    Lakes in Berland 题意与解释:这道题就是求图中被围起来的点群,问最少去掉几个点,可以使得孤立的点群数目为K; 因为自己写的代码又长又had bugs. 我自己写的bfs,想着是先染色, ...

  10. 牛客暑假多校第一场 J Different Integers

    题意:给你一个数组, q次询问, 每次询问都会有1个[l, r] 求 区间[1,l] 和 [r, n] 中 数字的种类是多少. 解法1, 莫队暴力: 代码: #include<bits/stdc ...