Tag Archives: Hypertable

創聖合体「Hypertable」「Hadoop」が完了した

HypertableとHadoopを合体させたくてここまできた。

やっと合体が成功したように見えるので作業報告する。



今回、HypertableとHadoopをインストールしていることが前提で書く。

インストール環境はこんな感じ。

 Hypertableインストールディレクトリ:/home/hadoop/hypertable
 Hadoopインストールディレクトリ:/home/hadoop/hadoop/hadoop-0.15.3
 Master : 192.168.0.5
 Slave  : 192.168.0.8
          192.168.0.10
 作業は全て192.168.0.5(Master)で行なう



さて、「UpAndRunningWithHadoop」を見つつ解説していく。



■Hadoopを起動

一番最初から行なうので、まずnamenodeをリセットする。

 # ./bin/hadoop namenode -format
 08/02/20 22:09:12 INFO dfs.NameNode: STARTUP_MSG:
 /************************************************************
 STARTUP_MSG: Starting NameNode
 STARTUP_MSG:   host = 192.168.0.5/127.0.0.1
 STARTUP_MSG:   args = [-format]
 ************************************************************/
 08/02/20 22:09:12 INFO dfs.Storage: Storage directory /home/hadoop/hadoop/files...
 08/02/20 22:09:12 INFO dfs.NameNode: SHUTDOWN_MSG:
 /************************************************************
 SHUTDOWN_MSG: Shutting down NameNode at 192.168.0.5/127.0.0.1
 ************************************************************/



Hadoopを起動する。たぶんstart-all.shじゃなくてもいいんだが、

もう失敗したくないので。

 # ./bin/start-all.sh
 starting namenode, logging to /home/hadoop/hadoop/hadoop-0.15.3/bin/../logs/hadoo...
 192.168.0.10: starting datanode, logging to /home/hadoop/hadoop/hadoop-0.15.3/bin...
 localhost: starting datanode, logging to /home/hadoop/hadoop/hadoop-0.15.3/bin/.....
 192.168.0.8: starting datanode, logging to /home/hadoop/hadoop/hadoop-0.15.3/bin/...
 localhost: starting secondarynamenode, logging to /home/hadoop/hadoop/hadoop-0.15...
 starting jobtracker, logging to /home/hadoop/hadoop/hadoop-0.15.3/bin/../logs/had...
 192.168.0.10: starting tasktracker, logging to /home/hadoop/hadoop/hadoop-0.15.3/...
 localhost: starting tasktracker, logging to /home/hadoop/hadoop/hadoop-0.15.3/bin...
 192.168.0.8: starting tasktracker, logging to /home/hadoop/hadoop/hadoop-0.15.3/b...



■ディスクをマウント

「UpAndRunningWithHadoop」には「Step 2」でmountを行なえと書いてあるが、

Hypertableのインストール時にすでに行なったのでやらない。



■Hypertableの設定

Hadoopのマスターとつなげるための設定を行なう。

 # cd /home/hadoop/hypertable
 # vi ./conf/hypertable.cfg

私の場合は、HadoopのマスターとHypertableが同じサーバ上に存在するので、

以下のように設定する。

 HdfsBroker.fs.default.name=hdfs://localhost:9000
 Hyperspace.Master.Host=localhost
 Hypertable.Master.Host=localhost
 ※ポート番号の9000は、{HADOOP_HOME}/conf/hadoop-site.xmlのfs.default.nameと同じにするっぽい



■Hypertableの起動

あとは起動するだけ・・・と思っていたが、またもやエラー発生。

 # cd /home/hadoop/hypertable
 # ./bin/start-master.sh hadoop
 DfsBroker (hadoop) hasn't come up yet, trying again in 5 seconds ...
 Num CPUs=2
 HdfsBroker.Port=38030
 HdfsBroker.Reactors=2
 HdfsBroker.Workers=20
 HdfsBroker.Server.fs.default.name=hdfs://localhost:9000
 org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.dfs.ClientProtocol
 version mismatch. (client = 14, server = 20)
         at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:253)
         at org.apache.hadoop.dfs.DFSClient.createNamenode(DFSClient.java:141)
         at org.apache.hadoop.dfs.DFSClient.<init>(DFSClient.java:153)
         at org.apache.hadoop.dfs.DistributedFileSystem.initialize(DistributedFileSystem.java:66)
         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:159)
         at org.apache.hadoop.fs.FileSystem.getNamed(FileSystem.java:118)
         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:90)
         at org.hypertable.DfsBroker.hadoop.HdfsBroker.<init>(HdfsBroker.java:71)
         at org.hypertable.DfsBroker.hadoop.main.main(main.java:136)



バージョンが違うって。調べてみた。

 # ls -al /home/hadoop/hypertable/java/lib/
 -rw-r--r--  1 hadoop hadoop   38015  2月 14 22:33 commons-logging-1.0.4.jar
 -rw-rw-r--  1 hadoop hadoop 1449150  2月 20 22:53 hadoop-0.14.4-core.jar
 -rw-r--r--  1 hadoop hadoop   99995  2月 14 22:33 hypertable-0.9.0.jar
 -rw-r--r--  1 hadoop hadoop  106547  2月 14 22:33 junit-4.3.1.jar
 -rw-r--r--  1 hadoop hadoop  358180  2月 14 22:33 log4j-1.2.13.jar

HypertableはHadoopを呼び出す際に上記の「hadoop-0.14.4-core.jar」を使用して

Hadoopと連携するようだ。

そんで私がインストールしたHadoopのバージョンを調べてみた。

 # ls -al /home/hadoop/hadoop/hadoop-0.15.3/
 -rw-rw-r--   1 hadoop hadoop 1449150  1月 16 08:53 hadoop-0.15.3-core.jar
 -rw-rw-r--   1 hadoop hadoop   79006  1月 16 07:58 hadoop-0.15.3-examples.jar
 -rw-rw-r--   1 hadoop hadoop  495029  1月 16 08:53 hadoop-0.15.3-test.jar

HypertableはHadoop0.14.4を呼び出そうとしているが、

私がインストールしたHadoopは0.15.3だったためにこのエラーが発生したようだ。

というわけで、Hypertableに存在する「hadoop-0.14.4-core.jar」を

「hadoop-0.15.3-core.jar」に入れ替える必要がある。

 # rm /home/hadoop/hypertable/java/lib/hadoop-0.14.4-core.jar
 # cp /home/hadoop/hadoop/hadoop-0.15.3/hadoop-0.15.3-core.jar /home/hadoop/hypertable/java/lib/

それでは再度Hypertableを起動。

 # cd /home/hadoop/hypertable/
 # ./bin/start-master.sh hadoop
 Successfully started DFSBroker (hadoop)
 Successfully started Hyperspace
 Successfully started Hypertable.Master

やっと成功した。プロセスはこんな感じ。

 # ps -aux
 hadoop   22543  0.0  1.5 1253228 32060 pts/2 Sl   22:09   0:04 /usr/java/j2sdk/bin/java -Xmx1000m -Dhadoop.l...
 hadoop   22644  0.0  1.4 1246144 29580 ?     Sl   22:09   0:02 /usr/java/j2sdk/bin/java -Xmx1000m -Dhadoop.l...
 hadoop   22755  0.0  1.4 1245048 29624 ?     Sl   22:09   0:01 /usr/java/j2sdk/bin/java -Xmx1000m -Dhadoop.l...
 hadoop   22825  0.0  1.4 1253656 30232 pts/2 Sl   22:09   0:02 /usr/java/j2sdk/bin/java -Xmx1000m -Dhadoop.l...
 hadoop   22937  0.0  1.4 1247140 28972 ?     Sl   22:09   0:02 /usr/java/j2sdk/bin/java -Xmx1000m -Dhadoop.l...
 hadoop   27310  0.0  1.0 252580 21512 pts/2  Sl   22:53   0:00 java -Xdebug -classpath /home/hadoop/hypertab...
 hadoop   27358  0.0  0.1 239916 2308 pts/2   Sl   22:54   0:00 /home/hadoop/hypertable/bin/Hyperspace.Master...
 hadoop   27393  0.0  0.1 253764 3064 pts/2   Sl   22:54   0:00 /home/hadoop/hypertable/bin/Hypertable.Master...

成功したから良かったし、Javaやってるから良かったけど、

こんなもん互換性とっとけよ。わかんねぇよ。



■スレーブ(slave)を起動

必須項目ではないのかと思っていたら、これも必須の設定項目。

マニュアルでは「# cat conf/slaves」と書かれているが、

Hypertableにはそんなファイルが無い。だから作成する。

 # cd /home/hadoop/hypertable/conf
 # vi slaves

Hypertableの本体は、今回1台のみなので「localhost」と入力する。

 localhost

複数のサーバにHypertableのパッケージを置いて、SELECTなどを分散させる場合は

その他サーバIPを入力する。(1行1IPで記述)



ではスレーブを起動する。

 # cd /home/hadoop/hypertable
 # ./bin/slaves.sh /home/hadoop/hypertable/bin/start-range-server.sh hadoop
 localhost: Successfully started Hypertable.RangeServer



■Hypertableに接続、そして触る

HQLTutorial」に書いてあるSQLを

試してみたら、ちゃんと動いた。

 # ./bin/hypertable
 Welcome to the HQL command interpreter.

 Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 hypertable> create table Pages ( date, "refer-url", "http-code");
 hypertable> show create table Pages;

 CREATE TABLE Pages (
   'refer-url',
   'http-code',
   date,
   ACCESS GROUP default ( 'refer-url', 'http-code', date )
 )

ちなみに前項のSlave設定を行なわないと以下のエラーが発生するので、

スレーブは絶対に設定すること!これ重要。

 hypertable> create table Pages ( date, "refer-url", "http-code");
 1203526316 INFO hypertable : (/home/hadoop/src/hypertable/src/cc/AsyncComm/ConnectionManager.cc:257)
 Event: type=DISCONNECT from=127.0.0.1:38050; Problem connecting to Master, will retry in 15 seconds...
 1203526331 INFO hypertable : (/home/hadoop/src/hypertable/src/cc/AsyncComm/ConnectionManager.cc:257)
 Event: type=DISCONNECT "COMM connect error" from=127.0.0.1:38050; Problem connecting to Master, will retry in 15 seconds...



■最後に

HypertableとHadoopを合体させたくここまできた。

そして合体できたっぽい。

残っているタスクをあげると、「確認」と「検証」だ。

成功しているっぽいけど、本当にHypertableとHadoopは合体しているのか?

Hadoopによってデータが分散されているのか?

INSERT,SELECT,UPDATEなどSQL速度は?何とどう比較する?

サーバ3台程度であったら検証にならない?



・・・面倒くせぇ。

「Hypertable」をインストールしてみた。Hadoopと合体させたい

GigazineでHypertableの記事があったので、

本家のサイトを見ていると「Up and Running with Hadoop」という文字が!

気になるのでHypertableをインストールしてみた。

一応、HowToInstallを見ればインストールできるのだが、

やはり英語なので日本語で解説する。



■環境

インストール先:/home/hadoop/hypertable



■Hypertableをインストールする前に

あらかじめ以下の6つのソフトウェアをインストールする必要がある。

6つのインストール作業は全てrootユーザーで行なう。

1.cmake-2.4.8.tar.gz(http://www.cmake.org/)

2.boost_1_34_1.tar.gz(http://www.boost.org/)

3.log4cpp-1.0.tar.gz(http://log4cpp.sourceforge.net/)

4.expat-2.0.1.tar.gz(http://sourceforge.net/projects/expat)

5.google-perftools-0.94.1.tar.gz(http://code.google.com/p/google-perftools/)

6.git-1.5.4.tar.gz(http://git.or.cz/)


$ wget パッケージ
$ tar -xvzf パッケージ.tar.gz
$ cd パッケージ/
$ ./configure
$ make
$ make install



■Hypertableのインストール

これからインストールを行なう。

私の場合はhadoopというユーザーで処理を行なう。

$ su - hadoop
$ mkdir ~/src
$ cd ~/src
$ git clone git://scm.hypertable.org/pub/repos/hypertable.git
$ mkdir ~/hypertable
$ mkdir -p ~/build/hypertable
$ cd ~/build/hypertable
$ cmake -DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE="Debug" ~/src/hypertable

さて、ここまでで正常に動いている人は、その後勝手にしてもらってよい。

私の場合、cmakeの時点でエラーが発生し、インストールできない事態になった。



結論からいうと、「gccのバージョンが3.4だったから」っぽい。

詳細は次項で。



■cmake時にエラー発生

前項で行なったcmake時に以下のようなエラーが発生した。

Boost thread library was not found

cmakeは指定したディレクトリ以下のソースをコンパイルする的な話らしいが、

それがうまくいかなかった。

エラーの通り「Boost thread」が無いとのこと。



どの辺でエラーがでているのか確認する。

vi /home/hadoop/src/hypertable/cmake/FindBoost.cmake

先ほどのエラー文「Boost thread library…」を検索する。

するとIF文が14通りくらい存在し、どうにかしてlibboost_threadを

探そうとしているようだ。

ちなみに「${Boost_LIBRARY_DIR}」を出力してみたが「/usr/local/lib」となっていた。

で、viは閉じてlibboost_threadがどこに存在するかを確認する。

$ locate libboost_thread
/usr/local/lib/libboost_thread-gcc34-mt-1_34_1.a
/usr/local/lib/libboost_thread-gcc34-mt.a
/usr/local/lib/libboost_thread-gcc34-mt-1_34_1.so
/usr/local/lib/libboost_thread-gcc34-mt-d-1_34_1.so.1.34.1
/usr/local/lib/libboost_thread-gcc34-mt-d.so
/usr/local/lib/libboost_thread-gcc34-mt-d-1_34_1.a
/usr/local/lib/libboost_thread-gcc34-mt-1_34_1.so.1.34.1
/usr/local/lib/libboost_thread-gcc34-mt-d-1_34_1.so
/usr/local/lib/libboost_thread-gcc34-mt.so
/usr/local/lib/libboost_thread-gcc34-mt-d.a
/usr/lib/libboost_thread.so.1
/usr/lib/libboost_thread.a
/usr/lib/libboost_thread.so.1.32.0

14通りほどのIF文の先頭が一応「libboost_thread-mt.a」だったので、

それを優先して読み込ませるようにしたい。

だが「libboost_thread-mt.a」が存在しない。

多分「libboost_thread-gcc34-mt.a」が「libboost_thread-mt.a」に相当するものっぽいので、

シンボリックリンクでごまかす。

$ su -
$ ln -s /usr/local/lib/libboost_thread-gcc34-mt.a /usr/local/lib/libboost_thread-mt.a
$ ln -s /usr/local/lib/libboost_thread-gcc34-mt.so /usr/local/lib/libboost_thread-mt.so
※2つシンボリックリンクをつける必要はないのだが、失敗したくないので。



再度、cmakeを行なう・・・うまくいった。

では、次の段階makeを行なう。

$ make

違うエラーが発生した。エラーを見ると以下が駄目っぽい。

-Wno-variadic-macros

それならオプション部分を除去しちゃう。

$ vi /home/hadoop/src/hypertable/CMakeLists.txt

この中から以下の部分を探す。(29行目あたり)

修正前:add_definitions(-Wall -pedantic -Wno-long-long -Wno-variadic-macros)
修正後:add_definitions(-Wall -pedantic -Wno-long-long)

これで再度cmakeから実行。

$ cd ~/build/hypertable
$ rm ./* ←※前回cmakeを行なった時のファイルが残っているので消去する
$ cmake -DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE="Debug" ~/src/hypertable

はい、成功。

$ make
$ make install DESTDIR=/home/hadoop/hypertable

はい、成功。



■よくわかんねぇけどマウント設定

Hypertableのインストールがやっと終わったのに、

なんだかmountを行なわなくてはいけない?

これを行なうことでどうなるかは知ったことではないが、ここまできたら行くところまで行く。

インストールしたディレクトリのmountを行なう。

私の場合は/home/hadoop/hypertableにインストールしたので、

「/」以下がmount対象となるのかな?

$ vi /etc/fstab

該当するパスにuser_xattrを追加する。

修正前:LABEL=/	/	ext3	defaults	1	1
修正後:LABEL=/	/	ext3	defaults,user_xattr	1	1

マウント実行。

$ mount -o remount /

何も出力されないからうまくいったっぽい。



■最後にHypertable起動

やっとここまできた。

Hypertableを起動しちゃう。

$ su - hadoop
$ cd ~/hypertable
$ bin/kill-servers.sh
$ bin/start-all-servers.sh local



というわけで結果的にgccのバージョン4以降にアップグレードした方がいいかも。

以上、疲れた。