【发布时间】:2020-08-31 09:27:18
【问题描述】:
我在 Flink 中构建了一个工作流,它由一个自定义源、一系列地图/平面图和一个接收器组成。
我的自定义源的 run() 方法遍历存储在文件夹中的文件,并通过上下文的 collect() 方法收集每个文件的名称和内容(我有一个自定义对象来存储这个两个字段中的信息)。
然后我有一系列地图/平面图来转换这些对象,然后使用自定义接收器将这些对象打印到文件中。在 Flink 的 Web UI 中生成的执行图如下:
我有一个集群或 2 个工作人员设置为每个有 6 个插槽(它们也都有 6 个内核)。我将并行度设置为 12。从执行图中我看到源的并行度为 1,而工作流的其余部分的并行度为 12。
当我运行工作流程时(我在专用文件夹中有大约 15K 文件),我使用 htop 监控我的工作人员的资源。在大多数情况下,所有内核的利用率都达到 100%,但大约每 30 分钟左右,8-10 个内核就会空闲大约 2-3 分钟。
我的问题如下:
-
我了解源运行时具有并行度 1,我认为从本地存储读取时这是正常的(我的文件位于每个工作人员的同一目录中,因为我不知道将选择哪个工作人员来执行源)。真的正常吗?你能解释一下为什么会这样吗?
-
我的工作流程的其余部分以并行度 12 执行,这看起来是正确的,因为通过检查任务管理器的日志,我从所有插槽(例如,
.... [Flat Map -> Map -> Map -> Sink: Unnamed (**3/12**)] INFO ....、.... [Flat Map -> Map -> Map -> Sink: Unnamed (**5/12**)] INFO ....等)中获得了打印结果。我不明白的是,如果一个插槽正在执行源角色并且我的集群中有 12 个插槽,那么 12 个插槽如何执行其余的工作流?一个插槽是否同时代表工作流其余部分的源和一个实例?如果是,如何分配此特定插槽的资源?有人可以解释此工作流程中的步骤吗?例如(这可能是错误的):
- 插槽 1 读取文件并将它们转发到可用插槽(2 到 12)
- 插槽 1 将一个文件转发给它自己并停止读取,直到它完成它的工作
- 完成后,插槽 1 读取更多文件并将它们转发到可用的插槽
我认为我上面描述的内容是错误的,但我将其作为示例来更好地解释我的问题
- 为什么我的大多数内核每 30 分钟(或多或少)就会出现这种空闲状态,持续大约 3 分钟?
【问题讨论】:
标签: parallel-processing apache-flink