カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまに数学やデータ分析なども。

AWSにCloudera ManagerでCDH(Hadoop)クラスタを構築してみた

AWSにEC2インスタンスを複数立てて、Cloudera ManagerをインストールしてCDHクラスタを構築してみた。
Hadoopのクラスタ構成を自前で組むと結構面倒らしいが、Cloudera Managerを入れるとかなり簡単に組むことができた。

環境情報は以下。

  • Redhat Enterprise Linux 6.5
  • Cloudera Manager 5.9.0

AWSインスタンス構築

Cloudera Managerの機能でEC2インスタンスを作ってクラスタ構成を構築してくれる機能もあるらしいが、
今回はそれは使わずにEC2インスタンスはあらかじめ作っておき、OSがインストールされたノードが4ノードある状態にCDHを導入する。

今回作ったAWSインスタンスは4ノードとし、一つを管理系、残りをデータノードとして使う。
OSはRHEL 6.5とし、t2.large(vCPU:2, Memory:8GB)を選択。
ディスクはルートデバイスを100GBに増やし、さらにデータ用に300GBのデバイスを一つ追加した構成にした。
あとはネットワーク(セキュリティグループ)の設定だが、ノード間通信は基本的に全て許可するようにしておいた。

事前準備

インストールをスムーズに進めるためにいくつか事前準備をしておく。

  • ホスト名解決

各ノードにホスト名を設定し、解決できるようにしておく。
今回は4ノードのホスト名をそれぞれ、cdh01cdh02cdh03cdh04とする。以下を設定。

  • /etc/hosts
  • /etc/hostname
  • /etc/sysconfig/network
  • /etc/cloud/cloud.cfg

SELinux無効

  • $ setenforce 0
  • /etc/selinux/config

公開鍵交換

  • 各ノードのrootユーザでパスワードなしsshログインができるように、ssh-keygenをして秘密鍵を~/.ssh/authorized_keysに登録。

NTP同期

  • ntpdが起動していなかったり時刻同期がされていないとあとでチェックに引っかかるので確認しておく。

yum最新化

  • $ yum update

その他

その他にもおそらく必要な条件はあるが、インストール時に各種チェックをしてくれるので、後はそこで拾うことにする。

CDHインストール

chd01にログインし、rootユーザでCloudera Managerをインストールする。

[root@cdh01 ~]# wget http://archive.cloudera.com/cm5/installer/latest/cloudera-manager-installer.bin
[root@cdh01 ~]# chmod +x cloudera-manager-installer.bin
[root@cdh01 ~]# ./cloudera-manager-installer.bin

対話式のインストーラが開始される。

Next
f:id:osn_th:20161130112410p:plain
Next
f:id:osn_th:20161130112421p:plain
Yes
f:id:osn_th:20161130112353p:plain
Next
f:id:osn_th:20161130112414p:plain
Yes
f:id:osn_th:20161130112418p:plain

f:id:osn_th:20161130112358p:plain
Cloudera Manager管理コンソールにログインするためのURLとユーザ名/パスワードが表示されているのでメモしておく。
OK
f:id:osn_th:20161130112355p:plain
OK
f:id:osn_th:20161130112401p:plain
これでCloudera Managerのインストールが完了。
あとはCloudera Managerにログインし、画面からCDHクラスタを構成する。

CDHクラスタ構成

インストール画面の最後にCloudera Managerのログイン情報をもとにログインする。
http://cdh01:7180/
admin / admin でログインできる。
f:id:osn_th:20161130112433p:plain
ライセンス条項を確認し問題なければチェックを入れ、続行
f:id:osn_th:20161130112535p:plain
エディション選択画面になる。今回はトライアルエディションとする。
続行
f:id:osn_th:20161130112528p:plain
続行
f:id:osn_th:20161130112531p:plain
ホスト名(例: cdh0[1-4]) で検索し、インストール対象のノードを検出する。
続行
f:id:osn_th:20161130112451p:plain
追加したいParcelコンポーネントがあれば追加し、続行
f:id:osn_th:20161130112439p:plain
チェックを入れ、続行
f:id:osn_th:20161130112430p:plain
シングルユーザモードにはチェックを入れず、続行
f:id:osn_th:20161130112503p:plain
cdh01ノードのrootユーザの秘密鍵(.ssh/id_pub)を指定し、続行
f:id:osn_th:20161130112444p:plain
ここで各ノードにクラスタソフトウェアがインストールされる。
問題なく完了したら、続行
f:id:osn_th:20161130112436p:plain
Parcelのインストールが開始されるので、追加したものがある場合はそれもインストールされる。
完了後、続行
f:id:osn_th:20161130112509p:plain
ホストが正常かどうかの検査が開始される。
ここで引っかかった検証項目ごとに対処法もかなり具体的に記載されているので、その指示に従って解消する。
解消後、再実行ボタンを押して全ての検証が通ったら、完了
f:id:osn_th:20161130112459p:plain
クラスタ・サービスを選択する。
今回はSparkも使いたいので「Sparkがあるコア」にし、続行
f:id:osn_th:20161130112447p:plain
ロール割り当てをカスタマイズする
今回はSecondaryNameNodeをcdh02に変えた以外は、デフォルトのままとした。
「ホスト別に表示」すると内容を確認できるので、問題なければ続行
f:id:osn_th:20161130112523p:plain
データベースセットアップでは、データベースホスト名などの各種情報は自動で入力されている。
テスト接続し、問題なければ続行
f:id:osn_th:20161130112454p:plain
各種パラメータ値を設定する。
今回はデフォルト値のまま、続行
なお、今回EC2に300GBのデバイスを追加し、/u01としてマウントしているのだが、
ちゃんとその領域をDataNodeのデータディレクトリとして使ってくれていることが分かる。
f:id:osn_th:20161130112539p:plain
各種サービスのセットアップが実行されるので、
問題なく完了したら、続行
f:id:osn_th:20161130112425p:plain
以上で完了
f:id:osn_th:20161130112520p:plain
Cloudera Managerのホーム画面で以下のように各種コンポーネントがグリーンになっていれば正常に起動している。
f:id:osn_th:20161130112513p:plain
以上でCDHクラスタ構築作業は完了。

動作確認

CDHクラスタが構築できたので、いくつかのコンポーネントを動作させてみる。

hiveを動かしてみる

まずは試しにhiveを動かしてみる。

まずテストファイル作成。

$ cat test.csv
id,value
1,aaa
2,bbb
3,ccc

hiveでテーブル作成し、テストファイルを取り込んで見る。

$ hive
2016-11-29 02:37:56,953 WARN [main] mapreduce.TableMapReduceUtil: The hbase-prefix-tree module jar containing PrefixTreeCodec is not present. Continuing without it.

Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23/jars/hive-common-1.1.0-cdh5.9.0.jar!/hive-log4j.properties
WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
hive> create database db1;
OK
Time taken: 0.259 seconds
hive> use db1;
OK
Time taken: 0.017 seconds
hive> create table table1 (id int, value string) row format delimited fields terminated by ',' lines terminated by '\n'
  > ;
OK
Time taken: 0.181 seconds
hive> load data local inpath 'test.csv' overwrite into table table1;
Loading data to table db1.table1
Table db1.table1 stats: [numFiles=1, numRows=0, totalSize=27, rawDataSize=0]
OK
Time taken: 0.971 seconds
hive> select * from table1;
OK
NULL  value
1   aaa
2   bbb
3   ccc
Time taken: 0.315 seconds, Fetched: 4 row(s)

問題なく動作しているよう。
HDFSでも確認する。

$ hadoop fs -ls /user/hive/warehouse/db1.db
Found 1 items
drwxrwxrwt - ec2-user hive     0 2016-11-29 02:44 /user/hive/warehouse/db1.db/table1

正しく認識しているよう。

Sparkを動かしてみる

hdfsユーザがインストール時に作成されているのでスイッチし、spark-shellコマンドを実行する。
※他のユーザだとHDFSの権限エラーになった

$ su - hdfs
$ spark-shell
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
Welcome to
   ____       __
  / __/__ ___ _____/ /__
  _\ \/ _ \/ _ `/ __/ '_/
 /___/ .__/\_,_/_/ /_/\_\ version 1.6.0
   /_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67)
Type in expressions to have them evaluated.
Type :help for more information.
Spark context available as sc (master = yarn-client, app id = application_1480399559471_0003).
SQL context available as sqlContext.

scala> var lines = sc.textFile("/user/hive/warehouse/db1.db/table1")
lines: org.apache.spark.rdd.RDD[String] = /user/hive/warehouse/db1.db/table1 MapPartitionsRDD[1] at textFile at <console>:27

scala> lines.count
res1: Long = 4

先ほど取り込んだHDFS上のファイルの行数を集計するスクリプトが実行できた!

まとめ

以上でAWS上に構築したEC2インスタンスにCloudera Managerをインストールし、CDHクラスタを構築できた。
また、実際にhiveとSparkが動作することも確認できた。
インストール作業はCloudera Managerが全ノードに対して一元的に実施してくれるため、ノードの数が多くてもあまり手間は変わらなく、とても簡単に実施できる。
一方で、ノード数が増えるとインストールの事前作業であるホスト名やカーネルパラメータ設定などが手間になるため、
実際に運用する場合はChefやAnsibleのようなプロビジョニングツールが必須だと感じた

以上!

Hadoop関連書籍

Hadoop 第3版

Hadoop 第3版

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

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