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亿个事件
广泛传播(一小时内观察到1000万个不同的值, (分布极不均匀)objectId
- 我们试图以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倍)
- 为什么基于结构化流的解决方案需要如此多的内存?
- 假设我们必须为大约1000万个条目保持状态, 我不明白我们怎么会需要那么多
- 考虑到流媒体作业的处理时间很长,是什么原因导致流媒体作业的处理时间很长 无所事事
- 我应该看什么样的指标(这里是spark新手)
val DF = spark
.readStream
.format("delta")...
此处可以找到一些示例代码示例基于同一代码的非流式版本。正如问题中提到的,我有两个版本,流媒体版本分别基于
readStream
和writeStream
。我将用显式流媒体示例更新我的问题。