KinesisのローレベルAPIによるリシャードを試してみた(amazon-kinesis-scaling-utils)
はじめに
AWSチームのすずきです。
Kinesis Streams、 事前に確保したシャード数に応じた性能で利用できる、フルマネージドなストリーミングデータのバッファとなるサービスです。
今回、KinesisのローレベルAPI(SplitShard / MergeShards)を利用し、 Kinesis Streams のリシャーディングを行うツール「amazon-kinesis-scaling-utils」を試す機会がありましたので、 その紹介をさせて頂きます。
環境
OS
- Amazon Linux 2016.09
IAM(role)
- 管理ポリシーとして「AmazonKinesisFullAccess」を付与した、EC2ロールを付与
Kinesis Streams
- 事前に名称「stream-1」としたKinesis Streamsを設定
aws kinesis create-stream --stream-name stream-1 --shard-count 1
$ aws kinesis describe-stream --stream-name stream-1| jq . { "StreamDescription": { "RetentionPeriodHours": 24, "StreamName": "stream-1", "Shards": [ { "ShardId": "shardId-000000000000", "HashKeyRange": { "EndingHashKey": "340282366920938463463374607431768211455", "StartingHashKey": "0" }, "SequenceNumberRange": { "StartingSequenceNumber": "49567787336773628622987525915258529573343807805176414210" } } ], "StreamARN": "arn:aws:kinesis:ap-northeast-1:000000000000:stream/stream-1", "EnhancedMonitoring": [ { "ShardLevelMetrics": [] } ], "StreamStatus": "ACTIVE" } }
インストール
Java1.8
「amazon-kinesis-scaling-utils」 は、Java1.8環境を必要とします。 AmazonLinux(2016.09) 標準のJava1.7は一旦アンインストールした後、Java1.8のインストールを実施します。
sudo yum remove java-1.7.0 -y sudo yum install java-1.8.0 -y
Java7環境を残す必要が有る場合、下記を参考に「alternatives」による切替をお試しください。 - Amazon LinuxでJava8/Tomcat8の環境を構築する
KinesisScalingUtils
公式ページより、最新の「KinesisScalingUtils」JARファイルを任意のパスにダウンロードします。
- ダウンロードURL KinesisScalingUtils-.9.5.4-complete.jar
jar_install_path='/usr/local/bin/KinesisScalingUtils.jar' kinesis_scaling_utils_jar_url='https://github.com/awslabs/amazon-kinesis-scaling-utils/raw/master/dist/KinesisScalingUtils-.9.5.4-complete.jar' sudo curl -L ${kinesis_scaling_utils_jar_url} -o ${install_path} ls -la ${install_path}
利用方法
- 「report」、「resize」、「scaleUp」、「scaleDown」の4種の機能について、動作確認をおこないました。
report
- 指定したストリームのシャードと、各シャードのhash範囲が確認出来ます。
実行
jar_install_path='/usr/local/bin/KinesisScalingUtils.jar' kinesis_aws_region="ap-northeast-1" kinesis_stream_name="stream-1" java -cp ${jar_install_path} -Dstream-name=${kinesis_stream_name} -Dscaling-action=report -Dregion=${kinesis_aws_region} ScalingClient
結果
Scaling Operation Complete Scaling Direction: NONE Shard shardId-000000000000 - Start: 0, End: 340282366920938463463374607431768211455, Keyspace Width: 340282366920938463463374607431768211455 (100.000%)
resize
- 「resize」では、シャード数を明示した変更が可能です。
実行
jar_install_path='/usr/local/bin/KinesisScalingUtils.jar' kinesis_aws_region="ap-northeast-1" kinesis_stream_name="stream-1" kinesis_resize_shard_count=2 time java -cp ${jar_install_path} -Dstream-name=${kinesis_stream_name} -Dscaling-action=resize -Dcount=${kinesis_resize_shard_count} -Dregion=${kinesis_aws_region} ScalingClient
結果
- シャード数:1→2変更
11 19, 2016 5:10:34 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Scaling Stream stream-1 from 1 Shards to 2 11 19, 2016 5:10:59 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Split Shard shardId-000000000000 at 50% Creating Final Shard shardId-000000000001 and Intermediate Shard Shard shardId-000000000002 - Start: 170141183460469231731687303715884105727, End: 340282366920938463463374607431768211455, Keyspace Width: 170141183460469231731687303715884105728 (50.000%) (50%) 11 19, 2016 5:10:59 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 50% Complete, (1 Pending, 1 Completed). Current Size 2 Shards with Approx 48 Seconds Remaining Scaling Operation Complete Scaling Direction: UP Shard shardId-000000000001 - Start: 0, End: 170141183460469231731687303715884105726, Keyspace Width: 170141183460469231731687303715884105726 (50.000%) Shard shardId-000000000002 - Start: 170141183460469231731687303715884105727, End: 340282366920938463463374607431768211455, Keyspace Width: 170141183460469231731687303715884105728 (50.000%) real 0m28.349s user 0m3.252s sys 0m0.352s
- シャード数:2→3変更
11 19, 2016 5:12:45 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Scaling Stream stream-1 from 2 Shards to 3 11 19, 2016 5:13:06 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Split Shard shardId-000000000001 at 33.3% Creating Final Shard shardId-000000000003 and Intermediate Shard Shard shardId-000000000004 - Start: 113427455640312809811712638445973955039, End: 170141183460469231731687303715884105726, Keyspace Width: 56713727820156421919974665269910150687 (16.667%) (16.7%) 11 19, 2016 5:13:06 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 33.3% Complete, (2 Pending, 1 Completed). Current Size 3 Shards with Approx 63 Seconds Remaining 11 19, 2016 5:13:27 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Merging Shard shardId-000000000004 with shardId-000000000005 11 19, 2016 5:13:49 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Created Shard shardId-000000000007 (33.3%) 11 19, 2016 5:13:49 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 66.7% Complete, (1 Pending, 2 Completed). Current Size 3 Shards with Approx 96 Seconds Remaining Scaling Operation Complete Scaling Direction: UP Shard shardId-000000000003 - Start: 0, End: 113427455640312809811712638445973955038, Keyspace Width: 113427455640312809811712638445973955038 (33.333%) Shard shardId-000000000007 - Start: 113427455640312809811712638445973955039, End: 226854911269282892207786897226553474542, Keyspace Width: 113427455628970082396074258780579519503 (33.333%) Shard shardId-000000000006 - Start: 226854911269282892207786897226553474543, End: 340282366920938463463374607431768211455, Keyspace Width: 113427455651655571255587710205214736912 (33.333%) real 1m7.971s user 0m3.532s sys 0m0.316s
scaleUp,scaleDown
- 現在のシャード数を相対値指定で増減させる事も可能です。
実行 (scaleUp)
- 3シャード増強
jar_install_path='/usr/local/bin/KinesisScalingUtils.jar' kinesis_aws_region="ap-northeast-1" kinesis_stream_name="stream-1" kinesis_resize_shard_count=3 time java -cp ${jar_install_path} -Dstream-name=${kinesis_stream_name} -Dscaling-action=scaleUp -Dcount=${kinesis_resize_shard_count} -Dregion=${kinesis_aws_region} ScalingClient
結果 (scaleUp)
- シャード数:3→6
11 19, 2016 5:18:50 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Scaling Stream stream-1 from 3 Shards to 6 11 19, 2016 5:19:12 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Split Shard shardId-000000000003 at 16.7% Creating Final Shard shardId-000000000008 and Intermediate Shard Shard shardId-000000000009 - Start: 56713727820156408308679988432371612153, End: 113427455640312809811712638445973955038, Keyspace Width: 56713727820156401503032650013602342885 (16.667%) (16.7%) 11 19, 2016 5:19:12 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 25% Complete, (3 Pending, 1 Completed). Current Size 4 Shards with Approx 88 Seconds Remaining 11 19, 2016 5:19:12 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 33.3% Complete, (2 Pending, 1 Completed). Current Size 4 Shards with Approx 66 Seconds Remaining 11 19, 2016 5:19:34 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Split Shard shardId-000000000007 at 16.7% Creating Final Shard shardId-000000000010 and Intermediate Shard Shard shardId-000000000011 - Start: 170141183460469218120392626878345567192, End: 226854911269282892207786897226553474542, Keyspace Width: 56713727808813674087394270348207907350 (16.667%) (16.7%) 11 19, 2016 5:19:34 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 50% Complete, (2 Pending, 2 Completed). Current Size 5 Shards with Approx 86 Seconds Remaining 11 19, 2016 5:19:34 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 66.7% Complete, (1 Pending, 2 Completed). Current Size 5 Shards with Approx 64 Seconds Remaining 11 19, 2016 5:19:55 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Split Shard shardId-000000000006 at 16.7% Creating Final Shard shardId-000000000012 and Intermediate Shard Shard shardId-000000000013 - Start: 283568639089439300516466885658925086696, End: 340282366920938463463374607431768211455, Keyspace Width: 56713727831499162946907721772843124759 (16.667%) (16.7%) 11 19, 2016 5:19:55 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 75% Complete, (1 Pending, 3 Completed). Current Size 6 Shards with Approx 86 Seconds Remaining Scaling Operation Complete Scaling Direction: UP Shard shardId-000000000008 - Start: 0, End: 56713727820156408308679988432371612152, Keyspace Width: 56713727820156408308679988432371612152 (16.667%) Shard shardId-000000000009 - Start: 56713727820156408308679988432371612153, End: 113427455640312809811712638445973955038, Keyspace Width: 56713727820156401503032650013602342885 (16.667%) Shard shardId-000000000010 - Start: 113427455640312809811712638445973955039, End: 170141183460469218120392626878345567191, Keyspace Width: 56713727820156408308679988432371612152 (16.667%) Shard shardId-000000000011 - Start: 170141183460469218120392626878345567192, End: 226854911269282892207786897226553474542, Keyspace Width: 56713727808813674087394270348207907350 (16.667%) Shard shardId-000000000012 - Start: 226854911269282892207786897226553474543, End: 283568639089439300516466885658925086695, Keyspace Width: 56713727820156408308679988432371612152 (16.667%) Shard shardId-000000000013 - Start: 283568639089439300516466885658925086696, End: 340282366920938463463374607431768211455, Keyspace Width: 56713727831499162946907721772843124759 (16.667%) real 1m9.592s user 0m3.612s sys 0m0.340s
実行 (scaleUp)
- 4シャード削減
実行 (scaleDown)
jar_install_path='/usr/local/bin/KinesisScalingUtils.jar' kinesis_aws_region="ap-northeast-1" kinesis_stream_name="stream-1" kinesis_resize_shard_count=4 time java -cp ${jar_install_path} -Dstream-name=${kinesis_stream_name} -Dscaling-action=scaleDown -Dcount=${kinesis_resize_shard_count} -Dregion=${kinesis_aws_region} ScalingClient
結果 (scaleDown)
- シャード数:3→6
11 19, 2016 5:21:32 午後 com.amazonaws.services.kinesis.scaling.StreamScaler scaleStream 情報: Scaling Stream stream-1 from 6 Shards to 2 11 19, 2016 5:21:55 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 16.7% Complete, (5 Pending, 1 Completed). Current Size 5 Shards with Approx 132 Seconds Remaining 11 19, 2016 5:22:16 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 33.3% Complete, (4 Pending, 2 Completed). Current Size 4 Shards with Approx 129 Seconds Remaining 11 19, 2016 5:22:16 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 40% Complete, (3 Pending, 2 Completed). Current Size 4 Shards with Approx 107 Seconds Remaining 11 19, 2016 5:22:37 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 60% Complete, (2 Pending, 3 Completed). Current Size 3 Shards with Approx 108 Seconds Remaining 11 19, 2016 5:22:58 午後 com.amazonaws.services.kinesis.scaling.StreamScaler reportProgress 情報: stream-1: Shard Modification 80% Complete, (1 Pending, 4 Completed). Current Size 2 Shards with Approx 107 Seconds Remaining Scaling Operation Complete Scaling Direction: DOWN Shard shardId-000000000015 - Start: 0, End: 170141183460469218120392626878345567191, Keyspace Width: 170141183460469218120392626878345567191 (50.000%) Shard shardId-000000000017 - Start: 170141183460469218120392626878345567192, End: 340282366920938463463374607431768211455, Keyspace Width: 170141183460469245342981980553422644263 (50.000%) real 1m30.631s user 0m3.628s sys 0m0.360s
まとめ
Kinesis Streams、東京リージョンでは1シャードあたり1時間$0.0195、月額15$程度の廉価な費用で利用できるサービスですが、 平時に比較しピーク時に多くの性能を必要とする場合など、利用規模に応じたシャード数の変更(リシャード)が望まれるものの、 CLIなどによる操作は容易とは言えないものでした。
また、2016年11月のアップデートにより、新しいKinesisのAPI(UpdteShardCount)がリリースされ、 マネジメントコンソールからのシャード数の変更も可能になりましたが、 APIの実行回数(1シャード1日2回)、変更規模(2倍、1/2まで)といった制限を伴うものでした。
- Amazon Kinesis StreamsのリシャーディングがAPI一発で行えるようになりました
-
マネジメントコンソール(Kinesisシャード変更画面)
Kinesis Streams のシャード数の増強、入力(Put)性能の確保だけでなく、出力(Get)性能の確保や、 特にLambdaのイベントソースとして利用する場合、Kinesisのシャード数に応じたLambdaを 並列稼働が可能となります。
このようなケースで同時実行数を増やす目的でのリシャードはローレベルAPIを利用する必要がありますが、 「amazon-kinesis-scaling-utils」を活用頂ければと思います。
尚、Lambda上のJava(openjdk version "1.8.0_101") でも、「amazon-kinesis-scaling-utils」は動作しました。 Kinesisのシャード数と、リシャードの所要時間は比例関係にありますが、 Lambdaのタイムアウト制限(最大300秒)に無理なく収まる規模での利用であれば、 低コストな実行環境としてLambdaもお試し頂ければと思います。
Lambda
- 実行環境(Runtime)は「python2.7」
- タイムアウト(Timeout)は 5分に延長
- Lambda用のロールとして、管理ポリシー「AmazonKinesisFullAccess」を追加
inline コード
<br />from __future__ import print_function import commands import os def lambda_handler(event, context): r = commands.getoutput("java -version") print("r = " + r) r = commands.getoutput("curl -L " + os.environ['kinesis_scaling_utils_jar_url'] + " -o /tmp/KinesisScalingUtils.jar") print("r = " + r) r = commands.getoutput("ls -la /tmp/") print("r = " + r) r = commands.getoutput("java -cp /tmp/KinesisScalingUtils.jar -Dstream-name=" + os.environ['kinesis_stream_name'] + " -Dscaling-action=resize -Dcount=" + os.environ['kinesis_resize_shard_count'] + " -Dregion=" + os.environ['kinesis_aws_region'] + " ScalingClient") print("r = " + r)
環境変数(Environment variables)
- kinesis_resize_shard_count: 1
- kinesis_scaling_utils_jar_url : https://github.com/awslabs/amazon-kinesis-scaling-utils/raw/master/dist/KinesisScalingUtils-.9.5.4-complete.jar
- kinesis_stream_name : stream-1
- kinesis_aws_region : ap-northeast-1