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上实现流处理时,通常会将流数据通过诸如KDS、MSK、SQS等消息服务进行队列,并进行流处理。
有关消息服务的特点,请参考之前发布的帖子《处理流数据的 AWS 消息服务》以及《AWS 用于流处理的消息服务 KDS(Kinesis)・MSK(Kafka)・SQS 的特点》。
在AWS上的流处理服务
在AWS中有以下几种代表性的流处理服务。
-
- Amazon Kinesis Data Analytics (KDA)
-
- Amazon EMR の Spark Streaming
- AWS Lambda
我会在下面的表格中列出这些服务的特点。
请参考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)中。
在性能调优方面,您只需指定处理的并行数,因此可以轻松使用。
亚马逊 EMR 和 Spark Streaming
Amazon EMR是一种云计算服务,它提供了一个简便的方式来处理和分析大规模数据集。
EMR是一种用于处理和分析大量数据的托管服务。它基于开源的Apache Hadoop和Apache Spark,以及其他20多个开源软件组件。
EMR通过在多个Amazon EC2实例上构建EMR集群(Hadoop集群)来实现。在该EMR集群上可以运行诸如Spark等并行分布式处理框架,以高速处理大量数据。EMR可以通过扩展集群(添加实例)来实现性能的可扩展性。
以下是EMR集群的配置示意图。
Spark Streaming 是什么?
Spark是一个基于内存的并行分布式处理框架,主要用于批处理。Spark Streaming是Spark的组件,用于进行流处理,并提供了与KDS或Kafka(MSK)连接的插件。
Spark Streaming的流处理采用了微批处理方式。通过以几秒钟到几分钟为间隔的短时间循环批处理,实现了近实时的数据处理。与KDS类似,Spark Streaming也能进行跨多个记录的高级处理。
例如,如果我们以每分钟的间隔运行微批处理,并且在窗口操作中计算最近3分钟数据的平均值,那么我们将使用最近3次微批处理的数据。每次执行微批处理时,这个3分钟的窗口将会滑动。
KDS与Spark Streaming的结合方式
通过使用KDS插件,Spark Streaming从KDS中获取数据并进行流处理。在Spark Streaming内部,使用Kinesis Client Library(KCL)以Block间隔(1秒)获取数据,并将其在Batch间隔(例如5秒)内进行批量处理。
-
- 参考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为单位并行读取和处理数据。
在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)。
即使在多个Lambda函数中并行处理Shard时,具有相同Partition Key的记录也将由同一个Lambda函数进行处理,这样可以保证每个Partition Key的处理顺序。
参考网址: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个。
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上构建流处理系统的参考,我将感到非常幸运。