新発売の Apache Solr 入門 を読みました
技術評論社様の新刊、"Apache Solr 入門" 、まだ隅から隅までという状態ではありませんがざっくりと拝読いたしましたので感想です。
ちょっと前から書店に並んでいるそうですが、正式には昨日2月20日発売予定です。
Solr は Pure Java の検索エンジンである Lucene をベースとした検索エンジン「サーバ」です。
Pure Java の Lucene ベースといっても Solr が用意しているインターフェースは XMl over HTTP なので Solr を使うのに必ずしも Java の知識は必要なく、PHP や Perl からも利用できます。本書では 「Ant?何それおいしいの?」というくらい Java の知識が無い方でも迷わないようとにかく手取り足取り丁寧に説明されているのが特徴です。
構成もよく考えられており、実際に Solr を動かしながら頭から読み進めることも、ざっと流し読んでおいてリファレンスとして使うこともできるようになっています。また「そこは技術者の勘でよろしくやってくれ」的な置いてけぼり感はなく、Windows / Linux / Mac OSX 各プラットフォームに対応した詳細な解説があり、どんな初心者でも「なんかうまく動かないなぁ・・」ということがないよう細かくフォローされています。
・Java も検索エンジンも分からないけど自分のWebシステムに柔軟な検索システムを導入したい
・Java はバリバリ分かっているけれども検索エンジンってどういうもの?
・Namazu は使ったことあるけれども Lucene / Solr ってどうなのかしら?
と、どの知識レベルの方でもすんなり読み進められると思います。
Solr は「まぁ、大体 HTTP ベースのインターフェース用意したから、あとはざっくりがんばってね」という印象がありましたが、本書を読んでとにかくその完成度の高さに驚かされました。
ant タスクを使ってドキュメントをフィードしたり、Webベースの(人間向けの)インターフェースを通じて管理やトラブルシュートをしたりと、Lucene を直に叩くよりもかなり効率的に開発・運用が出来そうだと感じました。
全文検索とは何か、形態素解析/n-gramとは何か、といった検索エンジンの起訴要素から Solr のインストール、設定方法、さらには Java / PHP / Ruby / Python / Perl / JavaScript と主要な言語におけるプログラミング方法、そして運用における実践的なテクニックまでカバーしており検索エンジン経験者から Java / 検索エンジン初心者までお勧めできる本です。
私が Solr について特に気になっていた点は以下の二点です。
1. Java から Solr を利用する際、生の HTTP リクエスト・レスポンスを扱う必要があるのか?それとも Solr4J みたいな Solr の API を叩くライブラリが用意されているのか
2. クラスタ化によるスケーラビリティ、可用性の確保ができるのか
3. Java アプリケーションからは Lucene の API で直にインデックスを操作し、他のプロセスからはインデックスにアクセスするインターフェースとして Solr を利用することができるのか
本書で 1. 2. については満足のいく対応がなされていることが分かりました。
1. については、Solr 1.3 より Java 用のクライアントライブラリが同梱されており、生の HTTP/XML を扱う必要はないことが分かりました。
Java で検索エンジンを使いたいなら Solr を使わずとも Lucene を直に叩けば良いのでは?と思うかもしれませんが、ビジネスロジックのレイヤと検索エンジンのレイヤを切り離すことはスケーラビリティや可用性を柔軟に実現する上で重要です。
2. については 8 章「分散検索」にて複数の Solr サーバのセットアップ方法が、また可用性確保のためのレプリケーションについては10章「実践!Solr運用TIPS」にて内蔵のコマンドラインインターフェースやフックの使い方が説明されていました。
3. についてはざっと見た限り分かりませんでした。Java のプログラムであっても特段理由が無ければ素直に Solr のインターフェースを通してデータをフィードするのが正攻法でしょうね。
Twitter4Jはそのうち bot フレームワーク的なコンポーネントも作ろうと考えているのですが、Tweet を保管する部分に Solr を使うと面白いことが出来るかな?と思いました。
関連記事:
・書籍「Apache Solr入門」 | 関口宏司のLuceneブログ
・Apache Solr 入門 - 侍ズム
Apache Solr 入門
あけましておめでとうございます。
技術評論社様より新刊、"Apache Solr 入門" を頂きました。2月20日発売予定だそうです。
Apache Solrは Pure Java の検索エンジン/ライブラリである Lucene のサブプロジェクトで、 HTTP ベースの API を持つスタンドアロンのサーバ製品です。(たぶん。そういう認識)
一度ダウンロードして起動してみたことはあるのですが、起動して管理画面をちょっと覗いて「ふーん、なんか良くできてるなぁ」程度で止まっていました。
非常に興味のある製品でこれから Lucene と並んで普及していくものだと個人的に思っています。
章立ては以下の通りです。
Chapter 1 イントロダクション
Chapter 2 スキーマの設定
Chapter 3 インデックスの作成
Chapter 4 検索
Chapter 5 クライアントプログラミング
Chapter 6 データインポートハンドラ
Chapter 7 マルチコア
Chapter 8 分散検索
Chapter 9 サーチコンポーネント
Chapter 10 実践! Solr 運用TIPS
「入門」を謳いながらもかなり実践的な内容に踏み込んでいることが伺えます。
なにしろ著作陣には Lucene や Solr の開発者である関口 宏司さんが名を連ねていますし、Lucene/Solr による検索ビジネスコンサルティング会社である 株式会社ロンウイット が監修となっていますので期待せざるを得ません。
ヒジョーに宣伝っぽいエントリになってしまいましたが、宣伝です。はい。
読了後にまた感想を書きたいと思います。
ところで Solr と並んで興味がある Lucene のサブプロジェクトは Mahoutです。こちらはレコメンデーションエンジンです。
検索とレコメンデーション、うまく組み合わせれば ec サイトの収益機会を大きく向上させたり、イントラネットの利用効率を上げたりすることができますね。
マイクロソフトの子会社で、検索エンジンを主軸としているファストサーチもレコメンデーションエンジンを持っていたりします。
検索エンジン、レコメンデーションエンジン、そして広告エンジン(コンテクストマッチ)は似ている技術だということがなんとなくわかりますね。
関連記事:
・新発売の Apache Solr 入門 を読みました - 侍ズム
・書籍「Apache Solr入門」 | 関口宏司のLuceneブログ
Twitter4J 2.1.0 スナップショットリリース - リストAPI, retweet API, geolocation API をサポート
Twitter API の Java バインディングライブラリ、Twitter4J をアップデートしました。
http://yusuke.homeip.net/twitter4j/index.html
全てではありませんが最近リリースされたAPIセットを大体実装しています。
まだスナップショットビルドで Maven Central Repository には入れていません。
スナップショットビルドとはいえテストケースは一通り通っているビルドですので動作はそれなりに安定している(少なくとももリグレッションはないはず)ことになっています。
・Google グループ Twitter4J
Twitter4J 2.1.0-SNAPSHOT をリリース- リストAPI 、statuses/friends と statuses/followers でカーソルベースのページングをサポート
・Google Groups Twitter Development Talk
Twitter4J 2.1.0-SNAPSHOT now supports list methods / cursor-based pagination with statuses/friends and statuses/followers
バージョン2.1.0のロードマップはこちらでご覧頂けます。
・2.0.10 から 2.1.0 へのマイグレーション方法
・2.1.0-SNAPSHOT JavaDoc
・2.0.10 からの JavaDoc diff
・自前 maven repository
・snapshot ビルドをプロジェクトで利用する方法
・サポートAPIリスト
関連記事:
・Twitter4J 2.0.10 リリース - geo location API, retweet API をサポート - 侍ズム
・Twitter4J 2.0.7 リリース - 侍ズム
・Twitter4J 2.0.6 リリース - 侍ズム
・Twitter4J 2.0.5 リリース - 侍ズム
・Twitter4J 2.0.4 リリース - ストリーミング API をサポート
・Twitter4J 2.0.3 リリース - JDK1.4.2 互換性を確認 - 侍ズム
・Twitter4J 2.0.2 リリース - trends API や gzip 圧縮をサポート - 侍ズム
・Google App Engine 対応 の Twitter4J 2.0.1 リリース - 侍ズム
・Twitter4J 1.1.8 リリース - 侍ズム
・Twitter4J 1.1.5 リリース
・Twitter4J 1.1.1 リリース
・Twitter4J 1.1.0 リリース
・Twitter4J 1.0.6 リリース
・Twitter4J 1.0.5 リリース
・Twitter4J 1.0.4 リリース
・Twitter4J 自前 maven リポジトリを公開
・Twitter4J 1.0.3 リリース
・Google Calendar と Twitter を連携 - Twittercal
・ Suitter Public beta 1.0
・メールで Twitter! - TwitterMail.com
・Twitter4J 1.0.2 リリース
・Twitter4J 1.0.1 リリース
・Twitter4J 1.0 リリース
育児休業中
プロプライエタリな製品からからオープンソース、標準化への流れは必死です。
最近多くの案件で JBoss EAP や JBoss Enterprise BRMS をはじめとするレッドハットのミドルウェア製品群の 引き合いを頂いており、うれしい悲鳴を上げている毎日です。
唐突なお知らせになりますが、長男龍之介がぐんぐん成長する様を見届けてやろうとちょっと前から育児休業を取得させて頂いております。
男性の育児休業取得はあまり例がないものですから、調整に手間取ってしまい社内外共にご連絡が遅くなってしまいました。
ご指名を頂いていたのに出向く事が出来ず、期待を裏切る形となってしまったお客方は大変申し訳ありません。
他社様ほどの大所帯ではありませんが、レッドハットにはもちろん私以外にも優秀なJBossコンサルタントが多く控えております。引き続きレッドハットの掲げる JBoss Open Choice の流れに乗り、ベンダロックインしない真にオープンなシステムを安心して構築して頂けます。
個人的に何かございましたら Twitter : yusukey、SBI Business、LinkedInへどうぞ。
メールアドレスは weblog の左上に記載されています。
JBoss や Java 関連の日本のコミュニティですと以下のものを良くウォッチしています。技術的な質問はがございましたら個人宛ではなく、こういったコミュニティに投げて頂ければと思います。
興味が向いたら個人的に対応いたします。オープンソースですから休業期間中でも気が向けば勝手にソースコードを見てパッチを投げて、なんてことも出来ます。社員に限った話ではありませんが。
もちろん SLA は全くありませんのでお急ぎの際はサポート窓口や営業担当へお問い合わせください。
・みんなのDrools | Google グループ
・ みんなのjBPM | Google グループ
・[okyuu.com] ITに関する質問、ノウハウサイト
・Twitter4J J | Google グループ
・Java Solution会議室 - @IT会議室
関連記事:
・次世代のシステム環境を見据えた アプリケーションサーバー製品の選択
・「JBoss」、Java競合製品との相互運用性を強化:ニュース - CNET Japan
・レッドハット、最新版アプリケーションサーバ 「JBoss Enterprise Application Platform 5.0」を提供開始
・レッドハット、ビジネスルールの管理システムの新製品「JBoss Enterprise BRMS 5.0」を提供開始
FishEye のチューニング
最近自宅サーバのファンが良く回ります。
top コマンドで調べてみると CPU 使用率が100%!!!
どうやら FishEye の Java プロセスが激しく動いているようです。
プロセス内のどのスレッドが CPU を使っているか調べるには・・・どうしたら良いのでしょう?Linux だと top -H -b で調べられるんですが、Mac OSX では -H -b オプションは効かないようです。
スレッドダンプと CPU 使用率の傾向をみると CPU 使用率が高いのはインデックスを作成している最中だけのようなのでひとまず無視することにしました。
続いて気になったのはプロセスサイズです。GCログから、ヒープサイズは 30mb もあれば十分なことがわかっていたので以下のように -Xmx38 と指定していました。
しかしプロセスサイズは 300mb 近くに膨れあがっていました。パーマネント領域とネイティブ領域を考慮にいれても大きすぎです。
ps aux コマンドで確認してみるとなぜか最大ヒープサイズが 1024mb に設定されていました。なぜかFISHEYE_OPTSの設定が効いていません。
yusukey 34261 91.8 12.5 1646800 163492 s000 R 12:51AM 0:46.93 /System/Library/Frameworks/JavaVM.framework/Home/bin/java -Xmx1024m -XX:MaxNewSize=128m -XX:MaxPermSize=256m -Dfisheye.library.path= -Dfisheye.inst=/Users/yusukey/server/fisheye -Djava.awt.headless=true -Djava.endorsed.dirs=/Users/yusukey/server/fisheye-2.0.6/lib/endorsed -jar /Users/yusukey/server/fisheye-2.0.6/fisheyeboot.jar start
起動スクリプトを追っていったところ、以下の行で FISHEYE_OPTS が上書きされていることがわかったのでコメントアウト。
続いて、以下のページを見て BlockSize パラメータを減らせばメモリフットプリントが減ることがわかりました。これはデフォルトの 400 から 100 に縮小。
・Tuning FishEye - FishEye 2.0 - Atlassian Documentation - Confluence
そんなに負荷がかかるサービスではないのでスレッド数は少なくても良さそうですが、管理画面からはスレッド数を設定する項目が見つかりません。
config.xml のスキーマ、config.xsd を確認すると web-server 要素に指定できることがわかりました。デフォルトは最小1、最大20スレッドとなっているようです。
<xsd:all minOccurs="1">
<xsd:element name="http" type="fe:httpServerType" minOccurs="0" maxOccurs="1"/>
<xsd:element name="ajp13" type="fe:ajp13ServerType" minOccurs="0" maxOccurs="1"/>
</xsd:all>
<xsd:attribute name="site-url" type="xsd:string" use="optional"/>
<xsd:attribute name="context" use="optional" type="xsd:string"/>
<xsd:attribute name="min-threads" use="optional" type="xsd:nonNegativeInteger" default="1"/>
<xsd:attribute name="max-threads" use="optional" type="xsd:nonNegativeInteger" default="20"/>
</xsd:complexType>
ざっくりと最小1スレッド、最大8スレッドとし、使っていない http ポートは削除、ajp13 ポートのみとしました。
<ajp13 bind=":8069"/></web-server>
<api enabled="true"/>
<security allow-anon="true" allow-cru-anon="true">
<usernames force-lowercase="true"/><built-in>
<signup enabled="false"/>
</built-in>
続いて、デフォルトでは HSQLDB を使っているようなので MySQL を使うように設定してみました。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14605
Server version: 5.0.45 MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database fisheye206 character set utf8;
Query OK, 1 row affected (0.22 sec)
mysql> ^DBye
データベースを作成したら MySQL の JDBC ドライバは fisheye-2.0.6/lib/ 以下に配置 & FishEye 再起動。
そして FishEye > Admin > Database Configuration よりデータベースを設定。Test Connection > Save & Migrate Data でマイグレート完了。
この設定でだいぶメモリは節約できました。
ヒープサイズを大胆に減らしましたが、特に重くもなっていないので当面様子を見てみることにします。
関連記事:
・Jira 4 へのアップグレード手順(バージョン 3.13.1 から) - 侍ズム
・FishEye 2.0.6 のインストールとアップグレード - 侍ズム
・Jira 3.13.1 へ FishEye プラグイン 2.3 をインストール
・FishEye 1.6.3 のインストール - 侍ズム
・Jira をバージョン 3.13.1 へアップデート
・Jira をバージョン 3.12.3 へアップデート
breaking news!!!! - IntelliJ IDEA9 がオープンソース化
愛用させて頂いている JetBrains の IDE、IntelliJ IDEA がオープンソース化されるそうです。
・IntelliJ IDEA Open Sourced | JetBrains IntelliJ IDEA Blog
ライセンスは Apache 2.0 license。
Servlet / EJB などの J2EE コンポーネントには対応しない Community Edition、フル装備の Ultimate Edition という二つの版にわかれるようです。
・IntelliJ IDEA 9:: Editions Comparison Matrix
Maven や Scala サポートなど、IntelliJ が得意とする機能は Community Edition でも対応していますね。
また従来通りオープンソースプロジェクトでは全て無償で利用できます。Twitter4J や侍なども IntelliJ IDEA で開発しています。
これは一大事!!!Eclipse なんて使っている場合じゃありません!
え?JBoss Developer Studio? コホンコホン。
FishEye 2.0.6 のインストールとアップグレード
FishEye はJBoss や Apache で使われているバグトラッキングシステム Jira を開発している Atlassian の製品で、ソースコードリポジトリの変更履歴を確認したり、統計情報を確認したりできる Web アプリケーションです。
例によってオープンソース製品には無償のライセンスが用意されていて、JBoss.orgでも使われています。
私は 自宅の Jira と連携させて使っています。
インストールガイドは以下のページにあります。
・FishEye Installation & Upgrade Guide - FishEye 2.0 - Atlassian Documentation - Confluence
1. FishEye 2.0 のダウンロード
ダウンロードページより zip アーカイブをダウンロードします。FishEye はどういうわけか Jira と違って JBoss や WLS 等の既存のアプリケーションサーバにデプロイすることはできず、Jetty を内蔵するスタンドアロン版しかありません。
・FishEye Downloads
2. FishEye インストールディレクトリの作成
FishEye は自己完結型のディレクトリ構成を持っていますが、そのまま利用するとアップグレードが面倒になるため、運用環境ではデータは別ディレクトリに配置することを推奨しています。
私は fisheye ディレクトリを掘ってありますのですんなりアップグレードできそうです。
3. ライセンスの設定(アップグレードの場合は不要)
3.a. FishEye を起動
まずは起動してからセットアップします。
$ export FISHEYE_HOME=~/server/fisheye-2.0.6
$ cd $FISHEYE_HOME/bin
./run.sh
INFO - FishEye 1.6.3 (build-336), Built on 2008-11-04
INFO -
INFO - =======================================================
INFO -
INFO - Welcome to FishEye!
INFO -
INFO - You need to configure an admin password and enter your
INFO - license key. You can do this by accessing FishEye through
INFO - a web browser:
INFO -
INFO - http://hostipaddress:8060/
INFO -
INFO - Alternatively you can edit config.xml, refer to the
INFO - FishEye administration guide for more infotmation:
INFO -
INFO - http://confluence.atlassian.com/x/N4CDBQ
INFO -
INFO - =======================================================
INFO -
Could not find a FishEye license.
Please visit http://my.atlassian.com and quote ****-****-****-**** to obtain a valid license,
or visit http://www.atlassian.com/fisheye/renew to renew your license.
INFO - Periodic polling for software updates is disabled.
INFO - Server started on :8060 (http) (control port on 127.0.0.1:8059)
WARN - No license info available, not starting FishEye repositories.
起動すると Server ID という 16 ケタの16進数の ID が発行されます。
これを控えておき、http://my.atlassian.com で評価用ライセンスを取得します。
3.b. ライセンスの入力
http://my.atlassian.com でライセンスキーを取得できたら http://ホスト:8060にアクセスし、ライセンスキーを入力します。
ライセンスキーを入力
ライセンスが受け入れられたところ
4. リポジトリのセットアップ(アップグレードの場合は不要)
http://ホスト:8060/adminにアクセスすると、管理画面になります。
fisheye 管理画面
[Repository List > Add repository] より、リポジトリを追加するフォームが表示されます。
Name*: リポジトリの名前
Repository type: SVN, CVS, perforce の中から選択
SVN URL*: プロトコルスキームから始まるリポジトリのパスを入力
Path: リポジトリのうち特定のディレクトリだけを fisheye で表示したい場合は入力
trunk/branch/tag structure: /project/trunk/..., /project/branches/NAME/..., /project/tags/NAME/...
リポジトリ追加フォーム
フォームに必要事項を記入したら [add] でリポジトリの追加が完了。
自動的にリポジトリのスキャンが始まります。
5. コンテクストパス、ajp コネクタのセットアップ(アップグレードの場合は不要)
FishEye はデフォルトでルートコンテキストで動作するようです。
今回は FishEye 用のサブドメインを立てるのではなく、http://yusuke.homeip.net/fisheye/ というパスでアクセスできるようにしたいのでコンテクストパスを設定することにしました。
コンテクストパスやその他 Web サーバの設定は [Server Settings > Web Server > Edit settings] より行えます。
以下のように設定しました。
WebContext: fisheye
Http Bind Address: 8060
Ajp13 Bind Address: 8069
Bind Address のところは特定の NIC だけでリスンてほしければ IPアドレス:ポート のフォーマットで入力すればokです。
今回は Wifi でも Ethernet でもリスンして欲しいのでポートだけ入力しました。
6. 起動スクリプト設定
デフォルトではヒープサイズや GC ログの設定がされていないようです。
最低限どれくらいのヒープサイズで動くのかわかりませんのでざっくりと 64mb に設定し、-XX:+PrintGCTimeSamps オプションで GC 状況のログを取っておくことにしました。
設定は fisheyectl.sh に書きます。
2: FISHEYE_OPTS="$FISHEYE_OPTS -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xmx64m -Xms64m-Xss180k"
3: FISHEYE_INST=/Users/yusukey/server/fisheye
4: FISHEYE_HOME=/Users/yusukey/server/fisheye-2.0.6
7. mod_jk 設定
8060番ポートに穴を空けたくないので mod_jk を以下のように設定して Apache と連携させました。
worker.properties
worker.fisheye.host=127.0.0.1
worker.fisheye.type=ajp13
uriworkermap.properties
/fisheye/*=fisheye
8. 起動設定(アップグレードの場合は不要)
FishEye は run.sh で簡単に起動できますが、サーバ(再)起動時に手動で起動するのは面倒なので自動起動できるように設定しました。
# mkdir fisheye
MacOSX 独自の起動スクリプトを書く
# vi fisheye
##
# fisheye
##
. /etc/rc.common
StartService ()
{
ConsoleMessage "Starting FishEye"
cd /Users/yusukey/server/fisheye-2.0.6/bin
sudo -u yusukey ./start.sh
}
StopService ()
{
ConsoleMessage "Stopping FishEye"
cd /Users/yusukey/server/fisheye-2.0.6/bin
sudo -u yusukey ./stop.sh
}
RestartService ()
{
ConsoleMessage "Restarting FishEye"
cd /Users/yusukey/server/fisheye-2.0.6/bin
sudo -u yusukey ./stop.sh
sudo -u yusukey ./start.sh
}
RunService "$1"
# vi StartupParameters.plist
Description = "fisheye";
Provides = ("fisheye");
Requires = ("DirectoryServices");
Uses = ("Disks");
OrderPreference = "None";
}
これで fisheye/StartupParameters.plist の2つのファイルを見て Mac OSX 起動時に勝手に FishEye を起動してくれるようになります。
コマンドラインから操作する際は
# SystemStarter start|stop|restart fisheye
でできます。
標準(エラー)出力は $FISHEYE_INST/var/log に記録されます。
10. robots.txt の設定
FishEye をセットアップしたことで、Google や Yahoo! にコードリポジトリそのものの索引を作ってもらう必要がなくなりましたので以下のように設定して検索対象からはずしました。
FishEye のコードは検索でヒットしても良いので Disallow に入れていません。
Disallow: /svn/
11. 完了
以上の設定で無事 FishEye をインストールできました。
・FishEye: browsing yusuke.homeip.net/
関連記事:
・Jira 3.13.1 へ FishEye プラグイン 2.3 をインストール
・FishEye 1.6.3 のインストール - 侍ズム
・Jira をバージョン 3.13.1 へアップデート
・Jira をバージョン 3.12.3 へアップデート