カテゴリー別アーカイブ: fluentd

Cloudera Managerで手軽にNorikraを試す

NorikraをCloudera Managerの管理下に置き手軽に試すためのCSD/Parcelを作りました。NorikraとはSQLでストリーム処理を行えるOSSで、いくつかの制約はありますが、大量のログを低レイテンシで処理することができます。

NorikraはJRubyで実装されているのでgemコマンドでインストールすればすぐ使うことが出来る反面、そもそも標準パッケージにJRubyがないのでインストールが面倒だったり、他のHadoopのコンポーネントはそもそもCloudera Managerで管理しているので、Norikraだけ管理が違うのなんかやだなあ、ということでCloudera Managerで管理できるようにしてみました。

Cloudera Managerとは?

Cloudera社が開発しているCDHというHadoopディストリビュージョン用の管理ツールです。Webコンソールからサービスの追加削除、起動停止、監視や障害検知など運用に関するほぼ全てを行うことができます。管理用のREST APIも用意されているので内製の管理ツールとの連携も簡単です。

Cloudera Managerのバージョン5.0.0以降からアドオンサービスが利用できるようになりました。Custom Service Descriptor(CSD)と呼ばれるサービスの動作を定義したパッケージと、Parcelと呼ばれるサービスのファイル一式が入ったパッケージを用意すれば、Clouderaが提供しているHadoop関連のサービス以外でもCloudera Manager上でサービスの管理ができるようになります。

今回はこの仕組を使ってNorikraを管理できるようにしました。

インストール

まずCloudera Managerのインストールされているホストの/opt/cloudera/csdにNorikraのCSDを配備します。

wget -P /opt/cloudera/csd https://nagaseyasuhito.github.io/norikra-csd/NORIKRA-1.0.5-cdh5.1.0.p0.4.jar

次に配備したパッケージをCloudera Managerにインストールします。REST APIっぽいですが、URIがほかのREST APIのエンドポイントとは違うんですよね。以下のURLにアクセスします。

http://<<Cloudera Manager Server>>:7180/cmf/csd/install?csdName=NORIKRA

レスポンスが

{"data":null,"message":"OK"}

であれば正常にインストールができています。Parcelのステータスを確認してみましょう。

http://<<Cloudera Manager Server>>:7180/cmf/parcel/status

cloudera-manager-04他のサービスと同様にNorikraのサービスがDownloadableのステータスになっています。ダウンロード後Distribute、Activateすれば準備は完了です。

cloudera-manager-05クラスターのAdd a ServiceからNorikraを選択してインストールできます。

コマンド(jruby, norikra, norikra-client)も合わせてインストールされます。起動終了はもちろんのこと、サービスページからNorikra Web UIへのリンク、設定画面ではPort Number、Threading TypeやStats File Pathなども変更できる上、ログもCloudera Manager上で確認できるので、標準的な範囲での利用はとりあえず事足りるのではないでしょうか。

まとめ

足りない設定や不具合など見つけたらPull Requestお待ちしています。コードはこちら
https://github.com/nagaseyasuhito/norikra-csd
https://github.com/nagaseyasuhito/norikra-parcel

近々PrestoのCSD/Parcelも作ろうかと思います。

fluentdでネストされたデータを扱いやすくする方法

前回の記事でJMXのメトリクスをfluentd経由で蓄積する方法を書きましたが、殆どの場合JMXのメトリクスは深い入れ子構造になっています。

$ curl -X POST -d '{"type":"read","mbean":"java.lang:type=Memory"}' http://localhost:8778/jolokia/ | python -mjson.tool

{
    "request": {
        "mbean": "java.lang:type=Memory",
        "type": "read"
    },
    "status": 200,
    "timestamp": 1389278295,
    "value": {
        "HeapMemoryUsage": {
            "committed": 133054464,
            "init": 16432320,
            "max": 518979584,
            "used": 67861272
        },
        "NonHeapMemoryUsage": {
            "committed": 46202880,
            "init": 24313856,
            "max": 251658240,
            "used": 45135144
        },
        "ObjectName": {
            "objectName": "java.lang:type=Memory"
        },
        "ObjectPendingFinalizationCount": 0,
        "Verbose": false
    }
}

こういったメトリクスの場合に蓄積先をTreasure Data DWHにするとネストされた部分は直接参照できず、get_json_objectというUDFを使う必要があり非常に面倒です。

# 蓄積されているデータを確認
$ td table:tail -n 1 -P glassfish memory
{
  "timestamp": 1389278845,
  "time": 1389278845,
  "status": 200,
  "request": {
    "mbean": "java.lang:type=Memory",
    "type": "read"
  },
  "value": {
    "Verbose": false,
    "ObjectPendingFinalizationCount": 0,
    "NonHeapMemoryUsage": {
      "max": 251658240,
      "committed": 46202880,
      "init": 24313856,
      "used": 45156080
    },
    "ObjectName": {
      "objectName": "java.lang:type=Memory"
    },
    "HeapMemoryUsage": {
      "max": 518979584,
      "committed": 133054464,
      "init": 16432320,
      "used": 59201544
    }
  }
}

# 直接参照できないためエラーとなる
$ td query -d glassfish -w "select v['value']['HeapMemoryUsage']['used'] from memory"

# このように参照する必要がある
$ td query -d glassfish -w "select get_json_object(v['value'], '$.HeapMemoryUsage.used') from memory"

今回はデータをフラットな形式に変換して蓄積することで、クエリを書きやすくする方法のご紹介です。

続きを読む fluentdでネストされたデータを扱いやすくする方法