掌握 Python 中的数据流

        欢迎来到雲闪世界。在本文中,我将解决数据工程师在设计流数据管道时可能遇到的关键挑战。我们将探讨用例场景,提供 Python 代码示例,讨论使用流框架的窗口计算,并分享与这些主题相关的最佳实践。

在许多应用中,访问实时且不断更新的数据至关重要。欺诈检测、客户流失预防和推荐是流式传输的最佳选择。这些数据管道实时处理来自各种来源的数据到多个目标目的地,在事件发生时捕获它们并实现其转换、丰富和分析。数据管道是一系列数据处理步骤,其中每个阶段的输出成为下一个阶段的输入,从而创建逻辑数据流。

只要在两点之间处理数据,就存在数据管道,例如从源到目标

数据管道的三个关键组成部分是源、处理步骤和目标。例如,从外部 API(源)提取的数据可以加载到数据仓库(目标)中,这说明了源和目标不同的常见情况。

在流式传输中,源通常是发布者服务,而目的地是处理数据的消费者(例如应用程序或其他端点)。这些数据通常使用窗口计算进行转换。一个很好的例子是会话窗口,由最后一个事件之后的非活动期定义(Google Analytics 4 等)。

添加图片注释,不超过 140 字(可选)

实际应用示例

考虑下面用 Python、Kafka 和 Faust 构建的简单流数据处理应用程序示例。高级应用程序逻辑如下:

  1. API 服务app/app_main.py允许将有效的用户参与事件发布到 Kafkaproducer主题。这些事件可以从网站、移动应用程序收集,也可以由其他服务(例如某种数据发布者)发送。

{
    "event_type": "page_view",
    "user_id": "e659e3e7-22e1-4a6b",
    "action": "alternative_handset",
    "timestamp": "2024-06-27T15:43:43.315342",
    "metadata": {
        "session_id": "4b481fd1-9973-4498-89fb",
        "page": "/search",
        "item_id": "05efee91",
        "user_agent": "Opera/8.81.(X11; Linux x86_64; hi-IN) Presto/2.9.181 Version/12.00"
    }
}

事件验证可以由pydantic具有有效类型和操作的事件执行,并接受这些事件等。[2]

我们的应用程序不断使用来自consumer主题的已处理事件并将其发送到WebSocket,以便可以看到实时处理。

import os
import json
import logging
import asyncio
import uvicorn
from contextlib import asynccontextmanager
from fastapi import FastAPI, WebSocket, HTTPException
from fastapi.staticfiles import StaticFiles
from aiokafka import AIOKafkaConsumer, AIOKafkaProducer
from app.models import Event

from .http import events, users
from dotenv import load_dotenv
load_dotenv()

logging.basicConfig(level=logging.INFO)

# kafka_brokers = os.getenv("REDPANDA_BROKERS")
kafka_brokers = (
    "redpanda-0:9092"
    if os.getenv("RUNTIME_ENVIRONMENT") == "DOCKER"
    else "localhost:19092"
)
consumer_topic = os.getenv("CONSUMER_TOPIC")
producer_topic = os.getenv("PRODUCER_TOPIC")
error_topic = os.getenv("ERROR_TOPIC")


def kafka_json_deserializer(serialized):
    return json.loads(serialized)


@asynccontextmanager
async def startup(app):
    app.producer = AIOKafkaProducer(
        bootstrap_servers=[kafka_brokers],)
    await app.producer.start()

    app.consumer = AIOKafkaConsumer(
        consumer_topic,
        # "agg-events",
        # group_id="de
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值