Embulkではてなブログの記事をparseしてElasticsearchに入れてみる
Embulk良さそうだね、と言いつついじったことなかったので。 先日ちょっと近所で話題に上がったので、仕事中に息抜きでやってみた。on mac
先にまとめ
- input / parser / execute / outputと、細かく分けてpluginになっており、一般的な形式ならほぼ組み合わせていける
- 異常に楽
- 一旦input側を作ってstdoutに出す -> outputを作る(もしくは逆順)、とステップを分割して作っていけるので、普通に作るよりハマりにくそう
- sampleのinputデータも自動生成してくれるので、outputを先に作っても楽だったと思う(今回はやらなかったけど)
- pluginを取り扱うのに
embulk gem
コマンドとか用意されてて地味に便利 - 関係ないけどbrewすげぇ
Embulkのinstall
手元のMacでの実験なのでこんな感じ
% brew cask install java % brew install embulk
RSSを取得してSTDOUTに出力させる
一気にやるとわからなくなるので、とりあえずRSSから取得してstdoutに出してみる
参考にするのは以下のあたり
- http://qiita.com/takumakanari/items/8f6efe9c115411f25547
- https://github.com/takumakanari/embulk-parser-xml
Pluginをinstall
% embulk gem install embulk-input-http % embulk gem install embulk-parser-xml
config.ymlの作成
input
にhttp
、parser
としてxml
を使う
in: type: http url: http://yudoufu.hatenablog.jp/rss params: ~ parser: type: xml root: rss/channel/item schema: - { name: title, type: string } - { name: link, type: string } - { name: pubDate, type: string } method: get out: type: stdout
- とりあえず標準出力に出す
- schemaは、descriptionを含めちゃうと
実行
% embulk run config.yml 2015-06-09 16:12:06.611 +0900: Embulk v0.6.5 2015-06-09 16:12:08.400 +0900 [INFO] (transaction): {done: 0 / 1, running: 0} 2015-06-09 16:12:08.681 +0900 [INFO] (task-0000): GET "http://yudoufu.hatenablog.jp/rss" Norikra meetup #2 に参加してきた,http://yudoufu.hatenablog.jp/entry/2015/06/03/235131,Wed, 03 Jun 2015 23:51:31 +0900 AWS Summit 2015 - Day2 行ってきたまとめ,http://yudoufu.hatenablog.jp/entry/2015/06/03/232347,Wed, 03 Jun 2015 23:23:47 +0900 AWS Summit 2015 - Day2 - 新サービス解説セッション EFS と ML,http://yudoufu.hatenablog.jp/entry/2015/06/03/223904,Wed, 03 Jun 2015 22:39:04 +0900 AWS Summit 2015 - Day2 - クラウドを活用したIoT/M2Mソリューション,http://yudoufu.hatenablog.jp/entry/2015/06/03/223701,Wed, 03 Jun 2015 22:37:01 +0900 AWS Summit 2015 - Day2 - AWS セキュアデザイン(IAM) Deep Dive,http://yudoufu.hatenablog.jp/entry/2015/06/03/223637,Wed, 03 Jun 2015 22:36:37 +0900 AWS Summit 2015 - Day2 - AWS System Operation Deep Dive,http://yudoufu.hatenablog.jp/entry/2015/06/03/223605,Wed, 03 Jun 2015 22:36:05 +0900 AWS Summit 2015 - Day2 - ネットワークDeep Dive,http://yudoufu.hatenablog.jp/entry/2015/06/03/223523,Wed, 03 Jun 2015 22:35:23 +0900 2015-06-09 16:12:09.064 +0900 [INFO] (transaction): {done: 1 / 1, running: 0} 2015-06-09 16:12:09.079 +0900 [INFO] (main): Committed. 2015-06-09 16:12:09.080 +0900 [INFO] (main): Next config diff: {"in":{},"out":{}}
- ひとまず目的のデータは出た
Elasticsearchに入れてみる
以下の記事やREADMEを参考に、書いてみる
- http://swfz.hatenablog.com/entry/2015/04/25/184339
- https://github.com/muga/embulk-output-elasticsearch
ElasticsearchのInstall
- https://www.elastic.co/guide/en/elasticsearch/guide/current/_installing_elasticsearch.html
- unzipすればいいらしい
- 今回は実験なので、brewでinstall
% brew install elasticesearch
- brewで入れると
cluster_name
がelasticsearch_username
になってるので、必要なら適当に変える
% vi /usr/local/opt/elasticsearch/config/elasticsearch.yml cluster.name: elasticsearch_yudoufu
% elasticsearch --config=/usr/local/opt/elasticsearch/config/elasticsearch.yml
- とりあえずこれで、
http://127.0.0.1:9200/
にnodeが立つ 9300
がノード間通信のportで、こっちを使って接続するっぽい
Embulk pluginを入れる
% embulk gem install embulk-output-elasticsearch
config.ymlのoutputを作る
- out部分を修正
- 事前に
index
を作っておく必要は特にないので、cluster_name
とnodes
の情報だけ合わせておく
- 事前に
out: type: elasticsearch cluster_name: elasticsearch_yudoufu nodes: - { host: 127.0.0.1, port: 9300 } index: embulk_yudoufulog_rss index_type: embulk
実行
% embulk run config.yml 2015-06-09 17:05:01.632 +0900: Embulk v0.6.5 2015-06-09 17:05:03.559 +0900 [INFO] (transaction): [Dominus] loaded [], sites [] 2015-06-09 17:05:04.391 +0900 [INFO] (transaction): {done: 0 / 1, running: 0} 2015-06-09 17:05:04.400 +0900 [INFO] (task-0000): [Siena Blaze] loaded [], sites [] 2015-06-09 17:05:04.686 +0900 [INFO] (task-0000): GET "http://yudoufu.hatenablog.jp/rss" 2015-06-09 17:05:05.137 +0900 [INFO] (task-0000): Execute 7 bulk actions 2015-06-09 17:05:05.735 +0900 [INFO] (elasticsearch[Siena Blaze][transport_client_worker][T#5]{New I/O worker #22}): 7 bulk actions succeeded 2015-06-09 17:05:05.745 +0900 [INFO] (transaction): {done: 1 / 1, running: 0} 2015-06-09 17:05:05.761 +0900 [INFO] (main): Committed. 2015-06-09 17:05:05.762 +0900 [INFO] (main): Next config diff: {"in":{},"out":{}}
データの確認
- データ入ったのを確認!!\(^o^)/
% curl -X GET http://127.0.0.1:9200/embulk_yudoufulog_rss/embulk/_search\?q\=AWS\&pretty { "took" : 10, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 6, "max_score" : 0.26516503, "hits" : [ { "_index" : "embulk_yudoufulog_rss", "_type" : "embulk", "_id" : "AU3XWfGno1wqzcGPiVrl", "_score" : 0.26516503, "_source":{"title":"AWS Summit 2015 - Day2 - AWS System Operation Deep Dive","link":"http://yudoufu.hatenablog.jp/entry/2015/06/03/223605","pubDate":"Wed, 03 Jun 2015 22:36:05 +0900"} }, { "_index" : "embulk_yudoufulog_rss", "_type" : "embulk", "_id" : "AU3XWfGno1wqzcGPiVrh", "_score" : 0.111475274, "_source":{"title":"AWS Summit 2015 - Day2 行ってきたまとめ","link":"http://yudoufu.hatenablog.jp/entry/2015/06/03/232347","pubDate":"Wed, 03 Jun 2015 23:23:47 +0900"} }, { "_index" : "embulk_yudoufulog_rss", "_type" : "embulk", "_id" : "AU3XWfGno1wqzcGPiVrm", "_score" : 0.111475274, "_source":{"title":"AWS Summit 2015 - Day2 - ネットワークDeep Dive","link":"http://yudoufu.hatenablog.jp/entry/2015/06/03/223523","pubDate":"Wed, 03 Jun 2015 22:35:23 +0900"} }, { "_index" : "embulk_yudoufulog_rss", "_type" : "embulk", "_id" : "AU3XWfGno1wqzcGPiVrk", "_score" : 0.081366636, "_source":{"title":"AWS Summit 2015 - Day2 - AWS セキュアデザイン(IAM) Deep Dive","link":"http://yudoufu.hatenablog.jp/entry/2015/06/03/223637","pubDate":"Wed, 03 Jun 2015 22:36:37 +0900"} }, { "_index" : "embulk_yudoufulog_rss", "_type" : "embulk", "_id" : "AU3XWfGno1wqzcGPiVrj", "_score" : 0.057534903, "_source":{"title":"AWS Summit 2015 - Day2 - クラウドを活用したIoT/M2Mソリューション","link":"http://yudoufu.hatenablog.jp/entry/2015/06/03/223701","pubDate":"Wed, 03 Jun 2015 22:37:01 +0900"} }, { "_index" : "embulk_yudoufulog_rss", "_type" : "embulk", "_id" : "AU3XWfGno1wqzcGPiVri", "_score" : 0.057534903, "_source":{"title":"AWS Summit 2015 - Day2 - 新サービス解説セッション EFS と ML","link":"http://yudoufu.hatenablog.jp/entry/2015/06/03/223904","pubDate":"Wed, 03 Jun 2015 22:39:04 +0900"} } ] } }
最終的なconfig.yml
備忘録としてまとめておく
in: type: http url: http://yudoufu.hatenablog.jp/rss params: ~ parser: type: xml root: rss/channel/item schema: - { name: title, type: string } - { name: link, type: string } - { name: pubDate, type: string } method: get out: type: elasticsearch cluster_name: elasticsearch_yudoufu nodes: - { host: 127.0.0.1, port: 9300 } index: embulk_yudoufulog_rss index_type: embulk