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台程度であったら検証にならない?
・・・面倒くせぇ。

