2013年8月29日木曜日

fluent-plugin-jsonbucket

Fluentdのプラグインをいくつか作成しているのですが、多くが実証実験中(?)なので、rubygemsなどへの公開テスト的に簡単なものを書いてみようということで、掲題のものを10分くらいで作ってみました。

https://github.com/moaikids/fluent-plugin-jsonbucket

このoutput pluginは、Fluentd内で処理をしているjsonデータ(msgpackデータ)を、 key : {json} のような形で一つのキーにひとまとめにするプラグインです。

何をいっているのか自分でもよくわからなくなってきましたが、
{“a”:1, “b”:2, “c”:3 } 
というjsonデータ(msgpackデータ)を
{“bucket”: {“a”:1, “b”:2, “c”:3 } } 
という様な形式に変換するプラグインです。

「何に使うの??」というのが正直な感想だと思いますが、用途は一般的では無いのでヒミツです。


2013年8月21日水曜日

Elastic MapReduceの実行状況をグラフ化するmunin plugin

最近muninのプラグインを作ることが多くなりましたが、掲題のようにElastic MapReduceのプラグインを作成してみました。AWSのCloudWatchで用意されているグラフは非常に見辛いので何とかしたかったのが、作成の動機です。。。

https://github.com/moaikids/munin-emr

内部ではPythonのAWS SDK実装である"boto"を用いてjobflowsの値を取得し、stateごとに件数をグラフ化している感じです。


インストール方法は、上記のgitからpluginを取得し、munin-nodeがインストールされている環境に設置するだけです。ただしあらかじめPython(2.6 >= )がインストールされていることと、先述の"boto"ならびにtimezone関連のutil "pytz" のインストールが必要です。

pip install boto
pip install pytz

git clone https://github.com/moaikids/munin-emr.git
cp munin-fluentd/plugins/emr/* /usr/share/munin/plugins/
ln -s  /usr/share/munin/plugins/emr_jobflows  /etc/munin/plugins/emr_jobflows 

また、AWSへの接続を行うため、AWSへアクセスするためのcredential情報をmunin-nodeの設定ファイルに記載する必要があります。

$ vim /etc/munin/plugin-conf.d/munin-node 
[emr_jobflows]
user root
env.access_key_id [ACCESS_KEY_ID]
env.access_secret_key [ACCESS_SECRET_KEY]
env.region [REGION]
env.time_range 10
一番最後の"time_range"では、何分前のジョブ情報を取得するかを指定します(単位:分)。
内部実装的には、describe_jobflows APIのcreated_afterの値に、「現在時刻 - time_range」の値を渡すようになっています。

当該プラグインをmunin環境に適用すると、以下のようなグラフが表示されるようになります。

2013年8月19日月曜日

awsのpython sdkを使ってEMRのジョブステータスを取得する。

https://github.com/boto/boto
pythonのAWS SDKのひとつ"boto"を用いて、EMRのジョブステータスの取得を行ってみました。
import boto.emr
import datetime

access_key_id = "….."
access_secret_key = "….."
conn = boto.emr.connect_to_region("ap-northeast-1", aws_access_key_id=access_key_id,aws_secret_access_key=acces    s_secret_key)

created_after = datetime.datetime.today() - datetime.timedelta(hours=24)
print created_after
jobflows = conn.describe_jobflows(None, None, created_after, None )
for jobflow in jobflows:
    print jobflow.jobflowid
    print "  " + jobflow.name
    print "  " + jobflow.loguri
    print "  " + jobflow.state
    print

表示される結果は、先のRuby版の記事の内容とだいたい同じです。
http://itsneatlife.blogspot.jp/2013/08/awsruby-sdkemr.html

2013年8月16日金曜日

awsのruby sdkを使ってEMRのジョブステータスを取得する。

↓な感じになる。
以下は直近1日以内のデータのみを取得するよう、'created_after'パラメータに値を指定してます。
#!/usr/bin/env ruby
require 'rubygems'
require 'aws-sdk'

emr=AWS::EMR.new
created_after = Time.at(Time.now().to_i - (24 * 60 * 60)).iso8601
p created_after
resp = emr.client.describe_job_flows({:created_after => created_after})

resp.data[:job_flows].map{ |job|
    p job[:job_flow_id]
    p "    " + job[:name]
    p "    " + job[:log_uri]
    p "    " + job[:execution_status_detail][:state]
    p
}
実行結果例
"hogehoge"
"    hogejob.name"
"    s3n://hoge-log/emr/logs/"
"    COMPLETED"


2013年8月12日月曜日

Linuxのdateコマンドでunixtimeと日付情報の変換

何気に知っていると便利でした。
# 現在時刻をunixtimeで表示
$ date +%s
1376285909
# 指定したunixtimeを日付情報で表示
$ date --date @1376285909
2013年  8月 12日 月曜日 14:38:29 JST

2013年8月6日火曜日

redisで特定の条件にマッチするkeyを削除する

redisのコマンドラインとxargsを使うと楽ですね。
#全削除
redis-cli KEYS "*" | xargs redis-cli DEL
#前方一致
redis-cli KEYS "prefix*" | xargs redis-cli DEL
#後方一致
redis-cli KEYS "*suffix" | xargs redis-cli DEL

2013年8月2日金曜日

aws-sdk-rubyを使用してspot instanceのpricing historyを取得

https://github.com/aws/aws-sdk-ruby
gem install aws-sdk

aws-sdk-rubyをインストールした上で、使用しているAWSのID情報を設定し
export AWS_ACCESS_KEY_ID='...'
export AWS_SECRET_ACCESS_KEY='...'
export AWS_REGION='ap-northeast-1'
以下のようなruby srouceを実行すると、spot instanceのpricing historyが取得出来ます。
#!/usr/bin/env ruby
require 'rubygems'
require 'aws-sdk'

ec2=AWS::EC2.new
resp = ec2.client.describe_spot_price_history(
    :instance_types => ['m1.small', 'm1.medium', 'm1.large', 'm1.xlarge'],
    :start_time => (Time.now - 60 * 60 * 24).iso8601, 
    :availability_zone => 'ap-northeast-1b')

resp.data[:spot_price_history_set].map{ |history| 
    if history[:product_description] == "Linux/UNIX"
        p history[:instance_type] + " => " + history[:spot_price] + " (" + history[:timestamp].to_s + ")" 
    end
}
実行結果。
"m1.small => 0.017000 (2013-08-01 22:52:34 UTC)"
"m1.large => 0.067000 (2013-08-01 22:48:47 UTC)"
"m1.medium => 0.035000 (2013-08-01 22:48:44 UTC)"
"m1.xlarge => 0.134000 (2013-08-01 22:48:43 UTC)"
"m1.small => 0.000100 (2013-08-01 22:47:34 UTC)"
"m1.xlarge => 0.134000 (2013-08-01 13:12:40 UTC)"
"m1.medium => 0.035000 (2013-08-01 06:47:28 UTC)"
"m1.small => 0.017000 (2013-08-01 02:42:36 UTC)"
"m1.large => 0.067000 (2013-08-01 00:04:50 UTC)"
"m1.xlarge => 0.134000 (2013-07-31 13:11:39 UTC)"
"m1.medium => 0.035000 (2013-07-31 06:44:00 UTC)"