Python 实时流处理框架 Faust 超详细从0到1(附完整代码和问题记录)

Faust官网
一、faust 简介  

    近期工作中有遇到实时数据计算处理的场景,一开始用的kafka-python,但是无法处理分布式的场景。无意中了解到一个适合python开发者使用的实时数据流处理框架faust,它专为分布式实时数据处理设计,依赖kafka,可以使用rocksdb作为本地持久化存储。


二、离线环境安装方法
  • 找一台可以联网的环境,进行faust的安装:

    pip install faust
  • 然后生成requirements.txt:通过命令生成python包清单requirements.txt文件

    pip freeze > D:\file\program\py_package\requirements.txt
  •  打包下载python包到指定文件夹:

     pip download -r D:\file\program\py_package\requirements.txt -d D:\file\program\py_package
  • 相关文件上传内网机器的某个文件夹,再通过本地本间目录安装:

    pip install --no-index --find-links=E:\mypackage -r requirements.txt
三、实践案例:使用Faust消费kafka
# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.

import faust
import logging

logging.basicConfig(level=logging.DEBUG)

app = faust.App(
    'my_faust_app',
    broker=['kafka://your_broker_address:9092'],
    broker_credentials=faust.GSSAPICredentials(
        #security_protocol='SASL_PLAINTEXT',
        #sasl_mechanism='GSSAPI',
        kerberos_service_name='kafka', #your kafka_service_name
        #kerberos_domain_name='your_broker_domain_name',
        #producer={"retries":5,"retry_backoff_ms":1000},
        #kerberos_keytab='your.keytab',
        #kerberos_principal='your@KAFKA.COM'
    )
)


# 定义 Kafka 主题
my_topic = app.topic('order_topic', value_serializer='raw',config={'auto.offset.reset':'earliest'})

# 定义异步消费逻辑
@app.agent(my_topic)
async def process(stream):
    try:
        async for value in stream:
            print(f"Received message: {value}")
    except Exception as e:
        print(f"failed:{e}")
"""
@app.timer(interval=1.0)
async def send_message(app):
    try:
        await my_topic.send(value="nihaohahahhhhhhhhhhh")
        print(f"send message: nihaohahahhhhhhhhhhh")
    except Exception as e:
        print(f"send failed:{e}")

"""

if __name__ == '__main__':
    app.main()



# See PyCharm help at https://www.jetbrains.com/help/pycharm/

    注释代码段为异步定时器处理逻辑,上述示例为每隔一秒发送消息至Kafka


四、运行程序:在命令行输入以下命令
faust -A my_project worker -l info
  • my_project是对应的程序入口.py文件,如果入口文件是main.py,那就替换为main.
  • -l info代表的是日志级别是info。
五、kerberos认证踩坑记录与解决方案

问题记录:运行过程中,faust首先会依据填写的broker地址去访问kafka集群,获取集群元数据,获取回来的一般是host地址,然后faust会进行组认证,也就是每一个host都去连接访问,会直接将host作为kerberos_domain_name传入,导致kerberos认证失败

解决方案:需要修改aiokafka包下面的conn.py文件,找到sasl_principal(self)函数,修改

domain=selft._sasl_kerberos_domain_name or self.host

domain=selft._sasl_kerberos_domain_name or socket.getfqdn(self.host)

这样传入kerberos认证的就是domain_name 实例名不是IP地址。(一般实例名是主机服务名)

注意需要import socket包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值