Flink Kafka Producer元素无序

时间:2018-05-28 20:37:22

标签: apache-kafka apache-flink kafka-producer-api

我正在尝试使用FlinkKafkaProducer010生成元素,但是当我打开一个消费者控制台窗口时,元素似乎无法到达。

我使用以下方法创建了主题: kafka-topics.bat --create --topic mytopic --zookeeper localhost:2181 --partitions 1 --rerelication-factor 1

使用以下命令创建使用者: kafka-console-consumer.bat --zookeeper localhost:2181 --topic mytopic

我使用的Kafka Producer代码是:

public static void main(String[] args) throws Exception {
    ParameterTool parameterTool = ParameterTool.fromArgs(args);
    if(parameterTool.getNumberOfParameters() < 2) {
        System.out.println("Missing parameters!");
        System.out.println("Usage: Kafka --topic <topic> --bootstrap.servers <kafka brokers>");
        return;
    }

    StreamExecutionEnvironment env =StreamExecutionEnvironment.getExecutionEnvironment();
    env.getConfig().disableSysoutLogging();
    env.getConfig().setRestartStrategy(RestartStrategies.fixedDelayRestart(4, 10000));

    DataStream<String> messageStream = env.addSource(getSourceFunction());

    FlinkKafkaProducer010<String> producer = new FlinkKafkaProducer010<>(parameterTool.getRequired("topic"), new SimpleStringSchema(), parameterTool.getProperties());
    messageStream.addSink(producer);
    env.execute("Kafka Producer");
}

public static SourceFunction<String> getSourceFunction() {
    return new SourceFunction<String>() {
        private static final long serialVersionUID = 6369260225318862378L;
        public boolean running = true;

        @Override
        public void run(SourceContext<String> ctx) {
            int counter = 0;
            while (this.running && counter < 500) {
                String data = "item " + Integer.toString(counter);
                ctx.collect(data);

                counter++;
            }
        }

        @Override
        public void cancel() {
            running = false;
        }
    };
}

当我查看Kafka日志文件时,我看到一个.log文件,其中的元素也不按顺序排列。元素的排序使得跳跃大约10个值。在我的用例中,必须具有正确的顺序。我一直在寻找如何确保元素按顺序到达,但到目前为止没有任何运气。 有没有我错过的东西修复了订单?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我猜你正在使用并行性&gt; 1为水槽。仅在单个运算符实例上保证元素的顺序。如果您从一个接收器的多个并行实例写入单个kafka分区,那么订单就无法保证。