apache-flink - ConnectedStreams 中 2 个流之一的饥饿
问题描述
背景
我们有 2 个流,我们称它们为A
和B
。它们分别产生元素a
和b
。
StreamA
以较慢的速度(每分钟一个)生成元素。
StreamB
每 2 周接收一个元素。它使用一个flatMap
函数接收该元素并b
在循环中生成约 200 万个元素:
(爪哇)
for (BElement value : valuesList) {
out.collect(updatedTileMapVersion);
}
这里valueList
包含约 200 万个b
元素
我们使用, 通过某个键连接这些流(A
和B
) ,并在连接的流上执行另一个:connect
flatMap
streamA.connect(streamB).keyBy(AClass::someKey, BClass::someKey).flatMap(processConnectedStreams)
每个b
元素都有一个不同的键,这意味着大约有 200 万个键来自B
流。
问题
我们看到的是饥饿。即使有a
准备处理的元素,它们也不会在processConnectedStreams
.
我们试图解决这个问题
B
我们尝试通过每 10 个元素执行一次,在 1 秒内将流限制为 10Thread.sleep()
个元素:
long totalSent = 0;
for (BElement value : valuesList) {
totalSent++;
out.collect(updatedTileMapVersion);
if (totalSent % 10 == 0) {
Thread.sleep(1000)
}
}
模拟processConnectedStreams
为与另一个需要 1 秒,Thread.sleep()
我们已经尝试过: * 将所有管道的并行度设置为 10 - 不起作用 * 将所有管道的并行度设置为 15 - 确实有效
问题
我们不想使用所有这些资源,因为流B
很少被激活,并且对于A
具有高并行度的流元素来说是一种矫枉过正。是否可以在不将并行度设置为超过b
我们每秒发送的元素数量的情况下解决它?
解决方案
如果您共享完整的工作流拓扑,这将很有用。例如,您没有提到对数据进行任何键控或随机分区。如果确实如此,那么 Flink 将在一个任务中处理多个操作,这可能(取决于拓扑)导致您看到的问题。
如果是这种情况,那么在执行之前强制分区processConnectedStreams
可能会有所帮助,因为该操作将从网络缓冲区中读取。
推荐阅读
- php - 运行Jquery后表单标签消失
- python-3.x - 在 Python 3 中执行 curl 命令
- javascript - 如何根据另一个下拉列表的选择动态地将数组添加到下拉列表中?
- javascript - 如何知道 React 中点击元素的颜色?
- javascript - 为什么 array.map() 函数不改变数组
- android - 尝试使用 Retrofit 在两点之间获取方向时为空体
- http - 在一个 HTTP 请求中发送文件和参数(通过 JSON)
- python - 在 python-pptx 中指定用于 fit_text 的字体时出错
- c++ - 在.cpp文件之间传递结构声明而不使用全局头文件
- c# - 从 Asyn 函数获取数据并等待函数完成