Elasticsearch+KibanaでTwitter Streamを収集する
データ収集・解析システムElasticsearchとWebフロントエンドKibanaを使い、Twitter Streamを収集する方法のメモ。
環境
Ubuntu 14.04.1 LTS 64bit版
$ uname -a Linux vm-ubuntu64-twitter 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.1 LTS Release: 14.04 Codename: trusty
Java Runtime Environmentのインストール
ElasticsearchはJavaで実装されているので、Javaの実行環境をインストールする。 Java実装としてはOracle's JavaとOpenJDKがサポートされているので、ここではOpenJDKのランタイムをインストールする。
$ sudo apt-get install default-jre
Elasticsearch、Kibana Plugin、Twitter River Pluginのインストール
下のサイトに書いてある手順を参考に、まずはElasticsearchの最新版をダウンロードし展開する。
$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.4.tar.gz $ tar zxvf elasticsearch-1.3.4.tar.gz $ cd elasticsearch-1.3.4/
次に、Kibanaをインストールする。 ApacheなどのHTTPサーバを使ってKibanaを利用する方法もあるが、ここではKibana Pluginを使うことにする。
$ bin/plugin -url http://download.elasticsearch.org/kibana/kibana/kibana-latest.zip -install elasticsearch/kibana3
Twitter Streamの収集を行うプラグイン、Twitter River Pluginをインストールする。
$ bin/plugin -install elasticsearch/elasticsearch-river-twitter/2.3.0
Elasticsearchをバックグラウンドで起動する。
$ bin/elasticsearch -d
http://localhost:9200/_plugin/kibana3/にアクセスして、Kibanaのダッシュボードが表示されることを確認する。
Twitter Stream用のカスタムマッピングを作成する
前述のサイトを参考に、Twitter Stream用のカスタムマッピングを作成する。
$ vi twitter.json
{
"settings": {
"analysis": {
"tokenizer": {
"ngram_tokenizer": {
"type": "nGram",
"min_gram": 3,
"max_gram": 3,
"token_chars": ["letter", "digit"]
}
},
"analyzer": {
"facet_analyzer": {
"type": "custom",
"char_filter": ["html_strip"],
"tokenizer": "keyword",
"filter": ["cjk_width", "lowercase"]
},
"ngram_analyzer": {
"type": "custom",
"char_filter": ["html_strip"],
"tokenizer": "ngram_tokenizer",
"filter": ["cjk_width", "lowercase"]
}
}
}
},
"mappings": {
"status" : {
"_all": {
"enabled": true,
"analyzer": "ngram_analyzer"
},
"properties" : {
"created_at" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"hashtag" : {
"properties" : {
"end" : {
"type" : "long"
},
"start" : {
"type" : "long"
},
"text" : {
"type" : "string",
"index": "analyzed",
"analyzer": "facet_analyzer"
}
}
},
"in_reply" : {
"properties" : {
"status" : {
"type" : "long"
},
"user_id" : {
"type" : "long"
},
"user_screen_name" : {
"type" : "string",
"index": "analyzed",
"analyzer": "facet_analyzer"
}
}
},
"language" : {
"type" : "string",
"index": "analyzed",
"analyzer": "facet_analyzer"
},
"link" : {
"properties" : {
"display_url" : {
"type" : "string"
},
"end" : {
"type" : "long"
},
"expand_url" : {
"type" : "string"
},
"start" : {
"type" : "long"
},
"url" : {
"type" : "string"
}
}
},
"location" : {
"type" : "geo_point"
},
"mention" : {
"properties" : {
"end" : {
"type" : "long"
},
"id" : {
"type" : "long"
},
"name" : {
"type" : "string",
"index": "not_analyzed"
},
"screen_name" : {
"type" : "string",
"index" : "not_analyzed"
},
"start" : {
"type" : "long"
}
}
},
"place" : {
"properties" : {
"country" : {
"type" : "string"
},
"country_code" : {
"type" : "string"
},
"full_name" : {
"type" : "string"
},
"id" : {
"type" : "string"
},
"name" : {
"type" : "string"
},
"type" : {
"type" : "string"
},
"url" : {
"type" : "string"
}
}
},
"retweet" : {
"properties" : {
"id" : {
"type" : "long"
},
"retweet_count" : {
"type" : "long"
},
"user_id" : {
"type" : "long"
},
"user_screen_name" : {
"type" : "string"
}
}
},
"retweet_count" : {
"type" : "long"
},
"source" : {
"type" : "string",
"index": "analyzed",
"analyzer": "facet_analyzer"
},
"text" : {
"type" : "string",
"index": "analyzed",
"analyzer": "ngram_analyzer"
},
"truncated" : {
"type" : "boolean"
},
"user" : {
"properties" : {
"description" : {
"type" : "string",
"index": "analyzed",
"analyzer": "ngram_analyzer"
},
"id" : {
"type" : "long"
},
"location" : {
"type" : "string",
"index": "analyzed",
"analyzer": "facet_analyzer"
},
"name" : {
"type" : "string",
"index": "not_analyzed"
},
"profile_image_url" : {
"type" : "string"
},
"profile_image_url_https" : {
"type" : "string"
},
"screen_name" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
}
}
}
}
Twitter Streamを収集する
Twitter Streamの収集を行うためのシェルスクリプトを作成する。
$ vi twitter_create_index.sh $ vi twitter_start.sh $ vi twitter_stop.sh
内容は順に以下の通り。OAuth関連のトークンは別途取得し置き換える。 ここではtypeプロパティをuserとすることで、認証を行ったユーザのUserStreamを収集するように設定している。
curl -XPUT 'localhost:9200/twitter' -d @twitter.json
curl -X PUT 'localhost:9200/_river/twitter/_meta' -d '{
"type": "twitter",
"twitter": {
"oauth": {
"consumer_key": "*** YOUR Consumer key HERE ***",
"consumer_secret": "*** YOUR Consumer secret HERE ***",
"access_token": "*** YOUR Access token HERE ***",
"access_token_secret": "*** YOUR Access token secret HERE ***"
},
"type": "user"
},
"index": {
"index": "twitter",
"type": "status",
"bulk_size": 100,
"flush_interval" : "5s"
}
}'
curl -XDELETE 'localhost:9200/_river/twitter'
インデックスを作成し、Twitter Streamの収集を開始する。
$ bash twitter_create_index.sh
{"acknowledged":true}
$ bash twitter_start.sh
{"_index":"_river","_type":"twitter","_id":"_meta","_version":1,"created":true}
停止するには、twitter_stop.shを実行すればよい。
KibanaのDashboardを設定する
ブラウザからKibanaにアクセスし、トップページに表示されたBlank Dashboardのリンクをクリックする。
次に、右上のConfigure Dashboardをクリックし、次の通り設定し、Saveボタンで保存する。
- Generalタブ: Titleを「Twitter Dashboard」に変更
- Indexタブ: Default Indexを「twitter」に変更
- Rowsタブ: 「Graph」「Status」の二つを作成
- Timepickerタブ: Time Fieldを「created_at」に変更
右上のSaveボタンから、Dashboard設定を保存する。 パネルの追加などの変更は自動的に保存されないので、適当なタイミングでSaveするようにするとよい。
上から二つ目の「Add panel to empty row」を選択し、パネルを追加する。
- Select Panel Type: table
- Title: Tweets
- Span: 12
- Sort: created_at
収集されたTweet一覧がJSONフォーマットで表示されるので、左側のFieldsから表示すうフィールドとして「user.screen_name」「user.name」「text」「created_at」を選択する。
さらに、一番上の「Add panel to empty row」を選択し、パネルを追加する。
- Select Panel Type: histogram
- Title: Tweet Count
- Span: 12
- Time Field: created_at
Tweet数のヒストグラムが表示されるので、ViewからIntervalを1mなどに変更する。
ヒストグラムの左側にある緑色のボタン(Add Panel)から、さらにパネルを追加する。
- Select Panel Type: terms
- Title: Hashtag
- Field: hashtag.text
- Style: Pie
- Missing: unchecked
同様に、Mention先ユーザについてのパネルを追加する。
- Select Panel Type: terms
- Title: Mention
- Field: mention.name
- Style: Pie
- Missing: unchecked
Tweetしているユーザについてのパネルを追加する。
- Select Panel Type: terms
- Title: Tweet User
- Field: user.name
- Style: Pie
- Missing: unchecked
最後に、右上のSaveボタンからDashboardを保存する。 さらにAdvancedからSave as Homeを選択すれば、このDashboardをデフォルトのDashboardに設定することができる。
Dashboardを操作する
右上のTime FilterからAuto Refreshを選ぶことで、Dashboardを一定間隔で更新させることができる。
上部のQueryで日本語を使う際は、text:"日本語"といったようにダブルクォートをつける。
