Amazon KinesisからデータPut方法まとめ

こんにちは、中の人です。

今回はKinesisにデータをPutする時の注意点をまとめてみました。

Kinesisは、シャードという単位で帯域を変えることが出来、1シャードで1000req/secもデータをPutする事が出来ます。

ずーっと1000req/sec使い続けた場合、約2億6千万リクエストにもなりますが料金はなんと$100にも満たない程度というコストパフォーマンスにも優れたサービスです。

ただし、このパフォーマンスを活かすには送信プログラムにも工夫が必要です。

以前、『 Amazon Kinesis/Redshift編~アクセスログをkinesisで加工してTableauで表示してみよう① [全4回]~ 』で紹介した様な方法で行った場合、10req/sec程度しかパフォーマンスが出ません。

それ以上のリクエストについては処理待ちの状態となるため、10req/sec以上が続く場合処理が溜まってしまいます。

解決方法としては、Pythonを例に説明すると、threadingを利用することで解決できます。

threadingを使い必要なだけ処理を増やすことでパフォーマンスを上げることが出来ます。

1$ vim putrecords.py2 3#!/usr/bin/python45# -*- coding: utf-8 -*-6 7import boto.kinesis,datetime,time8import threading, Queue, subprocess, sys9import tailer10max_thread = 101112class Worker(threading.Thread):13    queue = Queue.Queue(30)1415    def __init__(self, index):16        self.index = index17    	self.conn = boto.kinesis.connect_to_region('ap-northeast-1')18        super(Worker, self).__init__()1920    def run(self):21        while True:22            log = unicode(self.queue.get(True, None), "utf-8")23            self.conn.put_record('demo-knowcom', log, '{n:d}'.format(n=self.index))2425def tail(filename):26    for line in tailer.follow(open(filename)):27        Worker.queue.put(line.strip())2829def main():30    for i in range(max_thread):31        w = Worker(i + 1)32        w.setDaemon(True)33        w.start()3435    tail(FILENAME)3637if __name__ == '__main__':38    main()

上記では前回1スレッドだった処理を最大10スレッドに増やしており、約100req/sec程度のパフォーマンスとなります。

後は必要な速度とマシンのパフォーマンスに合わせて、max_threadを調整することでより最適なパフォーマンスにする事が可能です。

いかがでしたでしょうか?

次回はPut編に続きてGetについての注意点を紹介します。

次回もお楽しみに!!

この記事を書いた人

aws-recipe-user