読者です 読者をやめる 読者になる 読者になる

よしだのブログ

サブタイトルはありません。

Solr 開発環境構築手順

IT、プログラミング Solr 検索エンジン

よしだです。今日は Solr のパッチを作ったり機能追加をするために必要な開発環境の構築手順を公開してみたいと思います。subversion からのチェックアウトからeclipseの環境構築までをカバーします。

前提条件

  • 以下のソフトウェアは導入、設定済みとします。

java 8

$java-version
javaversion"1.8.0_51"
Java(TM)SERuntimeEnvironment(build1.8.0_51-b16)
JavaHotSpot(TM)64-BitServerVM(build25.51-b03,mixedmode)

ant

$ant-version
ApacheAnt(TM)version1.9.3compiledonDecember232013

svn

$svn--version
svn,version1.8.8(r1568071)
 compiledMar292014,20:04:07onx86_64-apple-darwin13.1.0

事前準備、フォルダの作成

$ cd /
$ mkdir app
$ sudo chown me:staff app
$ mkdir app/solr

チェックアウト

SVN は以下のページを参考に、アノニマス(読み取り専用)のURLを指定します。

http://lucene.apache.org/solr/resources.html

ポイントは、チェックアウト元のURLを dev ではなく、dev/trunk にすること。公式サイトでは dev までになっていますが、そのままでは branch 等含まれるのでひどく時間がかかりますし、全ては不要だと思いますので、ご注意ください。

$ svn checkout http://svn.apache.org/repos/asf/lucene/dev/trunk/solr

コンパイル

$ cd solr
$ ant ivy-bootstrap
$ ant compile

server を作成

server をビルドして、動作確認します。server をビルドすると、設定ファイル等を含む、Solr が配布されている状態にビルドされますので、そのまま動作確認が可能な状態になります。

以下の cd 後のパスが、ちょっとわかりにくですが、/app/solr/solr となります。

$ cd solr
$ ant server

Solr の起動

以下のコマンドを実行すると、Solr がバックグラウンドで起動します。停止は bin/solr stop 。

$ bin/solr start

eclipse で開発できるようにする

eclipse にインポートができるように、設定ファイルを生成します。

参考: https://wiki.apache.org/solr/HowToContribute#Notes_for_Eclipse

$ cd ../
$ ant eclipse

その後、eclipse から /app/solr を既存のプロジェクトとしてインポートする。インポート時に、「コピーする」からチェックを外すことを忘れないこと。

※ ちなみに eclipse の subversion プラグインは、subclipse がおすすめ。subclipse では .svn フォルダを見つけると、自動的に subversion で管理されているプロジェクトとしてひも付けてくれる。subclipse を使えば上記手順後、eclipse で subversion の比較など操作ができるようになる。subversion プラグインで有名ドコロのもう一つ、subversive では、できません。

おわりに

Solr や OSS のコードを読みたい、パッチを書いてみたい、機能を追加してみたいと思っても、しょっぱなの環境構築で躓くことって結構あると思います。Solr について書いてみましたが、他の OSS でも似たような手順だと思うので、色々と参考になると思いました。(apache の svn ではなく Github だとまたちょっと違うのですが、まあ似たようなもんですw )

おまけ : start.jar で起動したい

古い Solr では、起動するときに start.jar を直接呼んでいたのですが、バージョン 5 からは標準的には bin/solr というスクリプトが導入され、bin/solr start で起動するようになっています。旧バージョンの起動方法 java -jar start.jar だけでは起動しないようになっています。だたし、以下のようにオプションをつけると起動します。

java -jar start.jar --module=http

この方法だと、コンソールにログが出てくるので、特に tail の無い windows では開発に便利ですよね。

参考書籍

[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン (Software Design plus)

[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン (Software Design plus)

  • 作者: 大谷純,阿部慎一朗,大須賀稔,北野太郎,鈴木教嗣,平賀一昭,株式会社リクルートテクノロジーズ,株式会社ロンウイット
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/11/29
  • メディア: 大型本
  • この商品を含むブログ (8件) を見る

Solr 5: Troubleshooting and Maintenance

Solr 5: Troubleshooting and Maintenance

勉強会メモ - 第17回 Lucene/Solr勉強会

IT、プログラミング Solr 検索エンジン

取り急ぎ、公開しておきます!

https://solr.doorkeeper.jp/events/32633

タイトル:「Solrの対話型ゲームへの応用」

株式会社リクルートテクノロジーズ 大杉様 / 株式会社NTTデータCCS 鈴木

  • 脳内彼氏具現化計画 (脳カレXGAME) http://atl.recruit-tech.co.jp/noukare_game/

  • 頭脳がSolrベース

  • 人工無能的な?
  • 検索の過程にたどり着くまでは一般的にストレスだが、聞く・対話を楽しむゲームでは楽しみである
  • 普通の会話は1000パターン用意しても、検索結果0件の割合は約50%
  • 一方ゲームに絞ると100パターンまで減らすことができる
  • 裏でフラグの状態を保存している
  • 入稿ファイル形式:
  • エクセルだけで会話コンテンツを作成
  • フラグ管理や出力画像・テキスト全て開発可能

ここから鈴木さん

  • 利用しているところ
  • LINE公式アカウント「パン田一郎」
  • 脳カレ・脳カレ・ゲーム
  • その他色々
  • 使い方
  • 応答データのストアと検索
  • 応答データは数万程度
  • Master - Slave 構成、500QPS 以上
  • 工夫
  • J-POSフィルタ、品詞のフィルタを限定する、例えば名詞だけ抽出する
  • 助動詞の「ない」という言葉も有効なので残してある (一般的な検索では助動詞は使わないが)
  • 例)面白くない
  • N-Gramフィールド (N=5以上)、特定の繰り返しワードなどに対応
  • 例)バカバカバカバカ

タイトル:「Lucene/Solr Revolution 2015参加レポート」

ヤフー株式会社 メディアカンパニー 検索事業本部 サーチテクノロジー部 宋 賢佑様

www.slideshare.net

  • 注目セッション:Learning to Rank in Solr
  • Bloombergニュース検索
  • ML の必要性
  • 一日800万サーチ、4億の記事
  • 検索クエリに対して適合率が高い検索結果を返したい、手動チューニングはコストが高い、ドキュメントの更新が常に発生する
  • Learning to Rank、MLR
  • Implicit Data と Explicit Data を元に Feature を抽出し Rank Model を作成する
  • Featrue は特徴点のこと(点数)
  • Metrics でランキングの良し悪しを判定
  • 静的な計測方法 Presicion / Recall / F-score
  • オンライン CTR / Time to first click / 滞留時間
  • 学習方法
  • Rank SVM など

  • これらのノウハウを LTR プラグインとしてまとめた (未公開)

  • 手動でチューニングしない
  • リレバンシーの改善
  • レイテンシ維持

  • 今後のSolr

  • Analytics
  • SQL like interface
  • ML
  • NLP
  • などなど

タイトル:「Apache Lucene/Solrによる形態素解析の課題とN-bestの提案」

ヤフー株式会社 CTO室 大須賀 稔様

www.slideshare.net

  • アナライザのしくみ (まえふり)
  • 文字フィルタ、トークナイザー、トークンフィルターの3ステップ
  • 形態素解析とNgramは相反する長所短所をもつ
  • 検索結果の評価の方法
  • 適合値、最現地、F値(F-measure)

  • 形態素解析では検索漏れが多く、N-Gram ではノイズが多すぎる

  • N-Gramの併用による課題:ノイズの大量発生、インデックス量
  • JapaneseTokenizerのモードによる解決:normalモード、searchモード、extendedモード
  • 課題:意図しない分割をされるパターンがある、1つのパターンしか出力されないので複数の意味が取れるパターンに対応できない

  • N-best の実装

  • 解釈によって異なる複数のパターンでの分割、複合語の分割を可能にし、再現率の向上を目指す
  • JapaneseTokenizerにN-best機能を追加する、既存のモードと併用、

  • N-Gram よりも意味がある細かい単語で分割が可能。

  • パッチ公開済み https://issues.apache.org/jira/plugins/servlet/mobile#issue/LUCENE-6837

タイトル:「U-NEXTにおけるSolr活用事例」

株式会社U-NEXT システム開発部 秋穂 賢 様(@ken_aio)

  • U-Next ビデオ・オンデマンドの会社
  • フリーワード検索(インクリメンタルサーチ)、ユーザー毎のレコメンドデータのキャッシュ

  • レコメンドのキャシュに使った理由は、ユーザー毎のレコメンドが Redis では難しかったため。

後輩の席に行ったら、このブログのページが開いていた・・

日記

どうも!ご無沙汰しております。二ヶ月以上書いておりませんでした。

ちょうど2ヶ月ほど前に参画したプロジェクトが忙しくて、なかなかブログを書く気力を持つことができませんでした。気力があっても、あらたなネタを吸収できる余裕がなく書くことも作れないような状況でございます。毎回参加していた Elasticsearch の勉強会も2回もスキップしてしまい、新ロゴのステッカーも未入手です。。もし、技術ネタを楽しみにしていてくれる方がいらっしゃったら、今日はそういった状況でございますので、いつもの技術ネタは上げられません、すいません。

で、表題の件ですが、今日仕事中にちょっとわからないことがあって、よく知っている後輩のところに質問に行ったんですよ。普段の仕事はパッケージと言われるソフトウェアを中心にしたシステムの開発をしているのですが、私があまりやってこなかったソフトで、よく知っている後輩がおりまして。

彼のところへ行って「これってできるんだっけー?」というような質問をしたところ、彼は「ちょっとやってみないとわからないですね。少し待ってください。」といって、手元のPCで作業を始めました。私はその作業を見つつ、開きっぱなしになったブラウザーをぼーっと眺めておりました。

そうすると、たくさん開いたタブの中に見慣れたファビコンがいるではありませんか。ええ、当ブログのファビコンでした。ちゃんとファビコン設定しているとこんないいことがあるんですね、はてなさんどうもありがとうございました(ガクガク

ブログをやっていることを秘密にしているわけでもなく、やましいことを書いているわけでもないので、身バレしようが全く全く全く問題はないのですが、まぁびっくりしました。有名ブロガーの皆様はこんなことは日常茶飯事なんでしょうがね!

後輩に質問した内容と結果? それはどうでもいいですね。 以上、よろしくお願いします。

その後輩へ、俺か?と思ったら名乗り出なさいw

Apache Spark 2.0 はスマホで動く?!

Apache Spark AWS、クラウド、IaaS IT、プログラミング 機械学習、ビッグデータ

今年ぐっと来た エイプリルフールネタ。本気だと思って深夜に読んでしまいましたw 字が小さいよ! JIRA のチケットまであるから本気だと思ったわ!

f:id:yoshi0309:20150402234517p:plain

昨日 4/1 エイプリルフールの日に Spark の開発主体である、databrics 社のブログで Apache Spark 2.0 の目指す先についての言及がありました。内容は、なんと Spark をiPhoneを含むスマホの中で動かす、というものです。iOS や Android 上で稼働することを必須の目標として、フィーチャーフォンでの可動も目指している、とのこと。エイプリルフールですが、書いてある内容自体は極めて大真面目で、ある意味勉強になりました(笑)

エントリはこちら。

Spark 2.0: Rearchitecting Spark for Mobile Platforms | Databricks

JIRA のチケットまである。。。

[SPARK-6646] Spark 2.0: Rearchitecting Spark for Mobile Platforms - ASF JIRA

簡単ですが、内容の解説と感想を。

まず、機能について引用です。

Must Have:
- Support running Spark on Android and iOS
- Facilitate the development of SoLoMo (social, local, mobile) applications
- Maintain source backward compatibility
- Support heterogeneous mobile phones within a single Spark cluster

Nice to Have:
- Support running Spark on Windows phones
- Support feature phones through J2ME

目下の課題としては Android は、まあいいとして、iOS でどう動かすかです。ブロクでは4つの案を書いております。その中でも Scala.js という、Scala を JavaScript に変換する Scala.js を使い、変換した後に、Safari に搭載されている Nitro JavaScript エンジンで実行する方式が、最も望ましいと述べています。*1

パフォーマンスについては、JavaScript のパフォーマンス向上は目覚ましい物があるとしつつも、スマホの世界ではデスクトップに比べて遅れていると認めています。特に、Spark では、SIMD を使うことで恩恵を得ることができると思われるが、スマホでは SIMD はサポートされていないので、使えるように部分的にでも修正するであろう、と述べています。

ちなみに、SIMD とはコレ https://hacks.mozilla.org/2014/10/introducing-simd-js/ のことのようです。要するにデータを並列に処理できる処理方式のようで、その javascript 実装のようです。データを並列に処理できるって、確かに Spark は恩恵を受けそうですね。

エイプリルフールにしてはこの辺りまではかなりマジっぽい。

あと、こんなことも書いてあって、なかなか面白かった。このへんからだんだん怪しくなってくるw

  • Data Locality の処理を書き換える必要がある。スマホで動くので GPS で得た位置情報を元に、Locality を計算するとのことです。いや、場所が近くてもネットワーク的に近いとは違うから (笑)

  • TaskContext という機能を追加する。スマホ上で、電話しているとか、GPS の情報とかそういった情報を提供すると言っています。Context から得られる情報でジョブの割り振りを変えることができると。うん、必要かも(笑)

モバイルネットワークで通信したら激しくパケット使って、速攻で通信を止められそうですが、その点については言及はナシ。まあ、そこはどうしようも無いですからね!

まあ、もろもろ置いておいてネタに乗っかって、どういうことに使えるか?をちょっと考えてみました。

・・・

うーん、無いわw 

スマホは大量にあるけど、スマホのリソースは眠っているままで、有効活用できるだろうということをプロジェクトの動機として書いてあるんですが、これってグリッド・コンピューティングみたいですよね。懐かしい。と考えると Spark on スマホもある意味、自分のリソースを無償で提供する、という形になるので、SETI とか新薬の開発とか公共の利益になって、リソースの利用者が明確なアプリに限定されるんではないでしょうかね。。。

通勤中の電車に乗っている人々のスマホを使って、なんか機械学習とかできると面白いかもなーと思ったのですが、手元にデータが有るわけでもないしサーバーでよくね? (笑)

*1:Javaのコード?なにそれ?w

詳説 4 Tips of using Apache Spark (LT してきました!@ 第2回 Learning Spark 読書会)

Apache Spark AWS、クラウド、IaaS IT、プログラミング 機械学習、ビッグデータ

こんばんは!

去る日曜日に行われました、Learning Spark 読書会にてお時間を頂いて LT をさせていただきました。手持ちの小ネタを集めたコネタ集的な LT でしたが、参考になったなどの感想いただき、とても嬉しかったです!また、ネタがまとまったら機会をいただければと思います。

前フリはここまでにして。以下が、その時のスライドです。

今日のエントリは、その時お話した LT の解説をしたいと思います。コピペでもなんでもして使っていただければ。内容の真偽についてはできるだけ、正しいことを確認していますが、ご自分の責任でくれぐれもご利用くださいませ。バージョンは spark 1.2.1 を前提とします。

その1:Easiest way running Spark on Cluster

自分でアプリを作れるようになったら、Spark の速さを体感したくなると思います。そこで、ひとつのお手軽な方法として、Amazon EMR で Spark を動かすという方法があります。実際のやり方については、こちらのエントリを参照ください。

blog.yoslab.com

ちなみに、さきほど確認したら、もう 1.3.0 にも対応していました!素晴らしいですね。

上記のエントリでは、記載していませんが bootstrap-action を使うと、さらにクラスタのセットアップが楽になります。よくあるのが、自分のアプリを作ってその中から他のライブラリの jar を使うようにすると、大量の jar に依存していてクラスタ上にデプロイするのがシンドイという場合があります。bootstrap-action では、このようなケースを楽にできます。

bootstrap-action は、実体としてはただの bash スクリプトです。このスクリプトを指定して、create-cluster すると、クラスタの起動処理の中で、クラスタ内の各サーバー上で root 権限でこのスクリプトを実行してくれます。*1 なので、bootstrap-action の中で、scala を入れて、sbt を入れて、git-clone して、sbt package すると、sbt が自動的に必要な jar を落としてきてくれるので、いちいち大量の jar をクラスタ上に配置する手間がなくなります。唯一の欠点としては、github や bitbucket などのオンラインの git レポジトリにコードを置いておく必要があります。

参考に、実際に作成したスクリプトを貼っておきます。

gist084f66eba95adfe5fdf6

その2:オプションの指定順序を間違えると、パラメータが無視される。

自作したアプリケーションを起動する際は bin/spark-submit コマンドを呼び出すと思います。この時に指定するオプションには、自作の jar とクラス以外にも、色々なオプションがあります。例えば、クラスター環境で起動するときには、使用するメモリ、CPU、executor の数などなど指定することができます。 このオプションですが、指定する順番を間違えると、指定した値が無視され、デフォルト値で起動します。

いつものコマンドラインツールのつもりで使うと痛い目にあうという例です。。

まず、ダメな例のコマンドラインです。これでアプリを起動します。 urge-recommend-user-to-item_2.10-0.1.jar というのが、アプリの jar でそこから後ろの rates.txt までがアプリの引数、そこから後ろはそれ以外のオプションになります。適当な場所で開業しえいますが、実際には一行です。

~/spark/bin/spark-submit
--master yarn-cluster 
--jars  (省略) 
--class RecommendU2I 
urge-recommend-user-to-item_2.10-0.1.jar
s3n://abc-takumiyoshida/datasets/ s3n://abc-takumiyoshida/rates.txt 
--driver-memory 2g --num-executors 4 --executor-memory 4g --executor-cores 2

以下は、実行後に Spark の Web UI で、コマンドラインを見ることができる画面です。色付きでハイライトされている箇所にご注目いただきたいのですが、 --num-executors が2つあるのがわかると思おいます。実際の動作を観察していると、後ろで指定されている --num-executors 2 が採用されて動いていました。すなわち、指定した 4 は無視されています。。

f:id:yoshi0309:20150401230740p:plain

そこで、以下のとおり、ドキュメントに記載されている順番で並べ替えて起動すると、きちんと呼んでくれるようになりました。

~/spark/bin/spark-submit 
--class RecommendU2I 
--master yarn-cluster 
--driver-memory 2g --num-executors 5 --executor-memory 2g --executor-cores 4 
--jars (省略) 
urge-recommend-user-to-item_2.10-0.1.jar 
s3n://abc-takumiyoshida/datasets/ s3n://abc-takumiyoshida/rates.txt

ドキュメントから、全体を引用すると以下のようになります。

./bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]

メインクラスを指定する --class が先頭で、アプリの jar が離れているのが罠です。。

その3:Do Not Nest RDD

RDD をネストしてループすると NullPointerException が出る件ですが、こちらは一度エントリを書いていますので、こちらをご参照ください。

blog.yoslab.com

その4:lookup メソッドは激遅なので使わない!

Key-Value 型のタプルを RDD にすると、暗黙変換*2されて使えるようになる PairRDDFunction があるのですが、これは非常に便利なメソッドがそろっています。Key-Value 型のデータに限定されますので、RDD に無いとても便利なメソッドが多いです。以下、一例を記載すると

  • join / leftOuterJoin/ rightOuterJoin- 2つの RDD を join する。
  • countByKey- Key の値ごとに件数を数える。
  • reductByKey - Key の値ごとに reduce する。
  • groupByKey - Keyの値ごとでグルーピングする (value が key ごとに Seq にまとまる)
  • lookup - Key の値で value を検索する

特に join は強力で、RDD のネストが出来なくても join ができればなんとかなったりします。

とまあ、便利なメソッドが揃っているのですが、lookup は非常に遅い!ので、できるだけ使わないほうがよいです。特に繰り返しては。。この lookup は指定した key の値を持つ value を RDD から引っ張ってくる、というメソッドです。

以下は、Spark Web UI から、lookup の箇所をピックアップしたスクリーンショットです。Input のデータ量がわずか、240MB に対し、なんと lookup 一発で 11秒かかっていることも驚きです。ちゃんと cache もしていてこれですよ。。。

f:id:yoshi0309:20150401233733j:plain

user mailing list のアーカイブによれば、これは私のミスでもなんでもなく、そういう仕様だそうです。以下が、該当するスレッドです。要するに、全件舐めないといけないから遅いのよと、そういう話ですが、それにしてもって感じではあります。

http://mail-archives.us.apache.org/mod_mbox/spark-user/201502.mbox/%3CCAMAsSdLYXmJuwc084MzKJWq4hpSk66jCLp3MwhZULT6+gqjagQ@mail.gmail.com%3E

lookup を避けるには、map や filer で抽出する、抽出したい key が複数あるばあいは join するなどの方法が考えられます。どれを使うかは、作成しているアプリの仕様次第なので、適当なものを選んでもえればというところです。

ちなみに join ですが、いわゆる inner join なので、両方の RDD に同じ key があるデータしか帰ってきませんので、抽出にも使いやすいと思います。詳細は、以下よりどうぞ。

http://spark.apache.org/docs/1.2.1/api/scala/index.html#org.apache.spark.rdd.PairRDDFunctions



といわけで以上、小ネタだらけでしたがご参考まで!

教科書はこちら。

普通の技術書と違い、本当に教科書っぽい書き方なので、1から勉強するにも向いていると思います。おすすめです。

Learning Spark: Lightning-Fast Big Data Analysis

Learning Spark: Lightning-Fast Big Data Analysis

*1:ちなみに、実行するパスは / でした。

*2:Scalaの場合、Key-Value のデータのRDDの場合、暗黙変換で使えるようになる。

勉強会メモ - Apache Hadoop エコシステムを中心とした分散処理の今と未来

Apache Spark IT、プログラミング 機械学習、ビッグデータ

今日は、Hadoop のセミナーを見るために IIJ さんにお邪魔してきました。

内容としては、Hadoop の歴史と現状の流れを技術的な面から紐解いた第一部と、Hadoop コミュニティやオープンソースコミュニティを解説した二部という構成でした。技術的な面では、何となく理解していたつもりだったところ(分散処理をしてもオーバーヘッドが激しくIOが多くなるので速くなるとは限らない、MapReduce が遅いのはMap後にかならずHDFSに書きだすから遅い、DAGは実行するジョブを計画のなかで最適化するので速い、などなど)を非常にわかりやすく解説されていて感動しました。残念ながらまだ資料は公開されていないようですが、繰り返して読みたい内容でした。

以下、印象に残ったところだけですが、メモです。

Apache Hadoop エコシステムを中心とした分散処理の今と未来

小沢健史 NTT ソフトウェアイノベーションセンタ Hadoop のコミッタ!

  • 分散処理をしても処理が速くなるとは限らない
  • データを分散することで、書き込みにオーバーヘッドがかかる
  • ネットワークにもオーバーヘッドがある
  • 光速の壁
  • 分散処理はスケーラビリティの最終手段

  • 並列DB

  • 書くときになるべく早く返せるように予め最適化しておく
  • 早く返せるが、書き込みが遅い
  • クエリに対する柔軟性がないので、スキーマや処理内容を意識する必要がある
  • データをロードする時間が必要

  • 国内で最大のクラスタは Yahoo! Japan (6000台!) -http://itpro.nikkeibp.co.jp/atcl/interview/14/262522/031800133/?ST=bigdata&P=1

  • Hadoop を選択する理由

  • 処理対象のデータが巨大 (100GB/day や PBクラス)
  • データベースに入れる前に、非構造化データに対して前処理をしたい
  • スキーマが頻繁に変更される場合
  • これ以外のケースはRDBMSを選択するほうが無難

  • 素のMapReduceを書く人はもう少ない。ただし、use case 次第。

  • Hive とか Pig とか高水準な言語がよく使われている
  • ゆるやかに別の処理基盤へ移行中
  • Spark / Tez / Impala / Presto など

  • コミュニティへの還元方針への違い

  • ベンダは、売りになるような新機能を作りたい
  • ユーザーは、安定動作するエンハンスをしたい

QA

  • Hotな技術は Spark !

  • Storm と Spark Streaming は、レイテンシーのオーダーが1桁違う

  • Spark Streaming は、細かいアプリを繰り返し起動し、擬似ストリーミングになっている
  • Storm はピュアなストリーミング処理基盤なので速い