pyflink 处理 kafka数据
pyflink 处理 kafka数据
Flink #python #pyflink
这篇记录 pyflink 处理kafka中数据,主要处理操作有
- 向 kafka 主题 test 写入测试数据
- 订阅 kafka 主题 test 数据, 进行简单的数据转换,转为 json,写入 kafka 主题 test1
- 校验数据
写入测试数据
kafka-console-producer.sh --broker-list localhost:9092 --topic test
> a
> b
> c
> d
处理流程
初始化运行环境
# 初始化
env = StreamExecutionEnvironment.get_execution_environment()
env.set_parallelism(2)
# 加载 flink 读取 kafka 的 jar 包
env.add_jars("file:////jars/flink-sql-connector-kafka-1.16.0.jar")
定义 kafka source
# 源 kafka配置
kafka_servers = "node:9092"
source_topic = "test"
consume_group_id = "test_group"
sink_topic = "test1"
# 使用 SimpleStringSchema 反序列模式,因为测试数据源为非结构化数据
source = KafkaSource.builder().set_bootstrap_servers(kafka_servers) \
.set_topics(source_topic) \
.set_group_id(consume_group_id) \
.set_value_only_deserializer(SimpleStringSchema()) \
.set_starting_offsets(KafkaOffsetsInitializer.earliest()) \
.set_property("partition.discovery.interval.ms", "10000") \
.build()
# 这里不使用水印了,来一条处理一条无需上下关联
data_source = env.from_source(source=source,
watermark_strategy=WatermarkStrategy.no_watermarks(),
source_name="kafka source")
定义转换函数,将普通非结构化数据转换为 json
def standard_log(line):
"""
标准化字符串
:param line:
:return:
"""
data = []
try:
if line:
data = [json.dumps({"key": line.upper()}], ensure_ascii=False)]
except Exception as ex:
data = [json.dumps({"key": 1}, ensure_ascii=False)]
finally:
yield from data
ds_standard = data_source.flat_map(standard_log, Types.STRING())
# 标准化日志测试打印
ds_standard.print()
定义 sink
# 订阅写入
sink = KafkaSink.builder() \
.set_bootstrap_servers(kafka_servers) \
.set_record_serializer(
KafkaRecordSerializationSchema.builder()
.set_topic(sink_topic)
.set_value_serialization_schema(SimpleStringSchema())
.build()
) \
.set_delivery_guarantee(DeliveryGuarantee.AT_LEAST_ONCE) \
.build()
ds_standard.sink_to(sink)
# 执行
env.execute()
注意事项
- flat_map() 之所以要返回格式 Types.STRING(), 是因为如果不进行转换flink写入 kafka会提示解码异常,这一步是把python 的 str 转为 java 的 STRING
- standard_log 的返回只要是个迭代器即可
校验数据
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test1 --from-beginning
参考内容
Flink 官方文档 DataStream Connector Kafka
Flink 官方文档 DataStream API Tutorial