Python数据工程师:为何必懂Kafka和Flink?

65 阅读5分钟

现代数据平台中,Python在数据工程领域占据主导。通过强大集成,Python开发者能无缝使用Java编写的Kafka和Flink进行实时数据处理,为AI智能体提供关键上下文,获取有意义的洞察。

译自:Why Python Data Engineers Should Know Kafka and Flink

作者:Diptiman Raichaudhuri

现代数据平台需要实时上下文来提取有意义的洞察。随着AI智能体的日益普及,这种上下文准确性对于最大程度地减少幻觉并确保可靠结果至关重要。使用 Python(世界上最 受欢迎的语言 之一)的数据工程师,越来越需要使用 Apache KafkaApache Flink 进行流式数据处理。

虽然 Python 在数据工程领域占据主导地位(在 TIOBE 和 PYPL 排名中均位居第一),但 Apache Kafka 和 Apache Flink 都是用 Java 编写的。然而,出色的 Python 集成使这些框架能够无缝地供 Python 开发者使用,让他们无需深入了解 Java 即可利用这些强大的工具。

Python 为何在数据工程领域占据主导地位

Python 在数据工程领域的流行并非偶然;几乎所有主要数据框架都提供了 Python 接口,包括:

  • 流处理: PyFlink、Kafka Python SDK
  • 批处理: PySpark、Apache Airflow、Dagster
  • 数据操作: PyArrow、DuckDB 的 Python SDK
  • 工作流编排: Apache Airflow、Prefect

这个广泛的生态系统使得数据工程师能够在保持 Python 熟悉的语法和模式的同时,构建端到端的数据管道。如果你需要处理 实时数据流——例如用于用户行为分析、异常检测或预测性维护——Python 提供了所需的工具,而无需你切换语言。

Apache Kafka:让流式存储“Pythonic”

Apache Kafka 已成为 数据流平台的实际标准,它提供易于使用的 API、关键的可重放性功能、模式支持和卓越的性能。虽然 Apache Kafka 是用 Java 编写的,但 Python 开发者可以通过 librdkafka 访问它,这是一个高性能的 C 语言实现,提供生产级的可靠性。

confluent-kafka-python 库作为主要接口,提供线程安全的 Producer、Consumer 和 AdminClient 类,兼容 Apache Kafka 0.8 及更高版本的 broker,包括 Confluent Cloud 和 Confluent Platform。安装非常简单:pip install confluent-kafka

生产者实现

向 Kafka 发布消息就是如此简单:

from confluent_kafka import Producer

p = Producer({'bootstrap.servers': 'mybroker1,mybroker2'})

def delivery_report(err, msg):
    """Called once for each message produced to indicate delivery result."""
    if err is not None:
        print('Message delivery failed: {}'.format(err))
    else:
        print('Message delivered to {} [{}]'.format(msg.topic(), msg.partition()))

for data in some_data_source:
    # Trigger delivery report callbacks from previous produce() calls
    p.poll(0)
    
    # Asynchronously produce a message
    p.produce('user_clicks', data.encode('utf-8'), callback=delivery_report)

# Ensure all messages are delivered
p.flush()

消费者实现

消费消息也同样直接:

from confluent_kafka import Consumer

c = Consumer({
    'bootstrap.servers': 'mybroker',
    'group.id': 'mygroup',
    'auto.offset.reset': 'earliest'
})

c.subscribe(['user_clicks'])

while True:
    msg = c.poll(1.0)
    
    if msg is None:
        continue
    if msg.error():
        print("Consumer error: {}".format(msg.error()))
        continue
        
    print('Received message: {}'.format(msg.value().decode('utf-8')))

c.close()

confluent-kafka-python 客户端在提供最大吞吐量性能的同时,与 Java SDK 保持功能对等。由于它由 Confluent(Kafka 的创建者所创立)维护,因此它具有前瞻性并已为生产环境做好准备。

Apache Flink:使用 PyFlink 进行流处理

虽然 Kafka 擅长存储数据流,但处理和丰富这些流需要额外的工具。Apache Flink 作为一种分布式处理引擎,用于对无界和有界数据流进行有状态计算。

PyFlink 提供了一个 Python API,使数据工程师能够构建可扩展的批处理和流处理工作负载,从实时处理管道到大规模探索性分析、机器学习 (ML) 管道,以及提取、转换、加载 (ETL) 过程。熟悉 Pandas 的数据工程师会发现 PyFlink 的 Table API 既直观又强大。

PyFlink API:选择你的复杂程度

PyFlink 提供两种主要的 API:

  1. Table API: 高级、类似 SQL 的操作,非常适合大多数用例。
  2. DataStream API: 用于细粒度转换的低级控制。

一个常见的模式是将聚合和时间窗口操作(翻滚窗口或滑动窗口)应用于 Kafka 主题,然后将结果输出到下游主题。例如,将“user_clicks”主题转换为“top_users”摘要。

实时转换实践

这是一个 PyFlink Table API 作业,它使用窗口聚合处理流数据:

from pyflink.datastream import StreamExecutionEnvironment
from pyflink.table import EnvironmentSettings, StreamTableEnvironment

def main():
    env = StreamExecutionEnvironment.get_execution_environment()
    settings = EnvironmentSettings.in_streaming_mode()
    tenv = StreamTableEnvironment.create(env, settings)

    # Add Kafka connector
    env.add_jars("flink-sql-connector-kafka-4.0.0-2.0.jar")
    
    # Define windowed aggregation
    top_users_sql = """
                    SELECT
                        user_id,
                        COUNT(cURL) as cnt,
                        window_start,
  window_end
                    FROM TABLE(
                        TUMBLE(TABLE user_clicks, DESCRIPTOR(proctime), INTERVAL '30' MINUTE)
                    )
                    GROUP BY
                        window_start,
                        window_end,
                        user_id
                """
    
    result = tenv.sql_query(top_users_sql)
    # Execute and sink results
    tenv.execute_sql(sink_ddl)

这种方法支持复杂的用例,例如:

  • 从点击流数据中进行用户行为分析
  • 在制造过程中进行异常检测
  • 从物联网 (IoT) 遥测数据中发出预测性维护警报

Python 在现代数据流中的优势

PyFlink 和 Python Kafka 客户端的结合 为受过 Python 培训的数据工程师创建了一个强大的工具包。你无需学习 Java,即可为数据平台现代化做出贡献,在利用现有 Python 专业知识的同时,访问企业级的流处理功能。

主要优势包括:

  • 熟悉的语法: 留在 Python 的生态系统中
  • 生产性能: librdkafka 和 Flink 的 Java 引擎提供企业级速度
  • 完整功能访问: Kafka 或 Flink 功能无任何妥协
  • 生态系统集成: 与其他 Python 数据工具无缝连接

入门只需两次 pip 安装:pip install confluent-kafkapip install apache-flink。从那里,你可以构建复杂的实时数据管道,媲美任何 Java 实现。

随着 AI 和实时分析继续推动数据平台的发展,掌握 Kafka 和 Flink 技能的 Python 数据工程师将处于引领这一转型的有利位置。Python 生产力与 Java 性能之间的障碍已有效消失,现在正是扩展你的流数据专业知识的理想时机。