CLOVER🍀

That was when it all began.

CDH 4.5 tarballを使って、疑似分散モードのHadoopとHBase環境を作る

久々のHBaseネタ。以前簡単に試してそのままでしたが、もう少し触ってみたいなぁと思いまして。ただ、Cassandraとどっちを頑張るかは未だ悩み中…。

とりあえず、環境を作ってみるかなぁということで。

去年、1度Apache配布のバイナリから環境を作っています。

Apache HBaseことはじめ
http://d.hatena.ne.jp/Kazuhira/20130902/1378130405

Apache Hadoopをインストールする
http://d.hatena.ne.jp/Kazuhira/20130904/1378307097

擬似分散環境のHDFS上で、HBaseを使用する
http://d.hatena.ne.jp/Kazuhira/20130906/1378479769

前に作った環境は、Ubuntuをダウングレードした時に消失しました…。

今回は、CDHのtarballを使用して環境を作りたいと思います。個人的な好みから、RPMなどではなく、あくまでtarballです。

CDH Packaging and Tarball Information
http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH-Version-and-Packaging-Information/cdhvd_topic_3.html

上記URLから、HadoopとHBaseのtarballをダウンロードしました。バージョンは、CDH 4.5(CDH 5はまだベーダだし…)です。

インストール方法は、以下の書籍を参考にやろうと思ったのですが、

Hadoopオペレーション ―システム運用管理ガイド

Hadoopオペレーション ―システム運用管理ガイド

あんまりうまくいかず、結局以前の手順とその時にも見た以下の書籍を参考にしました。
Hadoop徹底入門 第2版 オープンソース分散処理環境の構築

Hadoop徹底入門 第2版 オープンソース分散処理環境の構築

まあ、仕方がありません。今回構築するのは、自分の仮想マシン1台上を対象とするので、Hadoop(疑似分散モード)とその上で動くHBaseです。

Map Reduce Framework(v1、YARNは問わず)は、とりあえず使用しないことにします。前回YARNの環境を作ってみましたが、圧倒的にリソースが足りなくて動作しなかったことと、やりたいことはHBaseを動かすことなのでとりあえずいいかなぁ、と。

疑似分散モードのHadoop(CDH 4.5 tarball)をインストールする

アーカイブの展開とディレクトリの作成

インストール先ディレクトリは、以下を基点とします。

/usr/local/apache-hadoop

まずは、ディレクトリ作成とアーカイブの展開。

$ cd /usr/local/
$ sudo mkdir apache-hadoop
$ cd apache-hadoop/
$ sudo cp [CDH 4.5 Hadoopのダウンロードディレクトリ]/hadoop-2.0.0-cdh4.5.0.tar.gz ./.
$ sudo tar -zxvf hadoop-2.0.0-cdh4.5.0.tar.gz
$ sudo rm hadoop-2.0.0-cdh4.5.0.tar.gz
$ sudo chown -R [Hadoopの起動ユーザ].[Hadoopの起動ユーザ] hadoop-2.0.0-cdh4.5.0
$ sudo ln -s hadoop-2.0.0-cdh4.5.0 current

個人的な趣味で、現在のバージョンには「current」と付与しています。あと、所詮1台なので専用ユーザの作成なども考慮しません。

続いて、NameNodeとDataNode用のディレクトリ、tmpディレクトリを作成します。

$ sudo mkdir -p dfs/data dfs/name
$ sudo mkdir tmp
$ sudo chown -R [Hadoopの起動ユーザ].[Hadoopの起動ユーザ] dfs tmp

あとは、.bashrcに以下を追加して

export PATH=/usr/local/apache-hadoop/current/bin:${PATH}
export PATH=/usr/local/apache-hadoop/current/sbin:${PATH}

再評価。

$ . ~/.bashrc

はい。

それにしても、Map Reduce Frameworkのv1系は、あんまり使って欲しくないみたいですね。ディレクトリがほぼ分離されていて、YARNを使って欲しいような構成になっていたように思います。YARNはもともとやめておこうと思っていたところに、こういう光景を見てしまったのが、今回Map Reduce Frameworkを使わないことを決めた理由でもあったrします。

まあ、必要なら後で追加しましょうかと。

設定

設定は、冒頭の書籍の話と、Clouderaからの以下のページから辿れる
Viewing the Apache Hadoop Documentation
http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation-Guide/cdh4ig_topic_4_6.html

Hadoopアーカイブページを参考にしました。

Cluster Setup
http://archive.cloudera.com/cdh4/cdh/4/hadoop/hadoop-project-dist/hadoop-common/ClusterSetup.html

前回設定した時に、激しく見た覚えがあります。

以下、変更した設定です。
hadoop-2.0.0-cdh4.5.0/etc/hadoop/core-site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost</value>
  </property>

  <!-- OOZIE proxy user setting -->
  <property>
    <name>hadoop.proxyuser.oozie.hosts</name>
    <value>*</value>
  </property>
  <property>
    <name>hadoop.proxyuser.oozie.groups</name>
    <value>*</value>
  </property>
</configuration>

付属の疑似分散モードのサンプルを見ながら、こんな感じに。OOZIE proxyって要らんのじゃない?って気もしますが…。

hadoop-2.0.0-cdh4.5.0/etc/hadoop/hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/apache-hadoop/tmp</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/usr/local/apache-hadoop/dfs/name</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/usr/local/apache-hadoop/dfs/data</value>
  </property>
</configuration>

先ほど作成したディレクトリを、各項目に指定しています。

NameNodeのフォーマット

HDFSを使い始める、最初の1回行います。[Hadoopインストールディレクトリ]/binにパスが通っていれば、以下のコマンドで。

$ hdfs namenode -format

ちゃんと、設定が効いていることも確認できます。

$ find dfs
dfs
dfs/data
dfs/name
dfs/name/current
dfs/name/current/fsimage_0000000000000000000
dfs/name/current/VERSION
dfs/name/current/seen_txid
dfs/name/current/fsimage_0000000000000000000.md5

各種デーモンの起動・停止

[Hadoopインストールディレクトリ]/sbinにパスが通っていれば、以下のコマンドで起動。

## NameNode
$ hadoop-daemon.sh start namenode
## DataNode
$ hadoop-daemon.sh start datanode
## Secondary NameNode
$ hadoop-daemon.sh start secondarynamenode

起動してますね?

$ jps
31235 DataNode
31311 SecondaryNameNode
31378 Jps
31175 NameNode

停止は、以下のコマンドです。

## Secondary NameNode
$ hadoop-daemon.sh stop secondarynamenode
## DataNode
$ hadoop-daemon.sh stop datanode
## NameNode
$ hadoop-daemon.sh stop namenode
少しだけ、動作確認

各種デーモンを起動した状態で

$ hdfs dfs -ls /
14/01/04 15:59:51 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

まあ、まだ何もないですけどね…。

HBase(CDH 4.5 tarball)をインストールする

アーカイブの展開とディレクトリの作成

インストール先ディレクトリは、以下を基点とします。

/usr/local/apache-hbase

ディレクトリの作成と、アーカイブの展開。

$ cd /usr/local/
$ sudo mkdir apache-hbase
$ cd apache-hbase/
$ sudo cp [CDH 4.5 HBaseのダウンロードディレクトリ]/hbase-0.94.6-cdh4.5.0.tar.gz ./.
$ sudo tar -zxvf hbase-0.94.6-cdh4.5.0.tar.gz
$ sudo rm hbase-0.94.6-cdh4.5.0.tar.gz
$ sudo chown -R [HBaseの起動ユーザ].[HBaseの起動ユーザ] hbase-0.94.6-cdh4.5.0
$ sudo ln -s hbase-0.94.6-cdh4.5.0 current

こちらも、個人的に「current」と別名付与。

.bashrcにパスを追加。

export HBASE_HOME=/usr/local/apache-hbase/current
export PATH=${HBASE_HOME}/bin:${PATH}

こっちは、環境変数も付けてしまいました。で、再評価。

$ . ~/.bashrc
設定

設定は、簡単にこれくらいです。
hbase-0.94.6-cdh4.5.0/conf/hbase-site.xml

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://localhost:8020/hbase</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <property>1</property>
  </property>
</configuration>

データは、HDFSの「/hbase」ディレクトリに保存されるようにしています。

デーモンの起動・停止

「$HBASE_HOME/bin」にパスが通っていれば、以下で起動。

$ start-hbase.sh

確認。
Hadoopは起動済みです

$ jps
31486 NameNode
32240 HMaster
31628 SecondaryNameNode
32424 Jps
31567 DataNode

HMasterが増えています。

停止。

$ stop-hbase.sh
動作確認

HBase Shellを使って動作確認。

$ hbase shell
14/01/04 16:14:24 WARN conf.Configuration: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.94.6-cdh4.5.0, r, Wed Nov 20 15:38:35 PST 2013

hbase(main):001:0> 

テーブル、カラムファミリの作成。

hbase(main):001:0> create 'test', 'cf'
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/apache-hbase/hbase-0.94.6-cdh4.5.0/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/apache-hadoop/hadoop-2.0.0-cdh4.5.0/share/hadoop/common/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
14/01/04 16:14:49 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
0 row(s) in 2.5870 seconds

=> Hbase::Table - test

テーブル一覧。

hbase(main):002:0> list 'test'
TABLE                                                                                                                
test                                                                                                                 
1 row(s) in 0.0650 seconds

データの登録。

hbase(main):003:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.0970 seconds

Scan。

hbase(main):004:0> scan 'test'
ROW                            COLUMN+CELL                                                                           
 row1                          column=cf:a, timestamp=1388819774607, value=value1                                    
1 row(s) in 0.0710 seconds

この時、HDFS上でデータが入っていることが確認できます。

$ hdfs dfs -ls /hbase
14/01/04 16:17:47 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 8 items
drwxr-xr-x   - xxxxx supergroup          0 2014-01-04 16:11 /hbase/-ROOT-
drwxr-xr-x   - xxxxx supergroup          0 2014-01-04 16:11 /hbase/.META.
drwxr-xr-x   - xxxxx supergroup          0 2014-01-04 16:13 /hbase/.logs
drwxr-xr-x   - xxxxx supergroup          0 2014-01-04 16:12 /hbase/.oldlogs
drwxr-xr-x   - xxxxx supergroup          0 2014-01-04 16:14 /hbase/.tmp
-rw-r--r--   3 xxxxx supergroup         38 2014-01-04 16:11 /hbase/hbase.id
-rw-r--r--   3 xxxxx supergroup          3 2014-01-04 16:11 /hbase/hbase.version
drwxr-xr-x   - xxxxx supergroup          0 2014-01-04 16:14 /hbase/test

テーブルの無効化。

hbase(main):005:0> disable 'test'
0 row(s) in 2.0910 seconds

テーブルの削除。

hbase(main):007:0> drop 'test'
0 row(s) in 1.1520 seconds

HBase Shellの終了。

hbase(main):008:0> exit

こんなところですね。