海量数据实时更新太慢?Lambda架构大法好!

简介:

本文将主要介绍如何利用Lambda架构来跟踪数据实时更新的项目实现,以一个新闻服务功能为例。

当前股票市场的交易者可以了解丰富的股票交易信息。从金融新闻到传统的报纸和杂志再到博客和社交媒体,汇聚着海量的数据,远比股票交易者想关注的股 票信息要大得多,这就需要为股票交易者提供信息的有效过滤。这里将开发一个新闻服务功能给股票证券投资交易者使用,并为股票交易者提供个性化新闻。

这个新闻服务就叫"自动获取金融新闻",输入各个数据源的金融新闻,也同时输入用户实时股票交易信息。不管何时,在股票交易者所拥有资产证券中占比 较大的公司,它们的新闻一到达,将会显示到股票交易者的仪表板上。随着大量股票交易者进行交易,相应的交易信息会发送过来,所以希望拥有一个大数据系统来 存储所有交易者的历史交易信息作为真实数据源,然而,处理海量数据会非常慢以至于不能进行实时的数据更新。为了达到实时跟踪和维持数据结果为最新这两个要求,可以采用Lambda架构来实现。

Lambda架构优势

在传统SQL系统,更新一个表只是对已存在字段的值进行更改,这在少量的服务器上的数据库工作的很好,可以水平扩展到从库或者备份库。但是当数据库 扩展到大量数据服务器上时,硬件崩溃等情况下恢复数据到失败点就比较困难和耗时,而且由于历史不在数据库中,仅仅存在log日志,数据崩溃将导致一些不可见的数据错误,即脏数据。

而相对应地,一个分布式、多副本消息队列的大数据系统可以保证数据一旦进入系统就不会丢失,即使在硬件或者网络失败的情况下。存储更新的所有历史可 以重建真实的数据源,并能保证每次批处理之后结果正确,然而,为了在实时数据更新后得到最新完整的数据集,需要重新处理整个历史数据集,将会耗费太长的时 间。为了解决这个问题,可以在Lambda架构中增加一个实时组件,此组件只存储数据更新的当前值,可以保证快速实时得到结果,工作过程类似于传统的 SQL系统。实时处理层的脏数据将会被后续批处理覆盖掉,这个高可用、最终一致性的系统可以实现准确的结果。当前值的任何错误,实时处理层的报告,硬件或 者网络错误,数据崩溃,或者软件Bug等将会在下一次批处理时自动修复。

自动获取金融新闻项目的数据管道

整个数据管道流动如图1:

图1

输入数据格式为JSON,主要来自综合交易信息和Twitter新闻。JSON格式的消息会push到Kafka,并被批处理层(batch layer)和实时处理层(real-time layer)消费。使用Kafka作为数据管道的输入起点,是因为Kafka可以保证即使在硬件或者网络失败的情况下,消息也会被传输到整个系统。

在批处理层,Camus(Linkin开源的项目,现已更名为Gobblin)消费所有Kafka过来的消息并保存到HDFS上,然后Spark处理所有的交易历史计算每个股票交易者持有的股票准确数量,对应的结果会写入Cassandra数据库。

在流式处理层,Spark Streaming实时消费Kafka消息,但并不像Storm那样完全实时,Spark Streaming可以达到500ms的micro-batch数据流处理。Spark Streaming可以重用批处理层的Spark代码,并且micro-batch数据流处理可以得到足够小的延迟。

批处理层和实时处理层的结果都会写入到Cassandra数据库,并通过Flask提供一个web接口服务。随着海量交易数据写入系统,Cassandra数据库的快速写入能力基本可以满足。

如何调度实时处理层和批处理层的结果

当最新的消息进入大数据系统,web接口提供的结果服务总能保持最新,综合批处理层和实时层的处理结果。用一个例子来展示如何简单的使用批处理结果和实时处理结果。

从下图2看到,有三个数据库表:一个存储批处理结果(图2中Batch表);一个存储自上次批处理完成时间点到当前时间的实时交易数据,即增量数据(图2中Real Time 2表);另外一个存储最新数据,即状态表(图2中高亮的Real Time 1表)。

任何软件、硬件或者网络问题引起批处理结果异常,都通过单独一个数据库表记录数据增量,并在批处理成功后更新为对应的批处理结果数来保证最终数据一致性。

在这个例子中,假设第一轮批处理起始时间点为t0,一个交易者做了一笔交易后获得了3M公司的5000股股票。

图2

在t0时间点,批处理开始,处理完之后最新结果存储在Real Time 1表,当前值为5000股。

图3

在批处理过程中,交易者卖掉3M公司1000股股票,Real Time 1表更新数据值为4000股,同时Real Time 2表存储从t0到当前的增量-1000股,如图4所示。

图4

当批处理结束,三个表的值分别为5000,4000,-1000。这时,交换active数据库表为Real Time 2表,进行合并批处理结果和实时结果获得最新结果值。然后重置Real Time 1表为0,后续用来存储从t1时间点开始的增量数据。接下来新的一轮以存储最新数据的Real Time 2表为起点,循环前面的过程。

图5

图6

图7

以上每步处理过程完全成功并写入数据库,可以保证展示给交易者的数据准确性。数据集 处理时间取决于数据集大小,处理任务的计划按序处理而不是按自然天时间。在一个系统中需要工作流支持复杂处理、多任务依赖和资源共享。这里采用 Airbnb的项目Airflow,可以调度程序和监控工作流。Airflow把task和上游各种依赖构建成一个有向无环图(DAG),基于 Python实现,可以把多个任务写成Bash脚本,Bash命令能直接调用任何模块,并且Bash脚本可以被Airflow使用,这样使得 Airflow易操作。Airflow编程接口比基于XML配置的调度系统Oozie简单;Airflow的Bash脚本编码量比Luigi要少很多,Luigi的每个job都是一个python工程。每步合并实时和批量数据的job运行都是前一步成功完成退出后。

最后简单总结一下,Lambda架构涉及批量处理层和实时处理层处理历史数据以及实时更新的数据。 为了Lambda架构的实现切实可行,数据处理要设计成批处理层和实时处理层结合。本项目中,有一个“备用”数据库表专门用来存储输入的总数,而不从批处 理层读取数据,并允许对批处理层和实时处理层的结果进行简单的聚合。以上就是用Lambda架构实现的一个高可用、高数据最终一致性的系统。


作者:侠天

来源:51CTO

相关文章
|
5月前
|
存储 消息中间件 并行计算
流计算中的性能优化有哪些方法?请举例说明。
流计算中的性能优化有哪些方法?请举例说明。
48 0
|
2月前
|
运维 物联网 Serverless
函数计算产品使用问题之怎么提高并发绘图
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2月前
|
存储 数据处理 Apache
超越传统数据库:揭秘Flink状态机制,让你的数据处理效率飞升!
【8月更文挑战第26天】Apache Flink 在流处理领域以其高效实时的数据处理能力脱颖而出,其核心特色之一便是状态管理机制。不同于传统数据库依靠持久化存储及 ACID 事务确保数据一致性和可靠性,Flink 利用内存中的状态管理和分布式数据流模型实现了低延迟处理。Flink 的状态分为键控状态与非键控状态,前者依据数据键值进行状态维护,适用于键值对数据处理;后者与算子实例关联,用于所有输入数据共享的状态场景。通过 checkpointing 机制,Flink 在保障状态一致性的同时,提供了更适合流处理场景的轻量级解决方案。
43 0
|
2月前
|
消息中间件 Java Kafka
Kafka不重复消费的终极秘籍!解锁幂等性、偏移量、去重神器,让你的数据流稳如老狗,告别数据混乱时代!
【8月更文挑战第24天】Apache Kafka作为一款领先的分布式流处理平台,凭借其卓越的高吞吐量与低延迟特性,在大数据处理领域中占据重要地位。然而,在利用Kafka进行数据处理时,如何有效避免重复消费成为众多开发者关注的焦点。本文深入探讨了Kafka中可能出现重复消费的原因,并提出了四种实用的解决方案:利用消息偏移量手动控制消费进度;启用幂等性生产者确保消息不被重复发送;在消费者端实施去重机制;以及借助Kafka的事务支持实现精确的一次性处理。通过这些方法,开发者可根据不同的应用场景灵活选择最适合的策略,从而保障数据处理的准确性和一致性。
86 9
|
2月前
|
存储 NoSQL 数据处理
【MongoDB大神级操作】揭秘聚合框架,让你的数据处理能力瞬间飙升,秒变数据界的超级英雄!
【8月更文挑战第24天】MongoDB是一款备受欢迎的非关系型数据库,以其灵活的文档模型和出色的可扩展性著称。其聚合框架尤其亮眼,能高效地对数据库中的数据执行复杂的转换与聚合操作,无需将数据导出到应用端处理,极大提升了数据处理的效率与灵活性。例如,在一个大型电商数据库中,聚合框架能轻松分析出最热卖的商品或特定时段内某类别商品的销售总额。通过一系列管道操作,如$unwind、$group等,可以对数据进行逐步处理并得到最终结果,同时还支持过滤、排序、分页等多种操作,极大地丰富了数据处理的能力,成为进行数据分析、报表生成及复杂业务逻辑实现的强大工具。
44 2
|
2月前
|
存储 SQL 算法
B端算法实践问题之Blink在实时业务场景下的优势如何解决
B端算法实践问题之Blink在实时业务场景下的优势如何解决
30 1
|
2月前
|
监控 Java API
【揭秘】如何用Flink CEP揪出那些偷偷摸摸连续登录失败的“捣蛋鬼”?——一场数据流中的侦探游戏
【8月更文挑战第26天】Flink 是一款先进的流处理框架,提供复杂事件处理(CEP)功能以识别实时数据流中的特定模式。CEP 在 Flink 中通过 `CEP` API 实现,支持基于模式匹配的事件检测。本文通过监测用户连续三次登录失败的具体案例介绍 Flink CEP 的工作原理与应用方法。首先创建 Flink 环境并定义数据源,接着利用 CEP 定义连续三次失败登录的模式,最后处理匹配结果并输出警报。Flink CEP 能够轻松扩展至更复杂的场景,如异常行为检测和交易欺诈检测等,有效应对多样化的业务需求。
29 0
|
存储 算法 搜索推荐
【海量数据】TopN 问题解决方案
堆排序,比特位图(bitmap),随机选择
147 0
|
人工智能 数据可视化 数据挖掘
你只管提需求,大模型解决问题:图表处理神器SheetCopilot上线
你只管提需求,大模型解决问题:图表处理神器SheetCopilot上线
246 0
|
数据采集 JSON 监控
离线计算-数据改装程序|学习笔记
快速学习离线计算-数据改装程序
离线计算-数据改装程序|学习笔记
下一篇
无影云桌面