发布于: Oct 26, 2022

流处理有助于实时流数据的收集、处理和分析,并能够持续生成见解和快速响应新出现的情况。当派生见解的值随时间减少时,此功能非常有用。因此,您对检测到的情况反应越快,反应就越有价值。例如,考虑一个可以在欺诈性信用卡交易发生时对其进行分析和阻止的流应用程序。将该应用程序与传统的面向批处理的方法相比较,该方法在每个工作日结束时识别欺诈性交易,并生成一份供您在次日早上读取的全面报告。
见解的价值会随时间推移逐渐减少,这是很常见的现象。因此,使用流处理可以大幅提高分析应用程序的价值。但是,构建和运行持续接收和处理数据的流应用程序比运行传统的面向批处理的分析应用程序更具挑战性。
在本文中,我们将讨论如何使用 Apache Flink 和 Amazon Kinesis Data Analytics for Java Applications 来应对这些挑战。我们将探索如何基于托管服务构建可靠、可扩展且高度可用的流式架构,与自我管理环境相比,这些架构可显著降低运营开销。我们会特别关注如何使用 Kinesis Data Analytics for Java Applications 准备和运行 Flink 应用程序。为此,我们使用包含源代码和 Amazon Web Services CloudFormation 模板的示例性场景。您可以使用自己的 Amazon Web Services 账户来跟随此示例,也可以根据您的具体需要调整代码。

当您构建流应用程序时,下游系统(流数据消费系统)会自然地依赖于连续和及时的输出来生成。因此,对流应用程序的可用性要求更高。与传统的基于批处理的方法相比,解决操作问题的时间也少得多。在批处理方案中,如果工作日结束时运行一次的作业失败,通常可以重新启动失败的作业,并在需要结果的次日早上仍然完成计算即可。相反,当流应用程序发生故障时,消耗输出的下游系统可能会在几分钟甚至更短时间内受到影响,预期的输出不再及时生成。
此外,如果发生故障,您不能只是删除所有中间结果和重新启动失败的处理作业,就像是通常在批处理案例中完成一样。下游系统持续消耗流作业的输出。已经消耗的输出无法轻易收回被重新消费。因此,整个处理管道对由失败时重新启动的应用程序引入的重复项更加敏感。此外,流应用程序的计算通常依赖于某种内部状态,当应用程序失败时,该内部状态也可能损坏甚至丢失。
更重要的是,流应用处理程序通常会处理不同数量的吞吐量。因此,根据当前负载来扩展应用程序相当有必要。当负载增加时,支持流应用程序的基础架构必须进行扩容,以防止应用程序过载、落后并产生不再相关的结果。另一方面,当负载减少时,基础设施应该进行缩容,不预置超过需求量的资源,以此保持成本效益。

Apache Flink 是一个针对无界和有界数据集的状态计算定制的开源项目。Flink 通过支持不同的API(包括 Java 和SQL)、丰富的时间语义和状态管理功能来应对分析流数据时许多常见的挑战。它还可以在保持精确一次处理语义的同时从故障中恢复。因此,Flink 非常适合分析低延迟流数据。
在本文中,我们将介绍如何使用 Kinesis Data Analytics for Java Applications 部署、操作和扩展 Flink 应用程序。我们使用一个场景近乎实时地分析纽约市一个出租车车队的遥测数据,以优化车队运营。在此场景中,车队中的每辆出租车都在捕获有关已完成行程的信息。跟踪信息包括接送地点、乘客数量和产生的收入。此信息作为简单的 JSON blob 被提取到 Kinesis 数据流中。然后,数据由 Flink 应用程序处理,该应用程序被部署到 Kinesis Data Analytics for Java Applications。该应用程序可识别当前存在大量打车请求的区域。派生的见解最终会持久保存到 Amazon Elasticsearch Service 中,在那里可使用 Kibana 访问和可视化的查看它们。
此场景使用如下的设计架构,该架构分为三个阶段,用于提取、处理和呈现数据。

松耦合的基础架构是该领域中的常用方法,与更紧密耦合的架构相比具有若干优势。

首先,Kinesis 数据流充当解除生产者与消费者的耦合度的缓冲区。出租车可以将它们生成的事件持久存储到数据流中,而不论处理层的状况如何,处理层当前可能正在从节点故障中恢复。同样,即使由于某些操作问题,提取或处理层当前不可用,仍可通过 Kibana 获得派生数据。最后还有重要的一点是,所有组件都可以独立扩展,并且可以使用根据其个性化需求专门定制的基础设施。

该架构还允许您在将来试验和采用新技术。多个独立应用程序可以同时使用存储在 Kinesis 数据流中的数据。然后,您可以使用生产流量的副本测试现有应用程序新版本的执行情况。而且您还可以引入不同的工具和技术堆栈来分析数据,同样不会影响现有的生产应用程序。例如,通常将 Kinesis Data Firehose 传输流作为第二个使用者添加到 Kinesis 数据流,以此将原始事件数据持久保存到 Amazon S3。这有助于长期归档数据,然后您可以用其评估即席查询或分析历史趋势。

总而言之,将架构的不同方面分为提取、处理和呈现,可以很好地松耦合不同的组件,使架构更加的稳健。此外,它还使您能够高度灵活的为不同目的选择不同的工具,可随着时间的推移更改或发展架构。

相关文章