学习Spark2.0中的Structured Streaming(一)
转载自:http://lxw1234.com/archives/2016/10/772.htm
Spark2.0新增了Structured Streaming,它是基于SparkSQL构建的可扩展和容错的流式数据处理引擎,使得实时流式数据计算可以和离线计算采用相同的处理方式(DataFrame&SQL)。Structured Streaming顾名思义,它将数据源和计算结果都映射成一张”结构化”的表,在计算的时候以结构化的方式去操作数据流,大大方便和提高了数据开发的效率。
Spark2.0之前,流式计算通过Spark Streaming进行:

使用Spark Streaming每次只能消费当前批次内的数据,当然可以通过window操作,消费过去一段时间(多个批次)内的数据。举个简例子,需要每隔10秒,统计当前小时的PV和UV,在数据量特别大的情况下,使用window操作并不是很好的选择,通常是借助其它如Redis、HBase等完成数据统计。
Structured Streaming将数据源和计算结果都看做是无限大的表,数据源中每个批次的数据,经过计算,都添加到结果表中作为行。

先试试官方给的例子,在本地启动NetCat: nc -lk 9999
在另一个会话中:
cd $SPARK_HOME/bin
./spark-shell(以local模式进入spark-shell命令行),运行下面的程序:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder.appName("StructuredNetworkWordCount").getOrCreate() import spark.implicits._
val lines = spark.readStream.format("socket").option("host", "localhost").option("port", ).load() val words = lines.as[String].flatMap(_.split(" "))
val wordCounts = words.groupBy("value").count() val query = wordCounts.writeStream.outputMode("complete").format("console").start()
query.awaitTermination()
在NetCat会话中输入”apache spark”,spark-shell中显示:

在NetCat会话中分两次再输入”apache hadoop”,”lxw1234.com hadoop spark”, spark-shell中显示:

可以看到,每个Batch显示的结果,都是完整的WordCount统计结果,这便是结算结果输出中的完整模式(Complete Mode)。

关于结算结果的输出,有三种模式:
- Complete Mode:输出最新的完整的结果表数据。
- Append Mode:只输出结果表中本批次新增的数据,其实也就是本批次中的数据;
- Update Mode(暂不支持):只输出结果表中被本批次修改的数据;
这些Output,可以直接通过连接器(如MySQL JDBC、HBase API等)写入外部存储系统。
再看看Append模式,
注意:Append模式不支持基于数据流上的聚合操作(Append output mode not supported when there
are streaming aggregations on streaming DataFrames/DataSets);
import org.apache.spark.sql.functions._
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder.appName("StructuredNetworkWordCount").getOrCreate() import spark.implicits._
val lines = spark.readStream.format("socket").option("host", "localhost").option("port", ).load() val words = lines.as[String].flatMap(_.split(" ")) val query = words.writeStream.outputMode("append").format("console").start()
query.awaitTermination()
在NetCat中分三次输入:
apache spark
apache hadoop
lxw1234.com hadoop spark
spark-shell中显示:

只有当前批次的数据。
学习Spark2.0中的Structured Streaming(一)的更多相关文章
- Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...
- 浅谈Spark2.x中的Structured Streaming
在Spark2.x中,Spark Streaming获得了比较全面的升级,称为Structured Streaming,和之前的很不同,功能更强大,效率更高,跟其他的组件整合性也更好. 连续应用程序c ...
- Spark3.0分布,Structured Streaming UI登场
近日,在Spark开源十周年之际,Spark3.0发布了,这个版本大家也是期盼已久.登录Spark官网,最新的版本已经是3.0.而且不出意外,对于Structured Streaming进行了再一次的 ...
- DataFlow编程模型与Spark Structured streaming
流式(streaming)和批量( batch):流式数据,实际上更准确的说法应该是unbounded data(processing),也就是无边界的连续的数据的处理:对应的批量计算,更准确的说法是 ...
- Apache Spark 2.2.0 中文文档 - Structured Streaming 编程指南 | ApacheCN
Structured Streaming 编程指南 概述 快速示例 Programming Model (编程模型) 基本概念 处理 Event-time 和延迟数据 容错语义 API 使用 Data ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十一)定制一个arvo格式文件发送到kafka的topic,通过Structured Streaming读取kafka的数据
将arvo格式数据发送到kafka的topic 第一步:定制avro schema: { "type": "record", "name": ...
- geotrellis使用(二十五)将Geotrellis移植到spark2.0
目录 前言 升级spark到2.0 将geotrellis最新版部署到spark2.0(CDH) 总结 一.前言 事情总是变化这么快,前面刚写了一篇博客介绍如何将geotrellis移植 ...
- Spark2.0机器学习系列之12: 线性回归及L1、L2正则化区别与稀疏解
概述 线性回归拟合一个因变量与一个自变量之间的线性关系y=f(x). Spark中实现了: (1)普通最小二乘法 (2)岭回归(L2正规化) (3)La ...
- Spark2.0机器学习系列之6:GBDT(梯度提升决策树)、GBDT与随机森林差异、参数调试及Scikit代码分析
概念梳理 GBDT的别称 GBDT(Gradient Boost Decision Tree),梯度提升决策树. GBDT这个算法还有一些其他的名字,比如说MART(Multiple Addi ...
随机推荐
- spring定时任务配置,以及不执行的解决办法
前几天,同事问了我一个问题,我告诉他用spring的定时任务解决,并给他配置了spring的定时任务.当时随便找了一个bean写了一段代码,验证定时任务正确执行后,就没再管,昨天下午,同事写代码的时候 ...
- DLL注入之Appinit_Dlls
AppInit_DLLs is a mechanism that allows an arbitrary list of DLLs to be loaded into each user mode p ...
- Git学习之Git恢复进度
================================================ 继续暂存区未完成的实践 ======================================= ...
- Ubuntu 16.04 LAMP server tutorial with Apache 2.4, PHP 7 and MariaDB (instead of MySQL)
https://www.howtoforge.com/tutorial/install-apache-with-php-and-mysql-on-ubuntu-16-04-lamp/ This tut ...
- gulp生成发布包脚本
var formPost = require('./tools/submit.js');var gulp = require('gulp'), zip = require('gulp-zip'), h ...
- ERROR 1045 (28000): Access denied for user 'mycat'@'localhost' (using password: YES)
创建用户: mysql> grant all on db1.* to mycat@'%' identified by '123456'; Query OK, 0 rows affected (0 ...
- sencha touch 在视图中显示一个html页面
Ext.define('app.view.about.About', { alternateClassName: 'about', extend: 'Ext.Container', xtype: 'a ...
- openstack nova 用户管理
用户管理 创建管理员用户 用法: nova-manage user admin name [access] [secret] 其中access 和secret可 ...
- 搭建IPv4专有网络
搭建IPv4专有网络 版权归属:阿里云网站 本教程将指引您搭建一个具有IPv4地址块的专有网络,并为专有网络中的ECS实例绑定一个弹性公网IP(EIP)进行公网访问. 步骤一:创建专有网络和交换机 ...
- minix中二分查找bsearch的实现
在看minix中bsearch实现的源代码之前,先学习一下C 语言中void类型以及void*类型的使用方法与技巧. void的含义: void的字面意思是“无类型”,void *则为“无类型指针”, ...