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

本文翻译自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非常适合于流处理和日志汇聚。它的架构设计就已经支持可扩展、分布式、容错等功能。

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

http://www.infoq.com/cn/articles/use-akka-kafka--build-analysis-engine?utm_campaign=rightbar_v2&utm_source=infoq&utm_medium=articles_link&utm_content=link_text

时间: 2024-10-24 14:07:32

使用Akka、Kafka和ElasticSearch等构建分析引擎 -- good的相关文章

elasticsearch源码分析之search模块(client端)

elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们可以简单地概括为将的数据请求发送到node,然后在对返回的结果做处理并返回给调用方,话虽如此,但是过程并非那么简单. 请求初始化 1.api的注册,上一篇已经提到了,所以的api都是通过Guice框架注册进来的,在注册的时候会在controller上将不同的url绑定到不同的handler中: co

Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,elasticsearch安装配置及中文分词

http://fuxiaopang.gitbooks.io/learnelasticsearch/content/  (中文) 在Elasticsearch中,文档术语一种类型(type),各种各样的类型存在于一个索引中.你也可以通过类比传统的关系数据库得到一些大致的相似之处: 关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns) Elasticsearch ⇒ 索引 ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)一个Elasticsearch集群可以包含多个索引(数据库),也就是说其

Filebeat+Kafka+Logstash+ElasticSearch+Kibana 日志采集方案

前言 Elastic Stack 提供 Beats 和 Logstash 套件来采集任何来源.任何格式的数据.其实Beats 和 Logstash的功能差不多,都能够与 Elasticsearch 产生协同作用,而且 logstash比filebeat功能更强大一点,2个都使用是因为:Beats 是一个轻量级的采集器,支持从边缘机器向 Logstash 和 Elasticsearch 发送数据.考虑到 Logstash 占用系 统资源较多,我们采用 Filebeat 来作为我们的日志采集器.并且

Linux下电骡aMule Kademlia网络构建分析3

将本节点加入Kademlia网络 连接请求的发起 aMule在启动的时候,会起一些定时器,以便于定期的执行一些任务.其中比较重要的就是core_timer,相关code如下(amule-2.3.1/src/amule-gui.cpp): // Create the Core timer core_timer = new CTimer(this,ID_CORE_TIMER_EVENT); if (!core_timer) { AddLogLineCS(_("Fatal Error: Failed

用Grafana为Elasticsearch做日志分析

用Grafana为Elasticsearch做日志分析 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs Grafana是一个开源的.功能强大的指标仪表板和图形编辑器工具,它面向Graphite.Elasticsearch.OpenTSDB.Prometheus和InfluxDB等数据源.目前Grafana的最新版本为2.6版. Grafana仪表板界面如下: Graphite:Graphite是一个可扩展的实时图表,

Linux下电骡aMule Kademlia网络构建分析5 —— 资源的发布

资源发布请求消息的发送 在aMule中,主要用CSharedFileList class来管理共享给其它节点的文件.如我们前面在 Linux下电骡aMule Kademlia网络构建分析3 一文中分析的那样,aMule在启动的时候,会起一些定时器,以便于定期的执行一些任务.CamuleApp::OnCoreTimer()是其中之一,在这个函数中,我们可以看到这样的几行: // Publish files to server if needed. sharedfiles->Process(); 由

针对Elasticsearch的开源分析及可视化平台——Kibana

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在Elasticsearch索引中的数据.使用Kibana,可以通过各种图表进行高级数据分析及展示. Kibana让海量数据更容易理解.它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态. 在云市不需要复杂部署安装,一键使用Kibana.设置Kibana也非常简单,无需编码或者额外的基础架构,一分钟只能就能启动Elasticsearch索引

机动车缉查布控即席分析引擎

原文地址:http://user.qzone.qq.com/165162897/blog/1476716158 自2012年以来,公安部交通管理局在全国范围内推广了机动车缉查布控系统(简称卡口系统),通过整合共享各地车辆智能监测记录等信息资源,建立了横向联网.纵向贯通的全国机动车缉查布控系统,实现了大范围车辆缉查布控和预警拦截.车辆轨迹.交通流量分析研判.重点车辆布控.交通违法行为甄别查处及侦破涉车案件等应用.在侦破肇事逃逸案件.查处涉车违法行为.治安防控以及反恐维稳等方面发挥着重要作用. 随着

【译】SAE:一个大规模网络的社交分析引擎

Yang Yang, Jianfei Wang, Yutao Zhang, Wei Chen, Jing Zhang, Honglei Zhuang, Zhilin Yang, Bo Ma, Zhanpeng Fang, Sen Wu, Xiaoxiao Li, Debing Liu, and Jie Tang Deparment of Computer Science and Technology, Tsinghua University 发表时间:2013 发表刊物:KDD 摘要     在