絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

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に出してみる

参考にするのは以下のあたり

Pluginをinstall

% embulk gem install embulk-input-http
% embulk gem install embulk-parser-xml

config.ymlの作成

  • inputhttpparserとして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を参考に、書いてみる

ElasticsearchのInstall

% brew install elasticesearch
  • brewで入れるとcluster_nameelasticsearch_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_namenodesの情報だけ合わせておく
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