@johtaniの日記 2nd

@johtani ‘s blog 2nd edition

MorphlinesのloadSolrをちょっとだけ調べてみた

宿題その2?かな。Solr勉強会でCloudera Searchのスキーマ周りってどうなってるの?という質問が出てて、 なんか調べることになってたので、関係しそうなMorphlinesのLoadSolrコマンドを調べてみました。 こいつが、Solrへの書き込みを実行するコマンドみたいだったので。
(※Cloudera Searchのスキーマの設定方法とかは調べてないです。)
(※めんどくさかったので、パッケージ名すっ飛ばしてクラス名書いてます。githubへのリンクを代わりに貼ってます。)

Record=Solrのドキュメント

convert()メソッドにて、MorphlinesのRecord(コマンドの処理するデータの1単位)に格納されているKey-ValueデータをSolrInputDocumentクラスのフィールドとして格納しています。 Recordにもフィールドという概念があり、Recordのフィールド=Solrのフィールドという事みたいです。

ということで、Solrのフィールドは事前に定義しておき、Morphlinesの処理内部でSolrのフィールド名に値を詰めていく感じでしょうか。 別途、sanitizeUnknownSolrFildsというコマンドが用意されていて、Solrのスキーマにないものはこのコマンドを使って、無視するフィールド名に変えたり、雑多なデータを入れるためのフィールド名にするといった処理ができるようです。このコマンド内部で、Solrのスキーマ設定を元に、Solrのフィールドに合致する物があるかをチェックして処理しています。

Solrへの登録処理は?

Solrへの登録処理自体はLoadSolrクラス内部でDocumentLoaderというクラスのload()メソッドを呼び出しているだけでした。ということで、DocumentBuilderクラスを少し調査。

DocumentLoader

IFでした。。。実クラスは次の条件

  1. SolrMorphlineContextにDocumentLoaderがあればそちらを採用(他の種類はなにがあるんだろ?)
  2. なければ、SolrServerDocumentLoaderをnewしたものを利用

2.の場合がおそらくMapReduceではないパターンのloadSolrだと思われます。SolrServerDocumentBuilderはSolrJのAPIを利用して、Solrへデータ登録していく普通のアプリです。(対象とするSolrは外部に起動しているもののはず=FlumeのSolrSinkではこちらを採用かな?)
Solrへの接続情報とか設定ファイルとかSolrCloud用のZooKeeperとかはSolrLocatorクラスに設定される内容が利用されます。

1.のパターンは、どうやら、Cloudera SearchのMapReduceIndexerToolのクラスにあるMyDocumentLoaderかなぁと。 こちらは、MapReduceを利用する場合に、利用されてるっぽいです(ちゃんと見てないけど) 内部処理は、HadoopのContext.writeメソッドにでSolrInputDocument(=MorphlinesのRecord)を書きだして、ReducerでSolrOutputFormatでインデックス作成の流れかなと。たぶん、MorphlineMapRunnerあたりを読みこめば解読できるかと。 ちなみに、こちらは、2.とは異なり、SolrLocatorの設定は無視されそう。

感想+妄想?

ということで、Morphlinesのデータ流れを考える上で、現時点ではSolrのスキーマを頭の片隅に置きつつ、 Recordの中にあるデータをゴニョゴニョしてデータを形成していくって感じになりそうです。 うまく処理できなかったものとかのカウントとかもとれたりするのかなぁ?とか、また色々と気になるところが出てきますが、一旦ここまでで。。。(だれか、続きを調べて書いてみてくれてもいいんですよ!コマンドもいっぱいあるし!)

とまぁ、こんなかんじでMorphlinesをちょっとだけ読みました。 よくよく考えたら、こんなの作ったことあるなぁと(こんなに汎用的じゃないけど)。 みんな同じ事考えるんですねぇ。 コマンドパターン?みたいな感じで、I/F決めてSolrとか別のシステムとかにデータ入れる処理を順番に記述できる的なバッチ処理良くかいてます(書いてましたのほうが正解かなぁ)。

Comments