[AWS Advent Calendar 2013] Amazon Kinesis!

2013.12.03

はじめに

クリスマスの季節になりました。
AdventCalendarも3日目です。 S3の話をかくつもりでしたが、一年間いい子にしていたおかげで、一足早くKinesisというおもちゃが届きました。

今日はAmazon Kinesisについて書きたいと思います。
まだDocumentを読んだり、Sampleを動かそうとしている程度ですが、現時点でわかったことを書いてみます。

Amazon Kinesisって???

まだAmazon Kinesisに慣れた人もすごく少ないと思いますので、まずはKinesisの概念的なものから紹介です。

kinesis


まずはStreamに対してデータをどんどん入れていきます。
それを1個以上のKinesisApplicationで取り出し処理をします。KinesisのStreamと言うのは一旦データを受け付けてくれるバッファのような役割をしてくれているようです。
Streamからデータを取り出して処理するのがKinesisApplicationで、この中でS3やDynamoDB、Redshiftなどに入れたり、また更に別のStreamに入れる事をするようです。
この時にどれくらい取り出せるのか、どれくらい入れられるのかを決めるかはShardの数に関わってくるようです。
ManagementConsoleには必要Shard数を求めてくれるツールがついています。

Shard数お手伝いツール
実際にShard数を入力するとキャパシティを表示してくれるツールも付いているので、すごく便利です。
Shard1つのCapacity

Key Concepts

Kinesis key conceptsを見るとおおまかに説明が書いてあるのでぜひ見ておきましょう。

Data Record

Data RecordはKinesis stream に入るデータの論理的な単位がDataRecordです。 最大で50kbyteまでです。

Stream

Streamは 順序が保たれたデータ達が並んでいるところのようです。コレをrecordと呼びますが、 このrecordにはサービスがいい感じにインクリメントしてくれるSequenceNumberが付きます。
この中のデータはShardに配分されるます。

Shard

Amazon DynamoDBのCapacityUnitに似ています。似ていますが、Amazon DynamoDBのCapacityUnitの概念にパーティションの概念がくっついたもののようです。

Partition Key

PartitionKeyは最大256文字のUnicode文字列です。この文字列によってどのShardに行くのかを制御出来そうな予感です。このPartitionKeyはデータを送るアプリケーション側で指定します。同じPartitionKeyを付けることでいつも同じShardに入れることが出来そうですが、いつも同じShardに入れることで何が出来るのかはまだ思いつきません。。

Sequence Number

SequenceNumberはstreamに入ってくるデータ全てに一つ一つ一意に付けられます。

Amazon Kinesis Application

Amazon Kinesis ApplicationはStreamからデータを取り出す処理をするアプリケーションです。 今のところJavaでのClientLibraryが用意されていて、それを使って、実装していくようです。 Amazon SWFのWorkerに似ています。実際に動かす際もEC2で動かすと良いよ的な事が書いてありました。 利用する際にはこのEC2の部分の料金がかかるので、ここはぜひSpotInstanceをうまく使いたいところです。

Amazon Kinesis Client Library

上のAmazon Kinesis Applicationを実装するために便利なLibraryです。
まだLimited Previewからか、FlowFrameworkほど洗練されている感じではありません。
実際に実装するのは、

  • IRecordProcessorの実装 実際に処理をする部分
  • IRecordProcessorFactoryの実装 上のインスタンスを返すためのファクトリークラス
  • Worker

サンプルコードを見てみるとこんな感じでAmazon Kinesis Applicationを動かしていました。 |JAVA| IRecordProcessorFactory recordProcessorFactory = new SampleRecordProcessorFactory(); Worker worker = new Worker(recordProcessorFactory, kinesisClientLibConfiguration); worker.run(); |/JAVA|

Application Name

Amazon KinesisではひとつのStreamに対して複数のApplicationを持つことが出来るので、 一意に識別出来るようにしてあげます。Regionとアカウントで一意になるように付ける必要があります。 Amazon CloudWatchのメトリクスでも使います。

Producers

Kinesisに対してデータを送信するアプリケーションのことのようです。

さいごに

本当は実際に動かして検証してみたかったのですが、Kinesis Client Libraryで
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/amazonaws/services/kinesis/clientlibrary/interfaces/IRecordProcessorFactory : Unsupported major.minor version 51.0
が出てしまいました。
Amazon EC2のScalingのためにどんなMetricsが用意されているのかなどまだまだ追っていきたい事もあるので、 引き続きKinesisの調査は続けていって、ある程度まとまったところでまた書くことにします。