55

大数据 -- Structured Streaming

 4 years ago
source link: https://www.tuicool.com/articles/RBbyu2y
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
  1. 在Structured Streaming发布之后,DataFrame即可以代表静态的 有边界数据 ,也可以代表 无边界数据
  2. 之前对 静态DataFrame 的各种操作同样适用于 流式DataFrame

创建DataFrame

  1. SparkSession.readStream返回的DataStreamReader可以用于创建 流DataFrame
  2. 支持多种类型的数据流作为输入,例如 file、Kafka、socket
socketDataFrame = spark
   .readStream
   .format("socket")
   .option("host", "localhost")
   .option("port", 9999)
   .load()

基本的查询操作

流DataFrame和静态DataFrame一样,不仅支持 类似SQL的查询操作 ,还 支持RDD的转换操作

df = // 该DataFrame代表学生的数据流,schema是 {name:string, age:number, height:number, grade:string}
df.select("name").where("age > 10") // 返回年龄大于10岁的学生名字列表
df.groupBy("grade").count() // 返回每个年级学生的人数
df.sort_values(["age"], ascending=False).head(100) // 返回100个年龄最大的学生

可以通过isStreaming函数来判断一个DataFrame是否代表流数据

df.isStreaming()

基于 事件时间 的时间窗口操作

words = // 该DataFrame代表词语的数据流,schema是 {timestamp:Timestamp, word:String}

// 基于词语的生成时间,创建一个窗口长度为1分钟,滑动间隔为10秒钟的window
// 然后,把输入的词语根据window和词语本身聚合起来,并统计每个window内每个词语的数量
// 最后,根据词语的数量进行排序,只返回前10的词语
windowedCounts = words.groupBy(
   window(words.timestamp, "1 minute", "10 seconds"),
   words.word
).count()
.sort(desc("count"))
.limit(10)

输出结果流

Dataset.writeStream返回的DataStreamWriter支持多种写入位置,例如file、Kafka、console和内存等

query = wordCounts
   .writeStream
   .outputMode("complete")
   .format("csv")
   .option("path", "path/to/destination/dir")
   .start()

query.awaitTermination()

对比Spark Streaming

综合来说, Structured Streaming是比Spark Streaming更好的流处理工具

易用性和性能

  1. Spark Streaming提供的DStream API与RDD API很类似,都是相对 比较底层的API
  2. 编写Spark Streaming程序时,本质上是要去 构造RDD的DAG执行图 ,然后 通过Spark Engine运行
    • 开发者的 任务很重 ,需要想办法去提高程序的处理效率
    • 一个好的数据处理框架,开发者只需要 专注于业务逻辑 ,而不用操心配置、优化等繁琐事项
  3. Structured Streaming提供的 DataFrame API 是一个 相对高级的API
    • 大部分开发者都很熟悉 关系型数据库SQL
    • 这样的数据抽象可以让开发者 用一套统一的方案去处理批处理和流处理 ,而无需关心具体的执行细节
    • DataFrame API是在 Spark SQL 的引擎上执行的,Spark SQL有很多优化,所以Structured Streaming的程序 性能很好

实时性

  1. Spark Streaming是 准实时 的,能做到的最小延迟在 1秒 左右
  2. Structured Streaming采用的也是 微批处理 思想,但能做到更小的时间间隔,最小延迟在 100毫秒 左右
  3. 在Spark 2.3中,Structured Streaming引入了 连续处理 模式,可以做到真正的 毫秒级延迟

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK