Cloudera Managerを使って、hadoop、hive等をEC2の複数台のサーバーにインストールする方法

Cloudera Managerを使って、hadoop、hive等をEC2の複数台のサーバーにインストールする方法の解説です。


この記事の対象者はこんな人たちです。


  1. HadoopやHiveをユーザーとして使いたい人
  2. 自前のサーバーへ導入する前に試しに触ってみたい人
  3. EC2へのインストールが何故か失敗する人(ハマりポイントが多いです…)

Cloudera
画像はCloudera社公式ページより引用


全体をざっと説明


hadoop、hiveをEC2サーバーにインストールするには、ざっと分けて以下の手順が必要になります。


  1. EC2インスタンスの準備・起動・各種設定
  2. EC2インスタンス1台のみへCloudera Manager(以下CM)をインストール
  3. CMを使って全EC2インスタンスへhadoop、hiveをインストール

少しだけ用語解説


Amazon EC2(Amazon Elastic Compute Cloud)

Amazonが提供しているクラウドサーバーサービスです。仮想サーバーの作成・破棄が安価・簡単にできます。設定に失敗してもそのサーバーを削除してまっさらな状態からやり直せるので、新しいツールの検証を簡単に行えます。


Cloudera Manager(CM)

Cloudera社が提供している、hadoop、hive等を簡単にインストールするためのパッケージです。hadoopをインストールするにはCMを使うのが一番簡単です。大半の会社はCMを使ってるんじゃないかな?と個人的には思います。


hadoopクラスタ

hadoopはHDFS(hadoop分散ファイルシステム)やMap/Reduceと協調して動作します。そのため、基本的に複数台で動作します。本記事ではその複数台のことをhadoopクラスタと呼びます。



EC2インスタンスの設定


EC2インスタンス作成前の設定


  1. 共通で使うKey Pairを作っておく
  2. 共通で使うSecurity Groupを作っておく
  3. Security Groupの設定でTCPポートを全部許可しておく
  4. Security Groupの設定でICMP Echo Requestを許可しておく

EC2インスタンス作成時の設定


  1. OSはRedhat Enterprise Linux 64bitを選ぶ
  2. インスタンスの種類はLargeインスタンスを選ぶ
  3. 各インスタンスには分かりやすい名前を付ける
  4. ブートストレージ(EBS)のサイズを大きくしておく(最低100GBくらい)
  5. タンスに割り当てる

EC2インスタンス起動後に行う設定


  1. 上記の設定でインスタンスを3台起動する
  2. Elastic IPを台数分取得し、それぞれのインスタンスに割り当てる

台数は何台でも大丈夫ですが、多いと設定が面倒なのでとりあえず3台にしています。1台での起動はお試しでない限りやめた方がよいと思います。hadoopのキモは複数台での協調動作なので、1台で動かしても遅いだけであまり意味がないです。


インスタンスサイズはLarge以上を推奨します。Small以下になるとhadoop等のインストールがとても遅くなります。費用が気になるかもですが、ちょっと動かすだけならLargeインスタンス3台とEBSを合わせても数百~千円弱しかかかりません。


ストレージサイズ100GBは適当な数字です。たぶん50GBくらいまで減らしてもインストールだけならできます。 ストレージサイズを大きくする設定はEC2インスタンスの起動時に行なって下さい。後から大きくすることもできますが、自分でマウントしたりする必要があるのでちょっと面倒になります。


ポートを全部開ける必要はないのですが、使うポートが多いので今回は全部開ける設定にしています。必要なポートだけ開けたい場合はこのページを参考にしてください。

Configuring Ports for Cloudera Manager


少しだけ用語解説


Key Pair

sshのログイン時に使う、秘密鍵と公開鍵のセットのことです。EC2インスタンス作成時にどのKey Pairを使うのか指定します。後の手順でCMで指定する秘密鍵は*.pem形式です。


Security Group

EC2インスタンスに設定するファイアーウォールのようなものです。仮にiptablesを止めていても、Security Groupで設定していないポートを使った通信は一切できません。


EBS(Amazon Elastic Block Store)

EC2から利用できるストレージです。後から割り当てると、「mkfs -t ext3 /dev/sdb1」、「mount /dev/sdb1 /mnt」みたいな面倒な手順が必要になります。



EC2インスタンス起動後の設定


下記の手順を起動したインスタンス「全て」で行なってください。


  1. 追加で割り当てたストレージの有効化(resize2fs /dev/xvde1 の実行)
  2. SELinuxの無効化
  3. インスタンスの再起動(SELinux無効の設定を反映するため)
  4. ファイアーウォールの無効化(service iptables stop の実行)

追加で割り当てたストレージを有効化するには、以下のコマンドを実行してください。


# xvde1じゃない名前になってるかも? 名前は /dev 以下を見れば分かります
$ resize2fs /dev/xvde1

# 割り当てたサイズの確認。
$ df -h

# この結果が表示されていれば成功です。
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvde1             50G  1.7G   48G   4% /
none                  296M     0  296M   0% /dev/shm

SELinxの無効化は、/etc/selinux/config の該当行を、SELINUX=disabled と書き直してEC2インスタンスを再起動すれば完了です。


セキュリティ的には危ない設定になっています。本番運用の際は、Security Group、SELinux、iptablesを適切に設定するようにしてください。



Cloudera Managerのインストール


  1. wgetでcloudera-manager-installer.binをダウンロードする
  2. ダウンロードしたファイルに実行権限を付ける
  3. ダウンロードしたファイルを実行する

つまり、下記のコマンドを実行すればOKです。


$ wget http://archive.cloudera.com/cm4/installer/latest/cloudera-manager-installer.bin
$ chmod u+x cloudera-manager-installer.bin
$ ./cloudera-manager-installer.bin

Cloudera Managerのインストールは「1台のみ」で大丈夫です。



時刻を東京にしておく


この手順は必須ではないです。全EC2インスタンスで時刻が揃っていればよいです。もし日本の時刻にしておきたい場合はこの手順も実行してください


$ cp /usr/share/zoneinfo/Japan /etc/localtime

# このコマンドで、時刻が日本標準時になっているか確認できます
$ date


ブラウザから全インスタンスへhadoop、hiveをインストール


CMをインストールしたEC2インスタンスの7180番ポートへブラウザからアクセスしてください。後はブラウザ上から、全EC2インスタンスへhadoop、hive等のインストールを行えます。


# CMをインストールしたサーバーのElastic IPが 123.456.789.123 の場合
http://123.456.789.123:7180

途中、選択肢がたくさんでてきますが、それっぽいものを選んでいけば大丈夫です。OozieやHue等もインストールされますが、使う人には便利なものらしいので得に問題はないです。


CDH3かCDH4を選ぶところでは、CDH4を選んでください。CDH4の方がより新しいバージョンです。


各EC2インスタンスにhadoop等のインストールを行う時、いきなり失敗することがありますが、再試行をクリックすれば正常にインストールできます。おそらく、1台のサーバーへ各EC2インスタンスから同時にpingしてしまい、瞬間的に応答なしになってしまうのだと思います。



hiveを使うために必要なHDFSの初期設定


hiveを使うためには、hiveユーザーにHDFSの書き込み権限を与える必要があります。以下のコマンドを初回のみ実行すればOKです。


# /userのパーミッションを777に変更
sudo -u hdfs hadoop fs -chmod 777 /user

# 権限の確認。
hadoop fs -ls /

# この結果が表示されれば成功
Found 2 items
drwxrwxrwt   - hdfs hdfs                0 2012-10-06 16:16 /tmp
drwxrwxrwx   - hdfs supergroup          0 2012-10-07 00:20 /user

/userというHDFSディレクトリのパーミッションが777(rwxrwxrwx)になっていれば成功です。今後hiveでDBやテーブルを作ると、/user/hive/warehouse 以下にDB名、テーブル名と同名のファイルが作られていきます。



hiveを使ってみる


コマンドラインで hive を実行すれば、hiveの対話モードになります。mysql と同じような使い方ができます。


クエリ例は疲れたのでまた今度にします…。



EC2の各サーバーは再起動しないでください


EC2インスタンスを再起動すると、hadoopクラスタが正常に動作しなくなります。CMが各EC2インスタンスをプライベートIPで生存確認するのですが、EC2インスタンスを再起動するとプライベートIPが変わってしまうため、正常に動作できなくなります。


この問題は、EC2インスタンスの構造的な問題のようです。設定を変えればうまくいくと思いますが、現時点ではよく分からないです。


[cloudera manager ec2 private ip]あたりで検索すると該当する情報がたくさんでてくるので、気になる方は調べてみてください。



まとめ


まっさらな状態のEC2インスタンスに、hadoop、hive等をインストールして使うところまで解説しました。


hiveにデータをロードしてクエリを実行する部分はまた今度書くかもしれません。



参考リンク


How to format and mount a EBS volume on EC2


Amazon EC2/EBSのマウント


稼働中のEC2のインスタンスの容量をリサイズする


Cloudera Manager Users - Google グループ