首页 > 解决方案 > KeyBy 不会为不同的键创建不同的键控流

问题描述

我正在读取一个简单的 JSON 字符串作为输入,并基于两个字段AB. 但是 KeyBy 正在为不同的值生成相同的键控流,但对于和B的特定组合。AB

输入:

{
    "A": "352580084349898",
    "B": "1546559127",
    "C": "A"
}

这是我的 Flink 代码的核心逻辑:

DataStream<GenericDataObject> genericDataObjectDataStream = inputStream
            .map(new MapFunction<String, GenericDataObject>() {
                @Override
                public GenericDataObject map(String s) throws Exception {
                    JSONObject jsonObject = new JSONObject(s);
                    GenericDataObject genericDataObject = new GenericDataObject();
                    genericDataObject.setA(jsonObject.getString("A"));
                    genericDataObject.setB(jsonObject.getString("B"));
                    genericDataObject.setC(jsonObject.getString("C"));
                    return genericDataObject;
                }
            });
DataStream<GenericDataObject> testStream = genericDataObjectDataStream
            .keyBy("A", "B")
            .map(new MapFunction<GenericDataObject, GenericDataObject>() {
                @Override
                public GenericDataObject map(GenericDataObject genericDataObject) throws Exception {
                    return genericDataObject;
                }
            });
testStream.print();

GenericDataObject 是一个具有三个字段的APOJOBC.

这是不同字段值的控制台输出B

5> GenericDataObject{A='352580084349898', B='1546559224', C='A'}
5> GenericDataObject{A='352580084349898', B='1546559127', C='A'}
4> GenericDataObject{A='352580084349898', B='1546559234', C='A'}
3> GenericDataObject{A='352580084349898', B='1546559254', C='A'}

注意第 1 行和第 2 行。即使它们具有不同的 B 值,它们也被放入同一个键控流 (5)。我必须在这里做一些根本错误的事情,有人可以指出我正确的方向吗?

标签: apache-flinkflink-streaming

解决方案


首先,你没有做错任何事。

为什么他们在同一个子任务中?

假设您有数千个键,Apache Flink 不可能为每个键创建数千个线程。因此,必须有另一种机制来确保一组键在一个线程中单独处理。

因此,在 Apache Flink 中,每个子任务都有自己的键组,具有相同键组索引的不同键将在同一个子任务中处理。并且一个子任务通常处理几个具有单独键控状态的键,以保持不同键的状态分开。

keyBy 并不是说​​将不同的key分配给不同的子任务(或分区),而是将所有具有相同key的记录分配给同一个子任务。因此,您只能通过编写 KeySelector 实例来决定不同的键是否在同一组中。

更多详细信息,您可以查看 Apache Flink 官网中的这篇文章。

深入了解 Apache Flink 中的可重缩放状态


推荐阅读