google-cloud-dataflow - 数据流/apache 光束管道中的热键,打开随机播放模式是唯一的解决方案
问题描述
管道用例: 此管道从 30 个 GCS 目录读取 json 文件,每天都表示为一个目录,因此读取过去 30 天的数据(140 亿行)。对该数据进行一些处理并作为 json 文件输出到 GCS。
热键问题: 引入热键问题是因为我们的业务逻辑相对于过去 29 天的数据需要对最近几天的数据(约 4 亿行)进行更多处理。因此,如果管道今天运行,它将读取过去一个月的数据,返回昨天 30 天的数据需要最少的处理。而今天的数据需要大约 100 倍以上的处理。由于我们一步处理了过去一个月的所有数据,包括今天的数据,因此在处理今天的数据时会生成一个热键
在管道最初启动时,我注意到在管道处理了过去 29 天的数据并开始处理今天的数据吞吐量之后,吞吐量非常高(每秒百万行),而今天的数据吞吐量急剧下降(每秒数百行)。由于数据流为每个输入(30 个目录)分配工作节点,因此需要最多处理的输入会停止,因为它没有并行化到所有工作节点。而大多数工作节点用于处理 29 天的数据。
尝试的解决方案:
- 分组和散列以创建混洗以混合高处理行和低处理 (2018-05-02_02_24_23-2746349996700640181)
GroupBy
步骤执行速度非常慢,以至于性能比热键问题最差。 - 添加
Reshuffle.createRandomKey
步骤以创建混洗以将高处理行与低处理混合(2018-05-03_04_50_16-6027709731981798472)此中的重新洗牌步骤执行速度非常慢,以至于性能比热键问题最差
这里的一个常见建议是启用随机播放模式。我们过去曾尝试过这样做。虽然 shuffle 模式确实提高了GroupByKey
step 的性能,但它在将输出写入 GCS 时显着降低了性能。
解决方案
推荐阅读
- hazelcast - Hazelcast Jet 中的 MapConfig
- c# - 无法在 C# 中加载 XML
- python - MissForest 不适用于分类变量
- mysql - MySQL SELECT 在没有 LIMIT 的情况下失败
- google-cloud-platform - 如何禁用 Firebase 功能版本控制
- html - 如何为我的第一个表单获取正确的格式?
- visual-studio-2017 - 如何使 Visual Studios 在我键入新行时始终使用 Unix 行尾但不与其他行尾混淆?
- javascript - Reactjs:未捕获的类型错误:回调不是函数
- spring-boot - Spring JPA H2 数据库获取 org.h2.jdbc.JdbcSQLSyntaxErrorException 架构“MYSCHEMA”未找到
- java - 当我尝试更新用户并且无法使用 SpringBoot 显示我的用户角色时出现错误