使用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

相关文章

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间