我们以 kafka 为例,看一下 Kafka-client 对版本的依赖情况,从图中可以看出 beam 2.6.0 版本的 api 改变基本是稳定的。当然,现在用的比较多的2.4、2.5版本。吐个槽,2.6版本之前的兼容性问题,上个版本还有这个类或方法,下一个版本就没有了,兼容性不是很好。
4. SDK beam-sdks-java-io-kafka 读取源码剖析
① 指定 KafkaIO 的模型,从源码中不难看出这个地方的 KafkaIO<K,V> 类型是 Long 和 String 类型,也可以换成其他类型。
pipeline.apply(KafkaIO.<Long, String>read() pipeline.apply(KafkaIO.<Long, String>read()
② 设置 Kafka 集群的集群地址。
.withBootstrapServers(“broker_1:9092,broker_2:9092”)
③ 设置 Kafka 的主题类型,源码中使用了单个主题类型,如果是多个主题类型则用 withTopics(List) 方法进行设置。设置情况基本跟 Kafka 原生是一样的。
.withTopic(“my_topic”) // use withTopics(List) to read from multiple topics.
④ 设置序列化类型。Apache Beam KafkaIO 在序列化的时候做了很大的简化,例如原生 Kafka 可能要通过 Properties 类去设置 ,还要加上很长一段 jar 包的名字。
Beam KafkaIO 的写法:
.withKeyDeserializer(LongDeserializer.class)
.withValueDeserializer(StringDeserializer.class)
原生 Kafka 的设置:
Properties props = new Properties();
props.put(“key.deserializer”,“org.apache.kafka.common.serialization.ByteArrayDeserializer”);
props.put(“value.deserializer”,“org.apache.kafka.common.serialization.ByteArrayDeserializer”);
⑤ 设置 Kafka 的消费者属性,这个地方还可以设置其他的属性。源码中是针对消费分组进行设置。
.updateConsumerProperties(ImmutableMap.of(“group.id”, my_beam_app_1"))
⑥ 设置 Kafka 吞吐量的时间戳,可以是默认的,也可以自定义。
.withLogAppendTime()
⑦ 相当于 Kafka 中 “isolation.level” , “read_committed”,指定 KafkaConsumer 只应读取非事务性消息,或从其输入主题中提交事务性消息。流处理应用程序通常在多个读取处理写入阶段处理其数据,每个阶段使用前一阶段的输出作为其输入。通过指定 read_committed 模式,我们可以在所有阶段完成一次处理。针对 “Exactly-once” 语义,支持 Kafka 0.11 版