Flink 批作业 消费kafka

kafka 数据源可以是有界数据源,也可以是无界数据源

示例代码


    public static void main(String[] args) {
        StreamExecutionEnvironment env
                = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        //设置运行方式为批处理
        env.setRuntimeMode(RuntimeExecutionMode.BATCH);


        //设置消费的开始时间戳和结束的时间戳

        KafkaSource<String> source = KafkaSource.<String>builder()
                .setBootstrapServers("localhost:9092")
                .setTopics("input-topic")
                .setGroupId("my-group")
                .setStartingOffsets(OffsetsInitializer.timestamp(1657038028000L))
                .setBounded(OffsetsInitializer.timestamp(1657120828000l))
                .setValueOnlyDeserializer(new SimpleStringSchema())
                .build();

        env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source").print();


        try {
            env.execute("batch-kafka-test");
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

原理

把时间戳转换成offset
KafkaPartitionSplitReader 类

  private void acquireAndSetStoppingOffsets(
            List<TopicPartition> partitionsStoppingAtLatest,
            Set<TopicPartition> partitionsStoppingAtCommitted) {
            //设置end offset
        Map<TopicPartition, Long> endOffset = consumer.endOffsets(partitionsStoppingAtLatest);
        stoppingOffsets.putAll(endOffset);
        if (!partitionsStoppingAtCommitted.isEmpty()) {
            consumer.committed(partitionsStoppingAtCommitted)
                    .forEach(
                            (tp, offsetAndMetadata) -> {
                                Preconditions.checkNotNull(
                                        offsetAndMetadata,
                                        String.format(
                                                "Partition %s should stop at committed offset. "
                                                        + "But there is no committed offset of this partition for group %s",
                                                tp, groupId));
                                stoppingOffsets.put(tp, offsetAndMetadata.offset());
                            });
        }
    }

总是

如果任务没有结束,则有可能是时间范围内没有数据,没有产生offset end ,这个时候变成了无界的数据源

好的,我可以尝试回答你的问题。 要编写 Flink 程序消费 Kafka,您需要采用以下步骤: 1. 创建一个 Flink 流式处理作业,并配置适当的读取器和数据源。 2. 定义一个 Kafka 消费者,并配置适当的消费者参数。您可以使用 Flink 提供的 KafkaConsumer 类来实现这一步骤。 3. 编写处理逻辑,对消费的数据进行相应的转换和操作。您可以使用 Flink 提供的函数和算子来实现这一步骤。 4. 将处理后的数据发送到下游,可以是另一个 Kafka 主题,也可以是一个数据库或其他外部系统。 以下是一个示例代码,可以作为您编写 Flink 程序消费 Kafka 的起点: ``` import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer010; import org.apache.flink.streaming.util.serialization.SimpleStringSchema; import org.apache.kafka.clients.consumer.KafkaConsumer; import java.util.Properties; public class KafkaConsumerFlink { public static void main(String[] args) throws Exception { // 设置执行环境 final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 定义 Kafka 消费者配置 Properties properties = new Properties(); properties.setProperty("bootstrap.servers", "localhost:9092"); properties.setProperty("group.id", "test-group"); // 创建 Kafka 消费FlinkKafkaConsumer010<String> consumer = new FlinkKafkaConsumer010<>("test-topic", new SimpleStringSchema(), properties); // 将 Kafka 流绑定到 Flink 环境 env.addSource(consumer) .map(String::toUpperCase) // 将字符串转换为大写 .print(); // 打印处理结果 // 执行 Flink 程序 env.execute("Kafka Consumer Flink"); } } ``` 在这个示例中,我们使用 Flink 提供的 KafkaConsumer 类来创建一个消费者,并配置相关参数。随后,我们使用 addSource 方法将 Kafka 流绑定到 Flink 环境,并通过 map 算子将所有收到的字符串转换为大写。最后,我们使用 print 方法将处理结果打印出来。在执行环境中,我们使用 execute 方法启动 Flink 任务。 请注意,此示例代码只是一个示例,您需要根据您的实际需求进行适当的修改。在实际使用中,您还需要考虑如何进行故障处理、如何使用 Flink 的状态管理机制、如何进行量处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wending-Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值