はじめに

HBase は、Google の BigTable をモデルとして作成された分散型列指向ストアです。HBase は、独自の MapReduce および分散ファイルシステムの実装を持った Hadoop を土台として構築されています。これらのプロジェクトはすべてオープンソースで、Apache Software Foundation のプロジェクトの一部になっています。

分散型の大規模プラットフォームである Hadoop プロジェクトと HBase プロジェクトは、主に *nix 環境をその実働環境として想定しています。ただし、Java で開発されていることもあって、どちらのプロジェクトもプラットフォーム間で完全な可搬性があり、したがって Windows オペレーティングシステムへの可搬性もあります。Hadoop プロジェクトと Hbase プロジェクトでは、開発を容易にするために、Cygwin を使って Windows 上に *nix ライクな環境を用意してシェルスクリプトを実行します。

目的

このドキュメントでは、オールインワンのシングルノード HBase をセットアップしてテストと開発に利用することを目的に、Cygwin を使って Windows 上で HBase を実行する手順とそれに付随するさまざまな問題点について説明します。より高度なデプロイを前提として HBase をセットアップする方法については、HBase の「概要」と「クイックスタートガイド」で説明しています。

インストール

Windows 上で HBase を実行するには、JavaCygwin、および SSH の 3 つの技術が必要です。以下では、これら 3 つの技術のそれぞれをインストールする方法について詳しく説明します。

Java

HBase は Java Platform, Standard Edition, 6 Release に依存しています。したがって、ターゲットシステムには、少なくとも Java Runtime Environment (JRE) をインストールする必要があります。ただし、ターゲットシステムを開発にも利用する場合には、Jave Development Kit (JDK) をインストールした方がよいでしょう。どちらの場合も、最新バージョンを Sun のダウンロードページからダウンロードできます。GUI の簡単なウィザードの指示にしたがって操作すればインストールは完了します。

Cygwin

Cygwin は、必要な 3 つの技術の中では最も特異な技術でしょう。Cygwin は、Windows 上で *nix 環境のほとんどの部分をエミュレートするダイナミックリンクライブラリを提供しています。そして、このダイナミックリンクライブラリの上で動作する最も一般的な *nix ツールが多数用意されています。Cygwin では、ダイナミックリンクライブラリとこれらのツールによって、*nix にきわめてよく似た環境が Windows 上に実現されるしくみになっています。

インストール用に Cygwin が提供している setup.exe ユーティリティには、ターゲットシステムにインストールされているすべてのコンポーネントのバージョンを追跡し、必要なものを Cygwin のミラーサイトからインストールまたはアップデートするためのメカニズムが用意されています。

setup.exe ユーティリティは、インストール作業を進める際に、ターゲットシステム上で 2 つのディレクトリを使用します。1 つは、Cygwin の Root ディレクトリ (デフォルトは C:\cygwin) で、このディレクトリはインストール後の Cygwin 内部で / になります。もう 1 つは、Local Package ディレクトリ (C:\cygsetup など) で、setup.exe ユーティリティがインストール前のパッケージを格納しておくキャッシュです。キャッシュには、Cygwin Root と同じフォルダは使用できません。

Cygwin をインストールするには、以下の手順に従います。これらの手順は、「Cygwin User's Guide」の「chapter 2」で詳しく説明されています。

  1. ターゲットシステム上で Administrator 権限を持っていることを確認します。
  2. Root ディレクトリと Local Package ディレクトリをどこにするか決めて、これらのディレクトリを作成します。それぞれ、C:\cygwin\root フォルダと C:\cygwin\setup フォルダを使用することを推奨します。
  3. setup.exe ユーティリティをダウンロードし、Local Package ディレクトリに保存します。
  4. setup.exe ユーティリティを実行します。
    1. [Install from Internet] オプションを選択します。
    2. Root フォルダと Local Package フォルダを選択します。
    3. 適切なミラーサイトを選択します。
    4. 今は Cygwin をインストールするだけなので、追加のパッケージは一切選択しません。
    5. 必要なパッケージがダウンロードされてインストールされるのを待ちます。
    6. インストールを完了します。
  5. オプションで Local Package フォルダ内の setup.exe ユーティリティへのショートカットを [スタート] メニューに追加することもできます。
  6. Root ディレクトリを指すシステム全体の環境変数 CYGWIN_HOME を追加します。
  7. 環境変数 PATH の最後に %CYGWIN_HOME%\bin を追加します。
  8. 環境変数への変更を行った後、システムを再起動します。この手順を行わないと、OS は Cygwin の各種ユーティリティを見つけることができません。
  9. インストールが適切に行われたかどうか確認するために、新しく作成したショートカット、または Root フォルダ内の Cygwin.bat コマンドを実行します。Bash シェルを実行しているターミナルウィンドウが開くはずです。次のコマンドを実行してシェルをテストします。
    1. cd / を実行すると、Cygwin の Root ディレクトリに移動するはずです。
    2. LS コマンドを実行すると、現在のディレクトリ内のすべてのファイルとフォルダの一覧が表示されるはずです。
    3. exit コマンドを入力してターミナルを終了します。
  10. 必要な場合には、Cygwin をアンインストールできます。Cygwin をアンインストールするには、Root ディレクトリと Local Package ディレクトリを削除し、インストール中に作成されたショートカットを削除します。

SSH

HBase (と Hadoop) では、プロセス間/ノード間の通信リモートコマンドの実行に SSH を使います。SSH は、ターゲットシステム上で Cygwin を介して提供されます。Cygwin では、Cygwin の各種プログラムを Windows サービスとして実行できます。

  1. もう一度 setup.exeユーティリティを実行します。
  2. [Select Packages] 画面がウィザードに表示されるまで、パラメータをすべてそのままにして [Next] ボタンをクリックし、ウィザードの画面をスキップします。
  3. 目的の画面が表示されたら、ウィンドウを最大化して [View] ボタンをクリックし、一覧表示の方法を切り替えます。[Package] 列がアルファベット順に並ぶので、必要なパッケージを簡単に見つけることができます。
  4. ステータスを示す語 (通常は [Skip]) をクリックし、以下のパッケージがインストールされるようにマークを付けます。[Next] ボタンをクリックし、マークしたパッケージをダウンロードしてインストールします。
    1. OpenSSH
    2. tcp_wrappers
    3. diffutils
    4. zlib
  5. インストールの手順が終わるまで待って、インストールを完了します。

HBase

HBase の最新のリリースウェブサイトからダウンロードします。HBase の配布パッケージは zip アーカイブなので、最終インストール先のディレクトリに zip アーカイブを展開するだけで HBase をインストールできます。HBase は Cygwin 内にインストールする必要があることに注意してください。推奨するインストール先ディレクトリは、/usr/local/ (Windows の指定では [Root ディレクトリ]\usr\local) です。Cygwin 内では /usr/local/hbase-<バージョン> というディレクトリにインストールされることになります。

これでインストールは終わりです。次に設定を行います。

設定

3 つの部分について設定する必要があります。JavaSSH、および HBase それ自体です。以下では、それぞれの設定方法について詳しく説明します。

Java

シェルスクリプトに関して全般的に (すなわち *nix と Windows の両方において) 注意が必要なのは、スペースを含むパス名の管理、操作、および組み合わせは、こうした文字や文字列をエスケープしたりクォートしたりする必要があるために、非常に厄介だという点です。したがって、パス名にはできるだけスペースを使わないようにします。*nix 環境では、シンボリックリンクを使うことで、この目的を簡単に達成できます。

  1. Java ホームディレクトリへのリンクを /usr/local に作成します。<jre name> の部分については、選択した Java 環境の名前に置き換えて、次のコマンドを実行します。
    LN -s /cygdrive/c/Program\ Files/Java/<jre name> /usr/local/<jre name>
  2. CD /usr/local/<jre name> を実行して Java フォルダに移動し、./bin/java -version コマンドを実行して、java が適切に使用できるかどうかテストします。コマンドを実行すると、選択した JRE のバージョンが出力されるはずです。

SSH

SSH の設定はこまごまと多岐にわたりますが、要は SSH をデフォルトで Windows サービスとして起動するための設定を行います。

  1. Windows Vista 以降では、Cygwin シェルのショートカットを右クリックして [管理者として実行] をクリックし、昇格された特権で Cygwin シェルを実行する必要があります。
  2. まず、いくつかの重要なファイルのパーミッションを適切に設定する必要があります。以下に示すコマンドを使ってください。すべてのパーミッションは、それぞれのファイルを対象に LS -l コマンドを実行すると確認できます。以下の操作では、 <TAB> による自動補完機能を使うととても便利です。
    1. chmod +r /etc/passwd を実行して、パスワードファイルをすべてのユーザーから読み取り可能にします。
    2. chmod u+w /etc/passwd を実行して、パスワードファイルをオーナーから書き込み可能にします。
    3. chmod +r /etc/group を実行して、グループファイルをすべてのユーザーから読み取り可能にします。
    1. chmod u+w /etc/group を実行して、グループファイルをオーナーから書き込み可能にします。
    1. chmod 755 /var を実行して、var フォルダをオーナーから書き込み可能に、すべてのユーザーから読み取り可能および実行可能にします。
  3. 好みのエディタを使って (シェル内で VI を使ってもいいでしょう!) /etc/hosts.allow ファイルを編集し、次に示す 2 つの行がファイルに存在していて、PARANOID が記述されている行よりも前にあることを確認します。
    1. ALL : localhost 127.0.0.1/32 : allow
    2. ALL : [::1]/128 : allow
  4. 次に、ssh-host-config スクリプトを使って、SSH の設定を行います。
    1. スクリプトから既存の /etc/ssh_config を上書きするかどうか尋ねられたら、yes と答えます。
    2. スクリプトから既存の /etc/sshd_config を上書きするかどうか尋ねられたら、yes と答えます。
    3. スクリプトから特権分離 (privilege separation) を使うかどうか尋ねられたら、yes と答えます。
    4. スクリプトから sshd をサービスとしてインストールするかどうか尋ねられたら、yes と答えます。管理者としてシェルを起動していることを確認してください。
    5. スクリプトから CYGWIN の値を尋ねられた場合、デフォルトは ntsec なので、そのまま <enter> キーを押します。
    6. スクリプトから sshd アカウントを作成するかどうか尋ねられたら、yes と答えます。
    7. スクリプトからサービスアカウントとして別のユーザー名を使うかどうか尋ねられたら、デフォルトのままで十分なので、no と答えます。
    8. スクリプトから cyg_server アカウントを作成するかどうか尋ねられたら、yes と答えます。アカウントのパスワードを入力します。
  5. net start sshd または cygrunsrv --start sshd を実行して、SSH サービスを起動します。 cygrunsrv は、Windows サービスとしてプロセスを実行するユーティリティです。「the CYGWIN sshd service was started succesfully」というメッセージが表示されることを確認します。
  6. 次のコマンドを実行して、Windows と Cygwin のユーザーアカウントを同期させます。
    1. mkpasswd -cl > /etc/passwd
    2. mkgroup --local > /etc/group
  7. SSH が適切にインストールされているかテストします。
    1. 新しい Cygwin ターミナルを開きます。
    2. whoami コマンドを使って自分のユーザー ID を確認します。
    3. ssh localhost を実行して、現在のシステムに接続します。
      1. サーバーの fingerprint が表示されて受け入れるかどうか尋ねられたら、yes と答えます。
      2. プロンプトが表示されたら、自分のパスワードを入力します。
      3. リモートセッションでいくつかコマンドを実行してみて、適切に実行されることを確認します。
      4. exit コマンドを入力すると、Cygwin 内の元のシェルに戻るはずです。
    4. さらに exit を実行すると、Cygwin シェルが終了します。

HBase

ここまでのすべての設定が適切に動作している場合は、HBase の設定ファイルを修正し、設定ファイルの内容が Windows/Cygwin 上で適切に解決されるようにする必要があります。以下の説明で使われているすべてのファイルとパスの指定は、HBase の [インストール先ディレクトリ] を起点としています。
  1. HBase では、./conf/hbase-env.sh を使って、実行時環境の依存関係の設定を行っています。以下に示す行をオリジナル行のすぐ下にコピーしてアンコメントし、自分の環境に合わせて設定を変更します。およそ次のような内容に変更します。
    1. export JAVA_HOME=/usr/local/<jre name>
    2. export HBASE_IDENT_STRING=$HOSTNAME (ホスト名にはスペースが含まれていない可能性が高いため)
  2. HBase では、./conf/hbase-default.xml ファイルを設定のために使っています。JVM が Windows 上で実行されるため、実在するディレクトリに解決されないプロパティが一部に存在します。Cygwin を使って HBase を動作させる場合、これは常に注意する必要がある大きな問題点です。シェル内ではすべてのパスは *nix と似た形となり、したがってルート / からの相対指定となります。しかしながら、Windows のプロセスそれ自体の中で使われるあらゆるパラメータは、Windows 流の設定、すなわち C:\ の形で指定する必要があります。設定ファイルの中の以下のプロパティを変更し、必要な場合にはインストールした HBase の設定に合うようにパスを調整します。
    1. hbase.rootdir は、たとえば file:///C:/cygwin/root/tmp/hbase/data のように指定しなければなりません。
    2. hbase.tmp.dir は、たとえば C:/cygwin/root/tmp/hbase/tmp のように指定しなければなりません。
    3. hbase.zookeeper.quorum は、127.0.0.1 と指定しなければなりません。なぜなら、何らかの理由で Cygwin 上では localhost が適切に解決されないからです。
  3. 設定した hbase.rootdir および hbase.tmp.dir に対応するディレクトリが存在することを確認し、適切なパーミッションが設定されていること (すなわち、これらのディレクトリに対して chmod 777 が実行されていること) を確認します。

テスト

以上で、Cygwin を使った Windows への HBase のインストールと設定は終わりです。ここでは、HBase の動作をテストします。

  1. Cygwin ターミナルを起動します。
  2. CD /usr/local/hbase-<バージョン> を実行して HBase のインストール先に移動します。パスを入力する時は、自動補完機能を使うと便利です。
  3. ./bin/start-hbase.sh コマンドを実行して、HBase を起動します。
    1. SSH の fingerprint を受け入れるかどうか尋ねられたら、yes と答えます。
    2. プロンプトが表示されたら、自分のパスワードを入力します。入力を複数回求められることがあります。
    3. コマンドの実行が完了したら、HBase サーバーが起動しているはずです。
    4. ただし、念のために ./logs ディレクトリのログに例外が記録されていないかどうかチェックしてください。
  4. 次に、./bin/hbase shell コマンドを実行して、HBase Shell を起動します。
  5. いくつか簡単なテストコマンドを実行します。
    1. create 'test', 'data' コマンドを実行して、シンプルなテーブルを作成します。
    2. list コマンドを実行して、作成したテーブルが存在することを確認します。
    3. 次のコマンドを実行して、テーブルにデータを挿入します。
      put 'test', 'row1', 'data:1', 'value1'
      put 'test', 'row2', 'data:2', 'value2'
      put 'test', 'row3', 'data:3', 'value3'
    4. scan 'test' コマンドを実行して、テーブル内のすべての行を表示します。上の手順で挿入したすべての行が表示されるはずです。スキーマを変更することなく、3 つの新しい列が追加されていることに注意してください。
    5. 最後に、disable 'test' を実行し、続いて drop 'test' を実行して、テーブルを削除します。さらに、list を実行して、何も表示されないことを確認します。
  6. exit を実行して Shell を終了します
  7. ./bin/stop-hbase.sh コマンドを実行して、HBase サーバーを停止します。停止操作が完了するまで待ちます。プロセスを kill すると、ディスク上のデータが破損することがあります。
  8. 問題が発生した場合は、以下の手順に従ってください。
    1. ./logs ディレクトリにある HBase のログの内容を確認します。
    2. 問題の解決を試みます。
    3. フォーラムや IRC (#hbase@freenode.net) で質問してみてください。多くのユーザーが喜んでアドバイスしてくれるはずです。
    4. サーバーを停止し、再起動してもう一度テストを行います。

むすび

これで HBase サーバーを実行できるようになりました。さっそくコーディングを始めて、HBase という独特のスケーラブルなデータストアで動作するキラーアプリケーションを作成してください!