使用Akka来优化Spark+ElasticSearch的准实时系统

2024-08-27 12:32

本文主要是介绍使用Akka来优化Spark+ElasticSearch的准实时系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

假如有这样一个场景:系统每秒钟都会收到大量的事件,每个事件又包含很多参数,用户不仅需要准实时地还需要定期地判断每一种事件、事件的每一种参数值的组合是否超过了系统设定的阈值。面对这一场景,用户应该采用什么样的方案呢?最近,来自于 Premium Minds 的软件架构师 André Camilo 在博客上发表了一篇文章,介绍了他们是 如何使用Akka解决这一棘手问题的 。

在该文章中André Camilo首先介绍了他们的应用场景:

我们的系统每秒钟最多会收到几百个事件,有些事件有8个参数,有些事件有超过240,000个参数值的组合(*假如有一个 PhoneCall(phoneNumber, countryCode, geoZone)事件,该事件有三个参数,其中phoneNumber有4,000 个值, countryCode有5个值,geoZone有10个值,那么可能的参数值组合约为(4000+1)(5+1)(10+1)=240k个*),我们不 仅需要实时地判断这些事件以及参数值的组合是否超过了系统设定的阀值,还要保留最近30分钟的数据,以便于判断在这段时间内它们出现的频率是否也超过了阀 值。

处理该问题最简单的方式或许就是将这些数据都存起来,然后每隔一秒钟就去计算每一种组合出现的频率,但是事实上这是无法实现的,因为这样每秒钟会有超过240,000个查询,系统是无法承受的。 André Camilo 给出的第一种方案是使用Spark和ElasticSearch:

我们创建了一个Spark Streaming的数据流管道,该管道首先从JMS队列中读取消息并将其转换成PhoneCall事件,然后根据事件的参数值将一个事件分离成多个事 件,之后再使用countByWindow函数计算每一种事件组合的频率,最后检查每种组合的平均频率是否超过了阈值。在使用countByWindow 计算时,每秒钟都会设置一个30分钟的窗口,同时函数输出值会除以1800秒以得到每个窗口的平均频率,最终结果使用ElasticSearch集群存 储。

该方案的流程如下:

使用Akka来优化Spark+ElasticSearch的准实时系统

这一方案虽然可行,但是并没有解决André Camilo的问题,不是因为Spark不行,而是因为虽然Spark Streaming能够处理大量的实时数据,但是却无法处理大量的窗口。在André Camilo的实验中,如果组合数低于1000,那么这种方案能够工作的很好,但是如果超出了这一数量,那么就会导致内存溢出问题。

André Camilo给出的第二种方案是使用 Akka :

  • 对每一种参数值的组合创建一个组合Actor
  • 创建一个负责接收所有事件的Actor,该Actor根据事件的参数值将一个事件分离成多个事件,并根据参数组合的对应关系将分离后的事件发送到步骤1创建的组合Actor
  • 每一个组合Actor通过 环形缓冲区 存储最近30分钟的事件数(单位为秒),每过一秒,该缓冲区就滚动一个位置,同时该Actor会计算事件的频率,检查该频率是否超过了系统设定的阈值,并将结果发送到ElasticSearch Actor
  • ElasticSearch Actor仅仅是一个ActorPublisher,负责将数据发送到 ElasticSearch流驱动

第二种方案的流程如下:

使用Akka来优化Spark+ElasticSearch的准实时系统

环形缓冲区的结构如下:

使用Akka来优化Spark+ElasticSearch的准实时系统

你可能会问,为每一种组合创建一个Actor会不会导致Actor太多?André Camilo告诉我们,对Akka这个超轻量级的事件驱动框架来说这都不是问题。使用该方案André Camilo在一个i7 4GB的笔记本上轻松解决了800个事件的分离处理。更为重要的是,Akka支持水平扩展,如果系统有更多的参数值组合,或者需要更大的吞吐量,那么只需 要增加更多的机器即可。

最后,André Camilo的结论是:Spark有非常好的特性,它的解决方案更简单、更直观,但不太适合这个场景。Akka非常适合处理CPU敏感的问题,Actor模型更适合处理高并发的问题。

Linux上安装部署ElasticSearch全程记录  http://www.linuxidc.com/Linux/2015-09/123241.htm

Elasticsearch安装使用教程 http://www.linuxidc.com/Linux/2015-02/113615.htm

ElasticSearch 配置文件译文解析 http://www.linuxidc.com/Linux/2015-02/114244.htm

ElasticSearch集群搭建实例  http://www.linuxidc.com/Linux/2015-02/114243.htm

分布式搜索ElasticSearch单机与服务器环境搭建  http://www.linuxidc.com/Linux/2012-05/60787.htm

ElasticSearch的工作机制  http://www.linuxidc.com/Linux/2014-11/109922.htm 

Akka 的详细介绍:请点这里
Akka 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-12/126439.htm

linux

这篇关于使用Akka来优化Spark+ElasticSearch的准实时系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111675

相关文章

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停