Kinesis Data Analytics、EMR Spark Streaming和Lambda是用于流式处理的AWS服务,具有以下特点:

作者:伊藤雅博,日立製作所株式会社。

首先

在AWS上实现流处理的服务有多个选择。本文将介绍AWS提供的主要流处理服务的特点。

此外,本篇帖子的內容是根據2020年中期的調查結果進行了一些更新。由於AWS的服務規格隨時更新,因此可能與最新規格不同。請參考AWS官方文件以獲取最新資訊。

投稿一覧:
1. 用于处理AWS流数据的消息传递服务
2. AWS流处理的消息传递服务特点,包括KDS(Kinesis)、MSK(Kafka)和SQS
3. AWS的Kinesis Data Analytics、EMR Spark Streaming和Lambda实现流处理的特点(本投稿)

AWS 的流处理基本架构

以下的图表展示了在构建AWS流式处理系统时常见的服务组合。

aws_streaming2.png

一般来说,在AWS上实现流处理时,通常会将流数据通过诸如KDS、MSK、SQS等消息服务进行队列,并进行流处理。

有关消息服务的特点,请参考之前发布的帖子《处理流数据的 AWS 消息服务》以及《AWS 用于流处理的消息服务 KDS(Kinesis)・MSK(Kafka)・SQS 的特点》。

在AWS上的流处理服务

在AWS中有以下几种代表性的流处理服务。

    • Amazon Kinesis Data Analytics (KDA)

 

    • Amazon EMR の Spark Streaming

 

    AWS Lambda

我会在下面的表格中列出这些服务的特点。

streaming_services.png

请参考AWS官方文档以了解各项服务规格的最新信息。另外,您可以通过在AWS上申请提高服务配额的方式,来提高某些限制值。

各个流处理服务的架构

我将介绍各项服务的架构。

亚马逊千里眼数据分析(KDA)

KDA是一个基于Apache Flink的管理服务,它从KDS或MSK获取记录并进行转换处理。它是一个开源的并行分布式处理框架,可以使用SQL或Java进行数据转换处理。

通常情况下,如果记录是以表格形式存在的数据结构(如CSV / TSV / JSON等),则将转换处理过程编写为SQL;而对于其他情况,将使用Java创建用于转换处理的Flink应用程序。 在KDA中,还可以执行涉及多个记录的高级处理。例如,可以进行窗口聚合计算,计算过去3分钟记录的平均值等。

可以直接将经过转换处理的数据传送到其他AWS服务(如DynamoDB、Elasticsearch、S3、Kinesis Data Streams和Kinesis Data Firehose)中。

kda01.png

在性能调优方面,您只需指定处理的并行数,因此可以轻松使用。

亚马逊 EMR 和 Spark Streaming

Amazon EMR是一种云计算服务,它提供了一个简便的方式来处理和分析大规模数据集。

EMR是一种用于处理和分析大量数据的托管服务。它基于开源的Apache Hadoop和Apache Spark,以及其他20多个开源软件组件。

EMR通过在多个Amazon EC2实例上构建EMR集群(Hadoop集群)来实现。在该EMR集群上可以运行诸如Spark等并行分布式处理框架,以高速处理大量数据。EMR可以通过扩展集群(添加实例)来实现性能的可扩展性。

以下是EMR集群的配置示意图。

emr01.png

Spark Streaming 是什么?

Spark是一个基于内存的并行分布式处理框架,主要用于批处理。Spark Streaming是Spark的组件,用于进行流处理,并提供了与KDS或Kafka(MSK)连接的插件。

Spark Streaming的流处理采用了微批处理方式。通过以几秒钟到几分钟为间隔的短时间循环批处理,实现了近实时的数据处理。与KDS类似,Spark Streaming也能进行跨多个记录的高级处理。

例如,如果我们以每分钟的间隔运行微批处理,并且在窗口操作中计算最近3分钟数据的平均值,那么我们将使用最近3次微批处理的数据。每次执行微批处理时,这个3分钟的窗口将会滑动。

emr03.png

KDS与Spark Streaming的结合方式

通过使用KDS插件,Spark Streaming从KDS中获取数据并进行流处理。在Spark Streaming内部,使用Kinesis Client Library(KCL)以Block间隔(1秒)获取数据,并将其在Batch间隔(例如5秒)内进行批量处理。

emr04.png
    • 参考URL:

https://aws.amazon.com/jp/blogs/big-data/optimize-spark-streaming-to-efficiently-process-amazon-kinesis-streams/
https://spark.apache.org/docs/latest/streaming-kinesis-integration.html

MSK 和 Spark Streaming 结合使用

通过使用Kafka的插件,Spark Streaming从MSK获取数据并进行流式处理。在Spark Streaming内部,会自动生成与Kafka的Partition一对一相对应的Spark任务,并以Partition为单位并行读取和处理数据。

emr05.png

在KDS的情况下,首先Receiver获取数据并且暂时存储,然后由Spark任务集中处理。但是在MSK的情况下,Spark任务直接获取并处理数据。因此,使用Spark Streaming时,可以说从MSK获取数据比从KDS获取数据更能高效地处理数据,而且没有额外的开销。

请参考以下网址:https://spark.apache.org/docs/latest/streaming-kafka-0-10-integration.html

AWS Lambda 可以用中文来解释为 “亚马逊云服务 Lambda”

通过Lambda实现的事件驱动处理

Lambda是一项无服务器服务,可以用于执行任意处理代码。与Amazon EC2不同,不需要始终启动实例,而是按照处理代码的执行时间进行计费。

通过与消息队列结合使用,可以触发Lambda函数的写入消息队列操作。无需轮询消息队列进行数据读取。这样可以构建事件驱动型应用程序。但与KDS或EMR不同,无法执行跨多个记录的高级处理(如窗口聚合等)。

对Lambda进行调优

Lambda调整参数只涉及内存量,而CPU能力、网络带宽和磁盘I/O性能将与分配的内存量成比例分配。分配的内存量可以在128 MB至10,240 MB范围内(以1 MB为单位)进行选择。

如果指定了256 MB的内存,那么CPU的处理能力将是指定128 MB内存的约2倍。如果指定了1,769 MB内存,则相当于分配给1个vCPU(Amazon EC2实例的1个vCPU信用)的CPU处理能力。如果增加内存分配量,将会分配第二个及以后的vCPU,但对于单线程处理,性能不会提高,因此需要注意。

参考链接: https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/resource-model.html

KDS/MSK和Lambda的组合

可以通过向KDS的Stream或MSK的Topic写入内容来触发Lambda函数的启动,并对数据进行转换处理。这样可以实现事件驱动的处理。触发器不仅限于写入Stream/Topic时,还可以指定定期执行的间隔。在这种情况下,可以将多个记录合并在一起进行批处理。

在初始设置中,使用一个Lambda函数并行处理1个Shard或1个Partition。在KDS的情况下,还可以使用最多10个Lambda函数并行处理1个Shard(指定Parallelization Factor)。

lambda01.png

即使在多个Lambda函数中并行处理Shard时,具有相同Partition Key的记录也将由同一个Lambda函数进行处理,这样可以保证每个Partition Key的处理顺序。

lambda02.png

参考网址:https://aws.amazon.com/blogs/compute/new-aws-lambda-scaling-controls-for-kinesis-and-dynamodb-event-sources/

SQS和Lambda的组合

可以通过向SQS写入消息来触发Lambda函数,并对数据进行转换处理。这个触发器同时支持标准队列和FIFO队列。另外,Lambda函数能够自动从队列中删除已经成功处理的消息。

在标准队列的情况下,Lambda函数的并行启动数量将自动扩展。Lambda函数的启动数量从5个开始,并且每分钟最多增加60个,最多可扩展到1,000个。

lambda03.png

KDA、EMR、Lambda在流式处理中的特点。

以下是有关流处理中KDA、EMR和Lambda的优点和注意事项。

请注意,这是人工智能生成的中文翻译,可能不准确。

亚马逊Kinesis数据分析(KDA)

    • メリット:

JavaとSQLによるデータ変換処理が可能
複数Recordにまたがる高度な処理(ウィンドウ集計など)が可能

注意点:

Flinkアプリケーション開発方法の学習が必要

亚马逊 EMR 上的 Spark Streaming

    • メリット:

Java、Scala、PythonおよびSQLによるデータ変換処理が可能
複数Recordにまたがる高度な処理(ウィンドウ集計など)が可能
MSKとの組み合わせでは若干オーバーヘッドが少ない

注意点:

Sparkアプリケーション開発方法の学習が必要
インスタンス台数などを意識する必要があり、実行時のチューニングはKDAより若干複雑

亚马逊 Lambda

    • メリット:

処理コードをデプロイするだけで簡単に利用可能
チューニング項目はメモリ量だけなので単純
サーバレスで常時稼働する必要がないため、コストを抑えやすい

注意点:

複数Recordにまたがる高度な処理(ウィンドウ集計など)はできない

最后

本文介绍了AWS提供的流处理服务的特点。通过将适当的消息传递服务和流处理服务结合起来,可以实现高效的流处理,以满足不同的应用场景。

如果本投稿能成为在AWS上构建流处理系统的参考,我将感到非常幸运。

广告
将在 10 秒后关闭
bannerAds