python-流处理中间件Faust

以下是参照官网,自已边做写的一点总结。

一、定义

  Faust是一个流处理库,将kafka流中的思想移植到python中,每天用于去构建高性能的分布式系统和实时数据通道,每天处理十亿数据。

还提供了流处理和事件处理,同类型的工具分享例如:kafka Streams,Apache Spark,Storm,Samza,Flink

它不需要使用一个DSL,仅需要用到Python!这意味着你在做流处理的时候可以使用所有你喜欢的Python库:NumPy, PyTorch, Pandas, NLTK, Django, Flask, SQLAlchemy等

前提:

  由于需要使用新的async/await语法和变量类型注释方法,Faust需要使用Python3.6以上的版本。我这里是python3.6.6

 二、环境安装

官网地址:https://pypi.org/project/faust/

命令:pip install faust

三、简单实例

#encoding:utf-8
#date:2019/11/19 17:06
#@Author:sunny

import faust

app=faust.App('Myapp',broker='kafka://localhost')
#模型描述如何序列化消息:
#{“账户id”:“3fae-…”,金额:3}
class Order(faust.Record):
    accountId:str
    amount:int

@app.agent(value_type=Order)
async def order(orders):
    async for order in orders:
        #处理无限的订单流
        print("{订单的id}:{订单的金额}")
  • 代理decorator定义了一个“流处理器”,它基本上使用来自Kafka主题的内容,并为它接收到的每个事件执行一些操作。
  • 代理是一个异步定义函数,因此也可以异步执行其他操作,例如web请求。
  • 这个系统可以像数据库一样保持状态。表被命名为分布式键/值存储,可以用作常规Python字典。

#表在每台机器上使用一个用C++编写的超高速嵌入式数据库(ROCKSDB)在本地存储。

#表还可以存储可选“窗口化”的聚合计数,以便跟踪“从最后一天开始的单击次数”或“最后一小时的单击次数”。例如。像Kafka流一样,我们支持滚动、跳跃和滑动时间窗口,旧窗口可以过期以阻止数据填充。

  1. 为了提高可靠性,我们使用Kafka主题作为“预写日志”。每当更改密钥时,我们都会发布到更改日志。备用节点使用此更改日志来保留数据的精确副本,并在任何节点出现故障时启用即时恢复。
  2. 对于用户来说,表只是一个字典,但是数据在重新启动和跨节点复制之间保持不变,因此在故障转移时,其他节点可以自动接管
您可以按URL计算页面视图数:
#发送到按URL键划分的‘clicks’主题的数据:
#例如:key="http://example.com""value=1"
click_topic=app.topic('click',key_type=str,value_type=int)
#缺少URL的默认值将为0,其中'default=int`
counts=app.Table('点击计数',default=int)

@app.agent(click_topic)
async def count_click(clicks):
    async for url,count in clicks.items():
        counts[url]+=count
  1. 发送到Kafka主题的数据是分区的,这意味着点击将被URL切分,这样同一URL的每个计数将被传递到同一个Faust worker实例
  2. Faust支持任何类型的流数据:字节、Unicode和序列化结构,还附带了“模型”,这些模型使用现代Python语法来描述流中的键和值是如何序列化的:
#order是一个json序列化字典
#一般拥有这些领域

class Order(faust.Record):
    account_id:str
    product_id:str
    price:float
    quantity:float=1.0

orders_topic=app.topic('orders',key_type=str,value_type=Order)

@app.agent(orders_topic)
async def process_order(orders):
    async for order in orders:
    #使用常规Python处理每个订单
        total_price=orders_topic * order.quantity
        await send_order_received_email(order.account_id,order)

'''

  1. Faust是静态类型的,使用mypy类型检查器,因此您可以在编写应用程序时利用静态类型。
  2. Faust的源代码很小,组织良好,是学习kafka流实现的良好资源。
  3. Faust是…简单的
  4. Faust非常容易使用。要开始使用其他流处理解决方案,您需要复杂的hello world项目和基础设施需求。faust只需要kafka,其余的只是Python,所以如果你知道Python,你就可以使用faust来做流处理,它可以与任何东西集成。

以下是您可以制作的一个更简单的应用程序:

'''

#encoding:utf-8
#date:2019/11/19 18:06
#@Author:sunny

import faust

class Greeting(faust.Record):
    from_name:str
    to_name:str

app=faust.App('hello-app',broker='kafka://localhost')
topic=app.topic('hello-topic',value_type=Greeting)

#处理流 @app.agent(topic) async
def hello(greetings): async for geeting in greetings: print(f'Hello from{greeting.from_name} to {geeting.to_name}')
#像该流发送事件的后台进程 @app.timer(interval
=1.0) async def example_sender(app): await hello.send( value=Greeting(from_name='Faust',to_name='you') ) if __name__ == '__main__': app.main()

'''

你可能有点被async和await关键字吓倒了,但是你不必知道asyncio是如何使用Faust的:只要模仿这些例子,你就可以了。

示例应用程序启动两个任务:一个是处理流,另一个是向该流发送事件的后台线程。在实际的应用程序中,系统将向Kafka主题发布事件,

处理器可以从中使用这些主题,并且只需要后台线程向我们的示例中提供数据。

'''


'''

1.高可用性

Faust的可用性很高,可以在网络问题和服务器崩溃时生存。当节点发生故障时,它可以自动恢复,并且表有备用节点将接管。

2.分布的

根据需要启动应用程序的更多实例。

3.快

一个核心的Faust worker实例已经可以每秒处理数万个事件,我们有理由相信,一旦我们能够支持一个更优化的Kafka客户机,吞吐量就会增加。

4.柔性的

    Faust只是Python,流是一个无限的异步迭代器。如果你知道如何使用Python,你已经知道如何使用Faust了,它可以与你最喜欢的Python库一起工作,比如Django、Flask、SQLAlchemy、NTLK、NumPy、SciPy、TensorFlow等等。
'''
posted @ 2019-11-20 09:48  做一只热爱生活的小透明  阅读(2384)  评论(0)    收藏  举报