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包
9894

被折叠的 条评论
为什么被折叠?



