我正在尝试使用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个值。在我的用例中,必须具有正确的顺序。我一直在寻找如何确保元素按顺序到达,但到目前为止没有任何运气。 有没有我错过的东西修复了订单?
提前感谢您的帮助!
答案 0 :(得分:1)
我猜你正在使用并行性&gt; 1为水槽。仅在单个运算符实例上保证元素的顺序。如果您从一个接收器的多个并行实例写入单个kafka分区,那么订单就无法保证。