KinesisのローレベルAPIによるリシャードを試してみた(amazon-kinesis-scaling-utils)

2016.11.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

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ファイルを任意のパスにダウンロードします。

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まで)といった制限を伴うものでした。

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

マネジメントコンソール

Code

kinesis-scaling-utils-01

Log output

kinesis-scaling-utils-02