pyflink 处理 kafka数据

pyflink 处理 kafka数据

Flink #python #pyflink

这篇记录 pyflink 处理kafka中数据,主要处理操作有

  1. 向 kafka 主题 test 写入测试数据
  2. 订阅 kafka 主题 test 数据, 进行简单的数据转换,转为 json,写入 kafka 主题 test1
  3. 校验数据

写入测试数据

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

posted @ 2023-03-20 10:17  faronzz  阅读(1532)  评论(0编辑  收藏  举报