当前位置: 首页 > 知识库问答 >
问题:

我可以使用带有group BY的自定义分区器吗?

赵英资
2023-03-14
KeyedDataStream afterCustomPartition = keyedStream.partitionCustom(new MyPartitioner(), MyPartitionKeySelector())

DataStreamUtils.reinterpretAsKeyedStream(afterCustomPartition, new MyGroupByKeySelector<>()).sum()
    null
  • 数据集:[(0,A),(0,B),(0,C),(1,D),(2,E)]
  • 并行运算符实例数:2
  • GROUP by FUNCTION:返回对的第一个元素
  • 分区函数:键0返回0,键1和2返回1。优点:处理可能将密钥0和1发送到同一个操作员实例的数据偏斜,这意味着一个操作员实例将接收80%的数据集。

共有1个答案

姚星河
2023-03-14

不幸的是,这是不可能的。DataStreamutils.ReinterpretaskeyedStream()要求数据的分区与调用KeyBy()时一样。

造成这种限制的原因是密钥组以及密钥如何映射到密钥组。密钥组是Flink的密钥状态分配单位。键组的数量决定运算符的最大并行度,并使用setMaxParallelism()进行配置。密钥通过内部哈希函数分配给密钥组。通过更改密钥的分区,同一密钥组的密钥将分布在多台机器上,这将不起作用。

为了调整密钥到机器的分配,您需要更改密钥到密钥组的分配。但是,没有一个公共的或可访问的接口来做到这一点。因此,在Flink1.6中不支持自定义密钥分发。

 类似资料:
  • 我正在测试一个Spring Boot应用程序,并尝试使用Testcontainers在Docker容器中启动一个临时数据库,用于JUnit 5测试。有两种方法可以告诉Testcontainers启动并连接到测试数据库容器: > 通过在测试类中定义容器,添加至少几个注释,并且(在Spring Boot测试中)用几行代码覆盖应用程序上下文,将其指向新数据库。对于每个测试类来说,这是相当多的代码行。 通

  • 我正在实现一个自定义消费者的主题/分区分配在Kafka。为此,我将重写抽象类,该类又实现接口。 作为自定义赋值器的一部分,我希望发送一个关于消费者订阅的每个主题的每个分区的单个(浮动)信息。 我知道可以通过重写接口的默认方法向赋值器发送自定义数据。 但是,问题是,从上面的方法签名中,我无法获得为使用者注册的每个主题分配给带下划线使用者的分区列表。 谢谢你。

  • 我有自己的分区技术为数据流元组生成键,这些键的范围等于集群中的节点数,如果我将并行度设置为4,则生成的键将是0、1、2和3,以此类推,然后每个键都应该被分区到同一个节点,以便使用键状态进行更多的键化处理。 发生了什么:我使用keyBy实现了我的逻辑,所以我可以使用键控状态,但是它有很大的偏斜性,有些节点没有接收到记录,而其他节点接收到的记录不止一个。我尝试过使用自定义分区,它按照我想要的方式进行物

  • 我正试图用在中添加自定义分隔符,但没有成功,我已经搜索了很多,并查看了下面提到的答案,但这对我没有帮助 链接1 链接2 链接3 我想在的每个项之间加上黑线,如下所示。 我在每行之间都有水平线,但不知道如何在列之间得到这些线。 chintan Soni的答案工作很好,但它只在一个场景中产生问题,当我有5个视图时,它还显示了其他3个项目的分界线,如下所示:

  • 我尝试用自定义控制器制作一个自定义组件。自定义组件已经显示在应用程序上,但我未能向其添加属性。 项目结构: null 布尔马尔科 完全错误: 原因:java.lang.nullPointerException:无法调用“javafx.scene.image.imageeview.setimage(javafx.scene.image.image)”,因为“controller.topbarbtn.

  • 我试图处理的用例如下: 我们有一个来自Kafka的数据流 所以举个例子: 让我们假设所有消息都是表示编码数据的字节数组 编码数据中具有特定值的所有消息都应由一个操作员处理 这样,当我们接收到与相同值对应的特定消息时,这些消息可以作为状态存储在操作符上(在分区器之后),并可用于丰富后续消息 问题: 自定义分区程序会对此有所帮助吗 如果不是,那么什么是一个好的解决方案 有人可以在Flink中为数据流共