Samza是LinkedIn开源的一款流处理器,本文介绍了Samza在LinkedIn公司的应用情况,Samza在流处理方面的优势、新特性以及下一步的规划。
LinkedIn使用Samza提升实时用户体验
- 中央流量控制:在LinkedIn,发送给用户的所有邮件都会经由中央Email分发Samza任务处理,该任务会根据特定的策略和窗口标准将同一用户的所有邮件进行聚合,最终向用户发送一个汇总的Email,而不是将每个应用程序的Email单独发送给用户。
- 广告关联:使用Samza计算广告点击率(CTR),通过Samza连接广告点击事件流和广告展现事件流,并聚合一些其他维度的数据来计算点击率。
- 新闻递送:使用Samza连接包含“用户查看事件”的事件流和包含所有“新闻条目”的事件流从而判断为每个用户推送新闻的推送质量。该系统每天会处理数十亿事件。
- 标准化和关联管道:基于Samza构建标准化平台,当用户在LinkedIn网站上修改职称、公司名称、地理位置等信息时,该管道能使用机器学习模型和关联规则快速解析所有同义词,将名称不同但含义相同的词语关联到一起。
- 监控A/B测试期间网站的速度:实时监控A/B测试期间的各项指标,观察测试时间窗口内各指标对网站速度的影响,并对发现的异常进行警报。
- 作为转换管道:使用Samza进行模式转换和聚合,生成事件并发送到Kafka实时事件输入流,实现与已有的Graph引擎和Pinot分析数据库等系统的集成。
- 调用图:用户访问LinkedIn的过程中会产生很多服务调用事件,这些数据会被发送到Kafka,之后Samza会基于唯一的“TreeID”聚合这些数据并生成网站健康报告。
- 安全:通过Samza分析事件流,实时发现安全隐患、生成警报并执行防护措施。
Samza的主要优势
-
模型非常适合构建高性能有状态的应用程序
大部分有状态的事件处理应用要么需要从远程数据库中读取数据,要么需要在应用内部维护状态,但是这些方式会有I/O或者CPU瓶颈。而Samza对本地集成数据库有良好的支持,可以在事件处理器中集成RocksDB,从而将数据存储在本地,所有的数据获取操作都在本地完成,十分高效。 -
将应用程序逻辑与底层的消息传输解耦
Samza支持可插拔的消息源(消费者)和蓄水池(生产者),用户可以根据自己的需要将Kafka、ZeroMQ等事件源直接与Samza结合到一起使用,不需要预先将来自于不同事件源的数据汇聚到统一的消息系统进行标准化处理。
Samza的新特性
- 宿主亲和(Affinity)和状态重用
启动任务时,Samza会将主机和容器之间的映射关系存储到“协调流”中;关闭任务时,Samza会将该任务的所有状态保存到RocksDB和偏移文件中;再次启动任务时,YARN会按照映射关系将容器分配到它之前运行的那一台机器上,并恢复之前的状态数据继续运行。 - 广播流
不需要重启Samza就能通过修改“配置参数”动态改变整个应用程序的行为。 - 协调流
之前任务配置是以环境变量的形式通过命令行传递的,这种方式变量的个数有限制。新版本增加了一个名为“协调流”的集中持久流,用户可以将配置和相关系统信息存储到该流中,然后通过它来修改任务的动态配置。 - RocksDB TTL
可以让Samza状态存储中的老旧数据自动过期。 - 为HDFS和ElasticSearch提供了新的系统生产者
集成HDFS生产者和ElasticSearch生产者 ,能够将应用程序的输出直接写入到HDFS和ElasticSerarch。 - Samza框架无缝升级
不再需要将Samza和应用程序一起打包,只需要将Samza二进制包预装到集群,应用程序会自动加载预装到集群中的Samza。 - 启动和停止能力
提供了一个可以启动或者停止单个Samza任务的REST API。 - 通过在Samza任务中为容器指定一组静态的分区分配,摆脱了对YARN的依赖。
不需要任何YARN依赖就能让Samza应用程序运行在AWS EC2等实例上。
下一步计划 - Samza即类库
解耦协调逻辑和YARN托管逻辑,使Samza能够支持Mesos、Kubernetes等其他的集群管理系统,以及AWS EC2、Microsoft Azure Compute、Google Compute等无集群管理器的云计算平台。虽然静态分区分配特性已经实现了部分功能,但是安装配置依然非常复杂,未来将进一步优化。 - 进程支持并行执行
在Samza中,每个应用程序运行在独立的容器(进程)中,每个容器单线程执行,这种方式内存利用率低。为了让IO操作并行执行,需要分配大量容器,且容器间的数据无法共享,为了解决这一问题,Samza将增加并行执行特性。 - 支持DAG (有向无环图)
简化DAG的表达方式,简化多阶段事件处理管道的配置和创建,使之易于部署、监控和升级。 - 支持Window和Join操作符
支持Window和Join操作符,让Samza应用程序在事件延迟到达的情况下也能产生精确的结果。
时间:2016-10-31 21:33
来源:InfoQ
作者:孙镜涛
原文链接