k4200’s notes and thoughts

Programmer side of k4200

検索エンジンを作る(予定)その1 〜 Nutch + HBaseのクローラーを動かす

その2はこちら。

目的

個人的に興味があって、ある領域に特化した検索エンジンみたいなのを作ろうとしている。

当面の目的としては、以下のような事をやる。

  • 対象のサイト(ある領域に関連するサイト)をクロールして保存
  • クロールしたページから必要なデータを抜き出して、DB(必ずしもRDBMSとは限らない)を作成し、以下のような検索が出来るようにする
    • カテゴリ等をドリルダウンして、対象ページを絞る
    • キーワード検索

今回はNutchとHBaseのインストール、実行くらいまで書く予定。

アーキテクチャ

ちょっと調べて、以下のようにする事にした。

  • クローラーにはApache Nutcheを使う
  • 取得したページを、自作のプログラムでパースして、カテゴリー等に分類
  • 取得したページをSolrに渡して、全文検索出来るようにする

環境

VPSを使っているけど、メモリが1Gだと動作しなかった。2Gだと大丈夫。

インストール

HBase

Nutch 2.1は、今のところHBase 0.90系じゃないと動かないので、0.90.6を使用。

インストールはこの辺を参考に。特にはまるポイントはないと思う。

自分は、何となくhbase専用のユーザーを作成して、その権限で動かしているけど、皆がどうしてるかは不明。

2013/2/6 追記:以下2点を変更。

  • CDHを使うようにした
  • デフォルトだとHBaseをスタンドアローンモードで動かすけど、それを分散モードに移行した
Nutch

Nutchに関してはこちらのチュートリアルに従った。

こちらもそんなに難しいところはないけど、若干不親切なところがあるので、いくつか補足しつつ説明。

まずは conf/nutch-site.xml を修正。自分の所は以下の様な感じ。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>storage.data.store.class</name>
    <value>org.apache.gora.hbase.store.HBaseStore</value>
    <description>Default class for storing data</description>
  </property>
</configuration>

次に、ivy/ivy.xml を修正。変更点は、コメントアウトされている以下の行を有効化するだけ。

     <dependency org="org.apache.gora" name="gora-hbase" rev="0.2.1" conf="*->default" />

後は、conf/gora.properties を修正。こちらのファイルは大きいので、diffを以下に示す。

[nutch@v157-7-129-204 apache-nutch-2.1]$ diff -u conf/gora.properties.bak conf/gora.properties
--- conf/gora.properties.bak    2013-01-02 12:10:08.210231483 +0900
+++ conf/gora.properties        2013-01-02 12:11:08.148910033 +0900
@@ -13,8 +13,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+gora.datastore.default=org.apache.gora.hbase.store.HBaseStore
 #gora.datastore.default=org.apache.gora.mock.store.MockDataStore
-#gora.datastore.autocreateschema=true
+gora.datastore.autocreateschema=true
 
 ###############################
 # Default SqlStore properties #

これで準備完了。

あとは ant を実行すると、runtime/local 以下に色々ファイルが作成される。

Nutchの設定

あともうちょい。

seedの設定

Nutchは、seedに書かれているURLを最初に取りに行って、そこからリンクを貼られているサイトを順々に取っていく、という感じの仕組みになっている。

runtime/local/urls というディレクトリを作成して(名前はurlsじゃなくても良さそうだけど、変える理由もないので)、その下に seed.txt というファイルを作成する。seed.txt は以下の通り、クロールの起点となるサイトのURLを書く。多分、1行1URLで複数書いても良いはず。

http://d.hatena.ne.jp/k4200/

これでとりあえずは動く状態になったんだけど、いくつか設定変更等を実施する。

file.content.limit の値を増やす

クローラーが取ってくるHTMLのサイズがこの値より大きい場合には切り詰められてしまう。デフォルトだと64KBで問題無さそうだが、UTF-8の文字列の場合、アルファベット以外は \uxxxx という風にエンコードされるため、実際のファイルサイズが30KB程度でも、保存する時には64KBを超えてしまう。

ということで、runtime/local/conf/nutch-site.xml に以下の記述を追加する(256KBにしているが、これより大きくしたい場合は適宜値を変更する)。

  <property>
    <name>http.content.limit</name>
    <value>262144</value>
  </property>
</configuration>

実行

以下の通り実行すると、クロールが始まるはず。

$ cd runtime/local
$ bin/nutch crawl

うあたあー。

まとめ

上の手順を見れば分かる通り、分かってしまえば動かすのは難しくないけど、情報が少ないのでハマると大変。NutchのMLは、質問するとすぐ返信が返ってくる親切でいい感じ。

次回は、今回説明していない細かい設定項目か、取得したデータの利用とかについて書こうかと。

その2はこちら。