Dataflow (Python) を使って
Elasticsearchにデータを移行した話
(株)エーピーコミュニケーションズ 山岡 亮
2018/03/02
自己紹介
• 山岡 亮(やまおか りょう)
• (株)エーピーコミュニケーションズ
• 新規自社サービス立ち上げ事業部に所属(5人)
• NEIGHBORSというサービスを作っています
(Riot.js + AppEngine Golang)
• 仕事ではGCPしか使っていないのに
AWS SA Professional持ちです
(趣味で取りました)
Qiita
https://qiita.com/ryo-yamaoka
Twitter
https://twitter.com/mountainhill14
背景
• こ
・サービスのコンセプト「自分一人では気付けない情報やニーズ、面白さを知る」
・Google検索は1→100にすることはできるが、0→1には向いていない(何を知りたいかわかっているものは
調べられるが、調べるべき対象が確定されていないと調べようがない)
・例えば皆さん「グヤーシュ」という料理をご存知ですか?多分知らないですよね?
実はすごく美味しいハンガリー料理です。でも皆さんはその存在を知らないので今これを知った瞬間まで
調べることさえできませんでしたよね?
そういったものをピックアップすることを目指しているサービスです
・具体的にはユーザーをフォローすることができるRSSリーダーで、配信された記事を閲覧すると
それがフォロワーに伝達される(読んだ人のアイコンがついてタイムラインの一番先頭に来る)という動きです
https://neighbors.cc/
本日の内容
• NEIGHBORSで全文検索機能を作りたい
• アプリケーション側はRSSから取得した記事をElasticsearchに
登録する処理を追加
• 既存の記事(約600,000件のDatastore Entity)を別途移行した
時にやったこと、そこから脱線して遊んでみたことを共有します
構成
• Datastore Property
• 記事タイトル
• 記事概要
• URL
• 登録日時
• Elasticsearch
• ElasticCloud(GCP)を使用 asia-northeast-1はよ
構成
• Datastore Property
• 記事タイトル
• 記事概要
• URL
• 登録日時
• Elasticsearch
• ElasticCloud(GCP)を使用 asia-northeast-1はよ
←ここに対して全文検索をかけたい
最初にやったこと
• Dataflowを使う
• Elasticsearchを扱うPythonライブラリがあったので、1エンティティずつ
投入する処理にした
• Bulkじゃないので遅いだろうけど、まぁ1回ポッキリだしちょっとくらい
遅くてもいいやという軽い気持ちでやってみた
が、ダメ
あまりにも遅すぎた
3件/secくらい
https://github.com/twitter/twemoji
・600,000 / 3 / 3,600 ≒ 55時間……?!
・ワーカーをマシマシにしてみたが20件/secくらいが限界だった
・流石にちょっと安直過ぎた
次にやったこと
• 真面目にAppEngineのTaskQueueでバッチを作った
• 128件ずつのBulkでサクッと1,300件/secくらいのスループット
• 真っ当な手段で万事解決
次にやったこと
• 真面目にAppEngineのTaskQueueでバッチを作った
• 128件ずつのBulkでサクッと1,300件/secくらいのスループット
• 真っ当な手段で万事解決
• 残念ながら当然の結果
めでたしめでたし
仕事はここで終わったので
ちょっと脱線してみました
どうやったら速くなるのか?
MythBusters(邦題:怪しい伝説)的脱線
どうする?
• やはりBulkを使おう
• 当然全Entityを1つに集約するとデカすぎる
• 1つあたりxxx件にまとめる、的な都合の良い処理は無いっぽい
• 全Entityに乱数を割り振ってそれをキーにして集約しよう
結果
• 上手くいった
• 5,000件/secくらいのスループットが出た
• 但しGCEで処理するので単価は高い
結果
• 上手くいった
• 5,000件/secくらいのスループットが出た
• 但しGCEで処理するので単価は高い
• やっぱりこの程度の要件だったらTaskQueueのバッチ作った方がいい
結果
• 上手くいった
• 5,000件/secくらいのスループットが出た
• 但しGCEで処理するので単価は高い
• やっぱりこの程度の要件だったらTaskQueueのバッチ作った方がいい
• 残念ながら当然の結論
結果
ちなみに
Javaには標準でElasticsearchIOがあります
https://github.com/twitter/twemoji

Dataflow(python)を使ってelasticsearchにデータを移行した話