ApacheSolrが出回り検索エンジンを作るための本なども数多く出版され
検索エンジンがだいぶ手頃に構築できるようになりました。
今回はApacheNutch2系の構築を書くのですが理由としては、ApacheNutch2のドキュメントが少ない!という事からでした。
さっそく構築に入っていきます。
今回使用するミドルウェアは、コンテンツ保存用にHBase+HDFS、検索用にElasticsearchとしました。
理由としては、そのうち分散していくのに楽そうな構成だったからです。
まずはコンテンツ保存用のHDFSからインストールしていきます。
JDK1.8以上をインストール。今回は専用サーバなのでprofileに書いちゃいます。
1 2 3 |
# yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 java-1.8.0-openjdk-headless.x86_64 # echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk' >> /etc/profile # source /etc/profile |
clouderaからインストールします。
1 2 |
# rpm --import http://archive.cloudera.com/cdh5/redhat/7/x86_64/cdh/RPM-GPG-KEY-cloudera # rpm -ivh http://archive.cloudera.com/cdh5/one-click-install/redhat/7/x86_64/cloudera-cdh-5-0.x86_64.rpm |
HadoopごとInstallしないとNutchがエラーを吐いてしまいます。
1 |
# yum install hadoop-0.20-conf-pseudo |
初期化しておかないとHDFSに怒られるのでHadoopNameSpaceを作りましょう。
1 2 |
# su -- hdfs # hdfs namenode -format |
Hadoopを起動してみます。
1 2 3 |
# service hadoop-hdfs-namenode start # service hadoop-hdfs-datanode start # service hadoop-hdfs-secondarynamenode start |
HDFS上にMapReduce用のディレクトリを作っておきましょう。
1 2 3 |
# sudo -u hdfs hadoop fs -mkdir -p /var/lib/hadoop-hdfs/cache/mapred/mapred/staging # sudo -u hdfs hadoop fs -chmod 1777 /var/lib/hadoop-hdfs/cache/mapred/mapred/staging # sudo -u hdfs hadoop fs -chown -R mapred /var/lib/hadoop-hdfs/cache/mapred |
MapReduceを実行するユーザのディレクトリ作成。
1 2 3 |
# useradd mapreduceuser # sudo -u hdfs hadoop fs -mkdir -p /user/mapreduceuser # sudo -u hdfs hadoop fs -chown mapreduceuser /user/mapreduceuser |
NutchはMapReduceでJobを追加するのでMapReduce関連のプロセス起動。
1 2 |
# service hadoop-0.20-mapreduce-jobtracker start # service hadoop-0.20-mapreduce-tasktracker start |
これでHDFS回りは完了です。
org.apache.hadoop.hdfs.server.namenode.NameNode
org.apache.hadoop.hdfs.server.datanode.DataNode
org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
org.apache.hadoop.mapred.JobTracker
org.apache.hadoop.mapred.TaskTracker
の5つのプロセスが動いていれば問題ないです。
次にHBaseをインストールします。
HBaseを使ってみた感じとしてはHBaseでバックアップを取得しておけば、HadoopのNamespace回りに影響を受けないので安心できるというあたりでしょうか。
1 2 3 4 |
# yum install hbase-master.x86_64 hbase-regionserver.x86_64 hbase-rest.x86_64 hbase-thrift.x86_64 zookeeper-server # mkdir -p /var/lib/zookeeper # chown -R zookeeper /var/lib/zookeeper/ # service zookeeper-server init |
HBaseはZookeeperを使うので、Zookeeperの初期化まで行っておきます。
さっそく起動しましょう。
1 2 3 4 |
service zookeeper-server start service hbase-master start service hbase-regionserver start service hbase-thrift start |
これだけでHBaseは完成です。
org.apache.hadoop.hbase.master.HMaster
org.apache.hadoop.hbase.regionserver.HRegionServer
org.apache.hadoop.hbase.thrift.ThriftServer
rg.apache.zookeeper.server.quorum.QuorumPeerMain
の4つのプロセスが動いていれば問題ないです。
念のためHbaseでテーブル追加&削除をテストします。
1 2 3 4 5 6 7 8 9 10 11 12 |
# hbase shell > list > create 'test', 'cf' > list 'test' > put 'test', 'row1', 'cf:a', 'value1' > put 'test', 'row2', 'cf:b', 'value2' > put 'test', 'row3', 'cf:c', 'value3' > scan 'test' > get 'test', 'row1' > enable 'test' > disable 'test' > drop 'test' |
エラーが出なければ問題ないです。
次にElasticsearchをインストールします。
Repoファイルを登録します。今回は1.7系を使います。
1 |
vi /etc/yum.repos.d/elasticsearch.repo |
1 2 3 4 5 |
[elasticsearch-1.7] name=Elasticsearch repository for 1.7.x packages baseurl=http://packages.elasticsearch.org/elasticsearch/1.7/centos gpgcheck=1 gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch |
1 2 |
# yum install elasticsearch # cd /usr/share/elasticsearch |
日本語ようにKuromojiも使います。
1 |
# bin/plugin install elasticsearch/elasticsearch-analysis-kuromoji/2.7.0 |
設定を変えます。cluster.nameはNutchの方の設定でも使用します。
1 |
# vi /etc/elasticsearch/elasticsearch.yml |
1 2 3 4 5 |
cluster.name: nutch node.name: "Nutch Indexer" index.analysis.analyzer.default.type: custom index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer |
1 |
# /etc/rc.d/init.d/elasticsearch start |
org.elasticsearch.bootstrap.Elasticsearch
が起動していれば問題ないです。
やっとNutchのインストールが始まります。
まずAntを使うのでインストールします。
1 2 3 4 |
# cd /usr/loca/src # curl -LO http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/ant/binaries/apache-ant-1.9.6-bin.tar.gz # tar zxvf apache-ant-1.9.6-bin.tar.gz # mv apache-ant-1.9.6 /usr/local/ant |
Profileに登録します。
1 |
# vi /etc/profile.d/ant.sh |
1 2 |
ANT_HOME=/usr/local/ant export PATH=$PATH:$ANT_HOME/bin |
1 |
# source /etc/profile |
次にNutchです。
1 2 3 4 5 6 7 8 9 10 |
# cd /usr/local/src # curl -LO http://ftp.meisei-u.ac.jp/mirror/apache/dist/nutch/2.3.1/apache-nutch-2.3.1-src.tar.gz # tar -zxvf apache-nutch-2.3.1-src.tar.gz # mv apache-nutch-2.3.1 /usr/local/nutch # cd /usr/local/nutch # vi conf/nutch-site.xml # vi ivy/ivy.xml # vi conf/gora.properties # vi src/plugin/indexer-elastic/ivy.xml # ant runtime |
設定ファイルが多いので各ファイルは記事の下の方に書きました。
antでできた中身をいじりましょう。
Goraとかivyファイルの設定で解決できそうなのですが、いまいちわからなかったのでJavaライブラリをHadoopとHBaseからコピーします。
1 2 3 4 5 |
# cd /usr/local/nutch/runtime/local # cp /usr/lib/hbase/lib/hbase-* ./lib/ # cp /usr/lib/hbase/lib/metrics-core-2.2.0.jar ./lib/ # cp /usr/lib/hadoop/lib/native/* ./lib/native/ # cp /usr/lib/hbase/lib/htrace-* ./lib |
Nutchのテストをしてみましょう。
Urlを登録します。
1 2 3 4 5 |
# cd /usr/local/nutch/runtime/local # mkdir seed # echo "http://www.yahoo.co.jp" >> seed/urls.txt # echo "http://www.google.co.jp" >> seed/urls.txt # ./bin/nutch inject seed/ |
クローリングするUrlをスコアが高い順に10件登録します。
1 |
./bin/nutch generate -topN 10 |
クローリングします。
1 |
/bin/nutch fetch -all |
HTMLをパースします。
1 |
/bin/nutch parse -all |
パースされた結果からリンクなどを抽出してHBaseを更新します。
1 |
./bin/nutch updatedb -all |
Elasticsearchに検索用のインデックスを作成します。
1 2 |
./bin/nutch index elasticsearch -all ./bin/nutch index -all |
Elasticsearchで検索してみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
curl -XGET 'http://localhost:9200/nutch/_search?pretty=true' -d ' { "query" : { "simple_query_string" : { "fields": ["anchor","title","content"], "query": "yahoo", "default_operator": "and" } }, "size" : 10 }' |
Yahooのページが出てきたと思います。
ブログを書いてみた感じなぜNutchのドキュメントがあまり出ないかがわかってきました。
- Hadoop+HBase+Elasticsearch(Solr)の構築を知らないとNutchにたどり着けないという敷居の高さ。
- Nutch公式では一昔前のHadoopとHBaseしか使えないので、ライブラリコピーをしないとClouderaのrepoが使えない点。
の2つが大きいと思います。
Nutch1系であればHbase含むパッケージがあるので気軽なのですが、Nutch2は結構ハードルが高いと思いました。
以上で構築は完了となります。
最後に設定ファイル系を載せます。
# vi /usr/local/nutch/conf/nutch-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>storage.data.store.class</name> <value>org.apache.gora.hbase.store.HBaseStore</value> <description>Default class for storing data</description> </property> <property> <name>http.agent.name</name> <value>Nutch</value> </property> <property> <name>http.robots.agents</name> <value>Nutch</value> </property> <property> <name>plugin.includes</name> <!-- do **NOT** enable the parse-html plugin, if you want proper HTML parsing. Use something like parse-tika! --> </property> <property> <name>elastic.cluster</name> <value>nutch</value> </property> <property> <name>elastic.host</name> <value>localhost</value> </property> <property> <name>elastic.port</name> <value>9300</value> </property> <property> <name>elastic.index</name> <value>nutch</value> </property> </configuration> |
# vi /usr/local/nutch/ivy/ivy.xml
※長いので追加部分のみ
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<dependency org="org.apache.hadoop" name="hadoop-common" rev="2.6.0" conf="*->default"> <exclude org="hsqldb" name="hsqldb" /> <exclude org="net.sf.kosmosfs" name="kfs" /> <exclude org="net.java.dev.jets3t" name="jets3t" /> <exclude org="org.eclipse.jdt" name="core" /> <exclude org="org.mortbay.jetty" name="jsp-*" /> <exclude org="ant" name="ant" /> </dependency> <dependency org="org.apache.hadoop" name="hadoop-hdfs" rev="2.6.0" conf="*->default"/> <dependency org="org.apache.hadoop" name="hadoop-mapreduce-client-core" rev="2.6.0" conf="*->default"/> <dependency org="org.apache.hadoop" name="hadoop-mapreduce-client-jobclient" rev="2.6.0" conf="*->default"/> <dependency org="org.apache.gora" name="gora-hbase" rev="0.6.1" conf="*->default" /> <dependency org="org.elasticsearch" name="elasticsearch" rev="1.7.4"/> |
# vi /usr/local/nutch/conf/gora.properties
※長いので追加部分のみ
1 2 |
gora.datastore.default=org.apache.gora.hbase.store.HBaseStore gora.datastore.autocreateschema=true |
# vi /usr/local/nutch/src/plugin/indexer-elastic/ivy.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?xml version="1.0" ?> <ivy-module version="1.0"> <info organisation="org.apache.nutch" module="${ant.project.name}"> <license name="Apache 2.0" /> <ivyauthor name="Apache Nutch Team" url="http://nutch.apache.org" /> <description>Apache Nutch</description> </info> <configurations> <include file="../../..//ivy/ivy-configurations.xml" /> </configurations> <publications> <!--get the artifact from our module name --> <artifact conf="master" /> </publications> <dependencies> <dependency org="org.elasticsearch" name="elasticsearch" rev="1.7.4" conf="*->default" /> </dependencies> </ivy-module> |