使用 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: 32
和 parallelism.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 扩展边缘类并在 DataSet 中使用