速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

使用 Akka、Kafka 和 ElasticSearch 等构建分析引擎

  • 2016-08-14
  • 本文字数:2414 字

    阅读完需:约 8 分钟

本文翻译自 Building Analytics Engine Using Akka, Kafka & ElasticSearch ,已获得原作者 Satendra Kumar 和网站授权。

在这篇文章里,我将和大家分享一下我用 Scala、Akka、Play、Kafka 和 ElasticSearch 等构建大型分布式、容错、可扩展的分析引擎的经验。

我的分析引擎主要是用于文本分析的。输入有结构化的、非结构化的和半结构化的数据,我们会用分析引擎对数据进行大量处理。如下图所示为第一代架构,分析引擎可以用 REST 客户端或 Web 客户端(引擎内置)访问。

(点击放大图像)

简单描述一下用到的技术:

  • Play 框架做 REST 服务器和 WEB 应用。Play 是个基于轻量级、无状态和 WEB 友好的 MVC 框架。
  • Akka 集群作处理引擎。Akka 是个工具集,用于在 JVM 上简化编写高并发、分布式、和有弹性的消息驱动应用。
  • ClusterClient 用于与 Akka 集群通信。它运行在 REST 服务器上,将任务发给 Akka 集群。使用 ClusterClient 是一个非常错误的决定,因为它并不会维持与 Akka 集群的长连接,因而会经常报连接错误,而且重新建立连接时还要把那个 Client 所在的 JVM 也一起重启。
  • ElasticSearch 用作查询引擎和数据存储,包括原始数据和分析结果。
  • Kibana 用作可视化平台。Kibana 是有弹性的分析和可视化平台。
  • Akka Actor 用作 ElasticSearch 的数据导入导出服务。它的表现非常好,服务从来没出过故障。
  • S3 用作集中化文件存储。
  • Elastic Load Balance 用作节点之间的负载均衡。
  • MySQL 用于元数据存储。

我们从 Akka 2.2.x 版开始用起,也碰到了一些严重问题,主要表现为:

  • ClusterClient 与 Akka 集群之间连接断开:在负载大 CPU 使用率高时,ClusterClient 常常莫名其妙的与 Akka 集群断开连接。因为它是个第三方库,所以我们只好把 JVM 重启来让它继续工作,有的时候还要半夜爬起来处理问题。
  • 资源利用率:我们发现 REST 服务器上 CPU 使用率只有 2-5%,这样太浪费资源了,Amazon EC2 服务器可不便宜。
  • 延迟问题:REST 服务器运行在不同的服务器上。这样就造成了延迟问题,因为对于每一条 Client 发过来的请求,它都要把请求反序列化,再序列化然后才能发到 Akka 集群。从 Akka 集群发来的响应消息也是一样,要先反序列化再序列化,然后才能发给请求方。这样的序列化和反序列化过程常常导致超时问题。而且,我们只是把 Play 用作 REST 后台而不是完整的 WEB 框架,我承认这是我们的设计问题。

为了解决这些问题我们设计了第二代架构,主要变化有:

  • 去掉 Akka ClusterClient。
  • Spray 替换掉 Play 架构,因为把 Play 用作 REST 服务不是个正确的决定。Spray 是个轻量级 HTTP 服务器。
  • 为了减少端到端的延迟,我们把 REST 服务运行在 Akka 集群节点所在的 JVM 上,而不是单独的节点上。

新架构是这样的:

(点击放大图像)

太棒了,这样的系统工作得非常好。生活又变得非常美好,团队也得到了很多表扬。

三个月后,来了个要增加Datasift 做为数据源的新需求,提供流数据和历史数据。这个需求好满足,只要增加一个新服务,从 Datasift 中拉取数据并发送到分析集群上即可。

(点击放大图像)

增加新服务很简单,但却导致了新问题:

  • 上述架构本质上来说是个推送模型,每当有大量的流或历史数据被推送过来时,集群就会处理不过来。
  • 我们决定把集群由 4 个节点扩展为 8 个节点。这样峰值情况下还可以,但正常情况下大多数节点都处于非常空闲的状态。我们用的是 Amazon EC2 4x.Large 节点,非常贵,所以就引发出了基础设施的费用问题
  • 我们决定使用 Amazon 的自动扩容服务。在集群上负载增加时它的确是自动扩容了,可是负载降下来时它却没有缩容。Amazon 自动扩容服务对我们的业务情况处理得不够好。
  • 另一个问题是 Akka 集群的内部节点通信在 CPU 使用率超过 90% 时常常出问题,原因可能是因为我们经验不够不会配 Akka 集群,也有可能是 Akka 集群那时候不象现在这么成熟。
  • 如果有节点崩溃的话,那整个处理过程就会停止。

当我们在努力为这个问题找解决方案时,又收到需求要再增加一种数据源!

在经过很多次头脑风暴之后,我们明白了现有架构的问题,于是做出了一个简单、可扩展和容错的第三代架构

(点击放大图像)

在这个新架构里,我们去掉了Akka 集群,重写了分析引擎。它完全是基于Akka Actor 的,REST 服务也是运行在相同的JVM 上。REST 服务只是简单的从客户端接收请求,做认证和鉴权,然后创建一条待处理消息发送到Kafka 队列中去。分析引擎的每个节点都会从Kafka 队列中拉取数据,处理完毕再拉取下一批。这样它就永远不会忙不过来。

受益于Kafka 的内部机制,不管哪个节点死掉了,Kafka 都会自动的把要处理的消息发送到另一个正常节点上,所以不会有任何消息丢失。

在这个架构下我们就不必继续租用以前的Amazon EC2 4X large 服务器了,只要用Amazon EC2 2X large 就可以支持任何负载,节省了很多钱。(此处应有掌声。:) )

这完全是个基于拉取模式的架构。所有的请求和浪涌 都通过Kafka 集群处理。它永远不会忙不过来,因为所有操作都是基于拉取模式的。整个系统部署在 26 台 EC2 节点上,已经快两年了,生产系统一次故障都没出过。

我们也用 Kafka 保存了各种服务日志来分析性能、安全和用户行为。Kafka 生产者会把日志发送到 Kafka 服务器中。因为我们已经有了 ElasticSearch 的导入导出服务,我们可以仍然用它们来推送 ElasticSearch 的日志。我们也可以轻松地用 Kibana 将用户行为可视化。

结论

  • Akka Actors 非常适合于打造高并发、分布式、有弹性的应用程序。
  • Spray 非常适合作轻量级 HTTP 服务器。现在它已改名为 Akka-HTTP
  • Play 框架非常适合于构建高并发、可扩展的 WEB 应用,它底层是 Akka。
  • ElasticSearch 是个非常好的搜索引擎,它底层是 Lucene,可以提供全文检索功能。尽管我们也把它当成数据存储来用,但数据持久化并不是它的强项(比如与 Cassandra 相比)。
  • Kafka 非常适合于流处理和日志汇聚。它的架构设计就已经支持可扩展、分布式、容错等功能。

请耐心等待我改进第四版架构之后再更新这篇文章吧……快乐编程,不断创新!

2016-08-14 17:4811515
用户头像

发布了 152 篇内容, 共 71.2 次阅读, 收获喜欢 64 次。

关注

评论 1 条评论

发布
用户头像
很棒!请问您有微信公众号or blog之类的吗,希望和您多交流(akka萌新)
2018-11-08 15:24
回复
没有更多了
发现更多内容

特斯拉为何使用.NET Core技术框架?

博文视点Broadview

NFTScan 与 Port3 在 NFT 数据领域达成战略合作

NFT Research

我,AI博士生,在线众筹研究主题

OneFlow

研究

【LeetCode】使数组可以被整除的最少删除次数Java题解

Albert

LeetCode 7月月更

即刻报名|如何降低云上数据分析成本?

Kyligence

数据分析 智能多维数据库

数据库索引:索引并不是万能药

了不起的程序猿

MySQL 数据库 java程序员

Nacos配置中心之环境准备

急需上岸的小谢

7月月更

JAVA编程规范之异常处理

源字节1号

微信小程序 软件开发 前端开发 后端开发

企业进行知识管理有哪些好处?

Geek_da0866

wallys/industrial Wireless AP/industrial Wireless AP

wallys-wifi6

IPQ4019/IPQ4029

有一说一,要搞明白优惠券架构是如何演化的,只需10张图!

程序员小毕

Java 编程 程序员 架构 面试

常用 CSS 代码片段集合,建议收藏

南城FE

CSS 前端 CSS语法 7月月更

执掌英国工程技术学会 13 载,范纳杰正式退休

E科讯

SCA在得物DevSecOps平台上应用​

得物技术

安全 DevSecOps SCA

乘数科技云管控平台适配阿里云PolarDB,共促云原生数据库生态繁荣

阿里云数据库开源

数据库 阿里云 开源数据库 polarDB PolarDB for PostgreSQL

SAP ABAP 解析 excel 文件的函数 TEXT_CONVERT_XLS_TO_SAP 单步执行分析

汪子熙

Cloud SAP abap Netweaver 7月月更

博物馆数字化——数字藏品app开发

开源直播系统源码

区块链数字藏品 数字藏品软件开发

对话ACE第四期:分布式数据库未来发展的挑战和机遇

OceanBase 数据库

数据库 分布式数据库 oceanbase

P9力荐!阿里巴巴最新出品776页JDK源码+并发核心原理解析小册

程序员小毕

Java 程序员 面试 程序人生 jdk源码

数字化时代,如何利用区块链技术赋能乳制品企业?

旺链科技

区块链 产业区块链 乳制品

如何搭建一个好的知识库管理系统?

Geek_da0866

C# 使用Timer和ProgressBar控件制作一个倒计时器

IC00

C# 7月月更

行业分析| 物流对讲

anyRTC开发者

人工智能 音视频 物流 调度 快对讲

源启数字化:既有模式,还是开源创新?|砺夏行动

OneFlow

活动

执掌英国工程技术学会13载,范纳杰正式退休

E科讯

高度关注!2022 开放原子开源峰会最新议程一览

kk-OSC

开源 开放原子全球开源峰会

怎样让全彩LED显示屏变的节能环保?

Dylan

LED显示屏 全彩LED显示屏

ES6 类聊 JavaScript 设计模式之结构型模式

devpoint

JavaScript 设计模式 桥接模式 适配器模式 7月月更

云原生 SIG 直播:关于 cni 与 hybridnet 核心技术分享 | 第 35 期

OpenAnolis小助手

开源 云原生 直播 sig 龙蜥大讲堂

数仓基本概念解析

五分钟学大数据

数据仓库 7月月更

科创人·观远数据CEO苏春园:让业务用起来,是BI行业推倒渗透率之墙的关键

科创人

大数据

使用Akka、Kafka和ElasticSearch等构建分析引擎_语言 & 开发_Satendra Kumar_InfoQ精选文章