Apache spark 结构化流与批处理性能差异

Apache spark 结构化流与批处理性能差异,apache-spark,spark-structured-streaming,azure-databricks,Apache Spark,Spark Structured Streaming,Azure Databricks,我们有一项工作,可以在时间窗口内聚合数据。我们是新人, 并且,我们观察到运行时的性能特征存在显著差异 逻辑上与流式处理与批处理作业相同的查询。我们想了解 正在发生什么,并找到可能的方法来提高结构化测试的速度 基于流的方法 在本文中,假设模式为 root |-- objectId: long (nullable = true) |-- eventTime: long (nullable = true) |-- date: date (nullable = true) |-- hour: i

我们有一项工作,可以在时间窗口内聚合数据。我们是新人, 并且,我们观察到运行时的性能特征存在显著差异 逻辑上与流式处理与批处理作业相同的查询。我们想了解 正在发生什么,并找到可能的方法来提高结构化测试的速度 基于流的方法

在本文中,假设模式为

root
 |-- objectId: long (nullable = true)
 |-- eventTime: long (nullable = true)
 |-- date: date (nullable = true)
 |-- hour: integer (nullable = true)
在哪里

  • date
    hour
    是(派生的)分区键,即拼花地板文件存储在 文件夹,如
    date=2020-07-26/hour=4
  • 底层格式类型是delta lake
  • 一小时的数据包含大约2亿个事件
  • objectId
    广泛传播(一小时内观察到1000万个不同的值, (分布极不均匀)
  • 我们试图以5分钟为单位计算每个
    objectId
    的事件数
  • 底层源从kafka队列流式传输到(并且每分钟运行一次)
    • ADL2上每分钟出现两个新文件,每个文件大小为25MB(实际文件大小) 包含10个以上未显示的附加列)
我们正在运行结构化流媒体作业,基本上做:

df.read.format(“增量”)
.withWatermark(“7分钟”)//水印仅应用于流式查询
.groupBy($“日期”,“小时”,“对象ID”,“窗口($“事件时间”,“5分钟”))
.联合(1)//有争议;我们喜欢数量有限的文件
.分区人(“日期”、“小时”)
.writeStream
.格式(“增量”)
.选项(“检查点位置”)
.分区人(“日期”、“小时”)
.start()
.等待终止
关联的批处理作业基本上执行相同的操作,除了
带有水印
和可比较的替代品,用于它从 完全相同的源,因此它将读取完全相同的文件,使用相同的 尺寸等

我们正在运行这些功能:

  • azure数据块
  • azure数据湖第2代
意见:

  • 批处理作业能够在大约一分钟内聚合一个小时,并且正在运行 在最小的可能簇上(3x F4s)
  • 结构化流媒体作业OOM,即使使用(3x DS3_v2),因此我们必须 配置更大的实例(3个L4,每个节点32GB)
    • CPU实际上处于空闲状态(97.4%空闲)
    • 每个微批次需要30-60秒(几乎完全花费在
      addBatch
    • 网络活动低(可能为2MB/s)
  • 一般来说,我觉得流媒体作业无法 数据量增加时暂停(我们计划将流量增加10倍)
我的理解是,在给定水印的情况下,流式查询(7分钟) 窗口大小(5分钟)只需回顾不到15分钟, 直到它可以写出一个5分钟的窗口并放弃所有相关的状态

问题:

  • 为什么基于结构化流的解决方案需要如此多的内存?
    • 假设我们必须为大约1000万个条目保持状态, 我不明白我们怎么会需要那么多
  • 考虑到流媒体作业的处理时间很长,是什么原因导致流媒体作业的处理时间很长 无所事事
  • 我应该看什么样的指标(这里是spark新手)
df.read.format(“增量”)

看起来您正在创建一个静态数据帧,然后将此静态数据帧转换为流式数据帧。聚合应用于静态数据帧,因此窗口可能无法工作。 尝试创建流式数据帧:

  val DF = spark
  .readStream
  .format("delta")...

此处可以找到一些示例

代码示例基于同一代码的非流式版本。正如问题中提到的,我有两个版本,流媒体版本分别基于
readStream
writeStream
。我将用显式流媒体示例更新我的问题。