Spark Streaming 是基于SparkCore
StructStreaming 是一个基于SparkSql 引擎 的可扩展,容错的流处理引擎
StructStreamimg 是一个基于 表 的可扩展,容错的流式处理引擎
StructStraming 意义:
使用sql计算实时数据,使用简单易学的技术实现实时计算,降低了学习实时处理的学习难度
SparkSql: 作用是计算离线数据,接收sql转换成算子,意义:降低了学习难度
Spark Streaming:作用是计算实时数据,意义:能够近实时计算最最新的数据(实时计算)
SparkSql和SparkStream可以进行整合
sparksql内部数据抽象(DF或者是DS)
DF=rdd+结构(属性) -->表
DS=rdd+结构(属性)+类型 =DF+类型 -->表
StructStreaming 的优点
1 不需要考虑是流式还是批量 ,只要用同样的方式编写计算就可以,提供了快速,可扩展,容错,端到端的一次性流处理
2 简洁的模型
可以直接把一个流 想象成一个无限增站的表格
3一致的API
和SparkSql公用大部分API,同时批处理和流处理程序共用代码
4卓越的性能
速度快 ,离线和实时
5 多语言的支持
java R scala
StructStreaming 编程模型
StructStreaming 实质是:一个次序增长动态表格,新增的数据源源不会写入表格的尾部
触发器
定期周期执行
一个里输出的模式有哪几种:查询后的完整结果, 查询相比的差异 ,追加最新的结果
wordcount案例图示
StructStreaming 案例
wordcount四种方式
1使用StructStreaming 读取Socket 端口数据
import org.apache.spark.SparkContext
import org.apache.spark.sql.streaming.Trigger
import org.apache.spark.sql.{
DataFrame, Dataset, Row, SparkSession}
object SparkStruct01_socket {
def main(args: Array[String]): Unit = {
//创建sparksession
val spark: SparkSession = SparkSession.builder().appName("readsocket").master("local[*]")
.getOrCreate()
// 创建驱动
val sc: SparkContext = spark.sparkContext
// 设置日志级别
sc.setLogLevel("WARN")
// 读取数据
val sockeDataRow: DataFrame = spark.readStream.option("host", "node01").option("port", "9999")
.format("socket").load()
// 导入隐式转换
import spark.implicits._
// 读取到的每行数据
val socketDataString: Dataset[String] = sockeDataRow.as[String]
// 对每行数据进行一个处理
val word: Dataset[String] = socketDataString.flatMap(a => a.split(" "))
// 对读取的数据进行计算(写sql语句)
val StrucWordCount: Dataset[Row] = word.groupBy("value").count().sort($"count")
// 对计算完的数据进行输出