创建新的Jet自定义分区程序

时间:2018-01-28 12:47:03

标签: java hazelcast hazelcast-jet

我的用例需要从Kafka主题中读取消息,并在发布到Kafka时以自然顺序处理消息。

Kafka制作人负责发布在单个kafka主题分区中排序的每组消息,我需要以相同的顺序处理同一个顶点处理器中的每组消息。

enter image description here

上图代表了基本理念。有一些KafkaSource-Processors在卡夫卡读书。

并且一条边连接到顶点以解码kafka消息,依此类推。

我可以使用kafka消息密钥作为分区密钥,但我认为最终会使用非平衡解码处理器。

鉴于:

  • 如何创建新的分区程序?我找不到任何能激励我的例子。
  • 在新的分区程序中,如何识别发出消息的KS处理器?我想在前一个顶点进程和下一个顶点处理器之间建立一对一的关系,例如,KS#0总是将消息发送到解码#0,KS#1解码为#1,依此类推。 / LI>
  • 我是否需要一个新的分区器,或者是否有一些开箱即用的功能来实现这一目标?

1 个答案:

答案 0 :(得分:2)

您不需要为此使用分区程序。 Edge.isolated()相等的本地并行一起设计用于:

dag.edge(between(kafkaSource, decode).isolated());

在这种情况下,源处理器的一个实例仅与目标处理器的一个实例绑定,并且将保留项目的顺序。请记住,单个Kafka源处理器可以从多个Kafka分区中获取项目,因此您必须跟踪Kafka分区ID。即使您使Jet处理器和Kafka分区的总数相等,也不能依赖它,因为如果其中一个成员发生故障并且作业重新启动,则Jet处理器的总数将减少,但Kafka分区的数量将赢得“T

另请注意,默认本地并行性对于源不相同:对于Kafka源,它默认为2,对于其他源,它通常等于CPU计数。您需要手动指定相等的值。

另一个限制是,如果对Processors.mapP顶点使用decode,则映射函数必须是无状态的。因为你需要订购的物品,我认为你有一些状态要保留。要使其正常工作,您必须使用自定义处理器:

Vertex decode = dag.newVertex("decode", MyDecodeP::new);

处理器实施:

private static class MyDecodeP extends AbstractProcessor {
    private Object myStateObject;

    @Override
    protected boolean tryProcess(int ordinal, @Nonnull Object item) {
        Object mappedItem = ...;
        return tryEmit(mappedItem);
    }
}

答案是为Jet 0.5.1写的。