11-Structured Streaming -- Scala版本

前言

学习Spark的Structured Streaming(结构化流)。
官网:http://spark.apache.org/docs/latest/structured-streaming-programming-guide.html

1. 快速示例

博主这里仍然使用的是Spark 集群运行。
假设从侦听TCP套接字的数据服务器接收的文本数据的运行字数。

  1. 编写代码
import org.apache.spark.sql.functions._
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.SparkSession._

// 创建SparkSession
val spark = SparkSession.builder.appName("StructedStreaming").getOrCreate()

// 创建流式DataFrame
val lines = spark.readStream.format("socket").option("host", "localhost").option("port", 9999).load()

// 先转换为字符串数据集,然后分割
val words = lines.as[String].flatMap(_.split(" "))

// 按值分组并计数
val wordsCount = words.groupBy("value").count()

// 输出到控制台, 并启动
val query = wordsCount.writeStream.outputMode("complete").format("console").start()

// 防止查询处于活动状态时退出
query.awaitTermination()
  1. 先启动传输套接字
    在master 节点输入:
nc -lk 9999

在这里插入图片描述
3. 启动Spark 应用
终端运行 spark-shell,进入scala的shell,复制代码:
在这里插入图片描述
在WebUI 下,也可以看到相应的Job 情况:
在这里插入图片描述
4. 测试数据
在nc 中输入数据:
在这里插入图片描述
可以看到shell中正在执行计算步骤:
在这里插入图片描述
计算结果:
在这里插入图片描述
再次输入:
在这里插入图片描述
在这里插入图片描述
你可以看到输出结果包括了之前的数据,是因为输出时设置了选项为 “complete”。
有如下三种输出模式:
在这里插入图片描述
也称为“增量查询”:该查询将先前运行的计数与新数据相结合,以计算更新的计数。

如,官网图例:
在这里插入图片描述

2. 创建DataFrame和流式数据集

使用本地文件系统,监控一个本地目录,按照csv格式解析:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.SparkSession._
import org.apache.spark.sql.types.StructType

// 创建schema
val userSchema = new StructType().add("name", "string").add("age","integer")

// 创建
val csvDF = spark.readStream.option("sep",";").schema(userSchema).csv("file:///home/hadoop/test_data/")

// 输出模式只能选择append
val query = csvDF.writeStream.outputMode("append").format("console").start()
query.awaitTermination()

在/home/hadoop 下创建 test_data目录:
在这里插入图片描述
复制代码到shell,运行:
在这里插入图片描述
输入测试数据:
在这里插入图片描述
结果:
在这里插入图片描述

完!

Spark StreamingStructured Streaming都是Apache Spark用于处理实时流数据的组件,但它们之间有一些关键的区别: 1. **数据模型**: Structured Streaming(从2.0版本开始)引入了一种更统一的数据模型,它支持批处理和流处理的无缝集成,可以直接操作基于DataFrame或Dataset的数据结构,这使得数据转换和分析更加直观和一致。而Spark Streaming最初的设计是基于RDD(弹性分布式数据集),它的API与批处理有所不同。 ```scala // Structured Streaming 示例 val streamDF = spark.readStream.format("csv").option("sep", ",").load("...") val processedStream = streamDF.transform(...).writeStream ... ``` 2. **易用性**: Structured Streaming的API设计更接近于Spark SQL,使得开发人员能够利用已有的SQL查询和DataFrame API来编写复杂的流处理逻辑,提高了开发效率。 3. **状态管理**: Structured Streaming通过Watermark机制更好地处理延迟数据和容错性,允许设置事件的时间戳容忍度,这在实时处理中非常重要。而Spark Streaming需要手动处理这些复杂性。 4. **性能优化**: Structured Streaming底层进行了优化,比如内存管理和数据倾斜处理,通常能提供更好的吞吐量和更低的延迟。 5. **可扩展性**: 新的Streaming API在资源管理和任务调度上也有所改进,支持动态调整资源以适应不断变化的流量需求。 因此,尽管两者都能处理实时流数据,但Structured Streaming提供了更为现代和强大的功能,更适合现代大数据应用的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值