【问题标题】:How to scale flink on an un-keyed stream如何在非键控流上缩放 flink
【发布时间】:2021-11-12 00:25:10
【问题描述】:

我有一个相对基本的用例。我的数据存在于 100 个 kafka 分区中,在将事件发送到自定义 HTTP 接收器之前,我需要通过映射运算符传递事件。

出于性能原因,需要将事件分批成 n 条消息的组,理想情况下,这些批次应该在几秒钟后刷新。如果事件计数符合我的最大批量大小,似乎一个很好的解决方案是使用带有清除触发器的翻转处理时间窗口。

问题是我需要将这项工作扩大到每秒处理 100k 个事件。为了获得窗口化批处理,Flink 希望我使用 key by 语句。我尝试使用几个不同的键,但遇到了平衡问题,而且这些键也破坏了操作符链。有没有一种好方法可以在没有键的情况下使用窗口函数,并且仍然让操作符分布在多个任务管理器中?

【问题讨论】:

    标签: apache-flink scale stream-processing


    【解决方案1】:

    由于您已经有一个自定义接收器,一种方法是坚持这个简单的作业图

    kafka -> map -> sink
    

    然后在水槽中进行批处理。接收器可以访问处理时间计时器,并且它们可以具有托管状态,您将希望使用它来存储批次(假设您关心提供一次性保证)。 Integrating Flink into your ecosystem - How to build a Flink connector from scratch 上的 Flink Forward 演讲的后半部分是一个很好的资源。

    否则,您可能希望继续使用 keyBy。为了使键很好地平衡,您可以简单地为每个使用随机数填充的事件添加一个字段,并将其用作键。 (但不要做类似keyBy(random.nextLong()) 的事情,因为关键是确定性的。)

    【讨论】:

    • 感谢您的回复。事实上,这就是我目前正在做的事情,但我需要开始从 http 请求中收集指标。我能想到的最好的方法是将接收器变成一个过程函数,输出响应时间和错误代码流。为了让进程函数支持计时器,我必须使用键控进程函数(仍然在 v1.8 上)。我喜欢您为键添加新字段的想法。我试试看
    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多