使用 Flink 和 Gelly 无法实现高 CPU 利用率

Posted

技术标签:

【中文标题】使用 Flink 和 Gelly 无法实现高 CPU 利用率【英文标题】:Unable to achieve high CPU utilization with Flink and Gelly 【发布时间】:2018-01-18 09:08:32 【问题描述】:

我一直在试验 Flink 流式传输,使用 Yahoo 流式传输基准:https://github.com/yahoo/streaming-benchmarks 等基准测试,这应该会给系统带来压力,但我从未达到令人满意的 CPU 利用率 - 实际上它主要低至~25% 使用所有可用的系统内核(并行度 = 节点*内核)和每个内核一个 TaskManager 插槽。

最近,我开始使用 Flink 的图形 API Gelly,使用提供的一些示例算法(例如 Pagerank),批处理从数万到数亿个顶点的数据集。

我占用了四个 TaskManager,每个具有 32 个内核,并且按照文档的建议,我设置了 taskmanager.numberOfTaskSlots: 32parallelism.default: 128

即使我增加这些值,平均 CPU 利用率也不会超过 40%。因此,由于我的资源没有得到充分利用,我的绩效很低。

我还想指出一个事实,在某些情况下,我注意到在较低的并行度(和 CPU 利用率)下性能更好。

我错过了什么?

【问题讨论】:

【参考方案1】:

源中具有更多唯一键和更多聚合运算符的数据越多,您的 CPU 水平就越高。例如,我每秒有 250k 条消息到 kafka 中(flink 源每秒读取的次数一样多),几乎有 170K 唯一键,5 分钟滚动窗口和每条消息 15 个聚合。我有一个 3 节点、16 核的 flink 集群,源并行度为 15,聚合并行度为 48,接收器并行度为 3。我的 CPU 使用率在每个节点中始终保持在 85-90% 左右。

您可以只输入更多消息,并复制您的聚合逻辑以对每条消息执行更多操作。尝试从每条消息中获取更多唯一键。

【讨论】:

以上是关于使用 Flink 和 Gelly 无法实现高 CPU 利用率的主要内容,如果未能解决你的问题,请参考以下文章

Flink Gelly - 创建图形时类型不匹配

Flink Gelly 扩展边缘类并在 DataSet 中使用

Flink Gelly 在计算期间更新图

Gelly Library 可以用于 Flink 中类似于 Spark 中的 Graph Frame 的图形查询吗

运行 Apache Flink 作业时链接失败

如何导入 Apache Flink SNAPSHOT 工件?