Hadoop メモ
Hadoopの環境(完全分散モード)をサンプルの実行ができるまで構築してみたので、そのメモ。
Hadoopとは
Apache Hadoopプロジェクトで開発されている分散処理用のJavaのフレームワーク。
事前準備
クライアント
Windows7
サーバー
サーバー | プラン | OS | メモリ | swap | HDD | 価格/月 | 補足 |
---|---|---|---|---|---|---|---|
自宅サーバー | - | ubuntu10.10 64bit | 2G | 6G(拡張可) | - | ||
DTI VPS | エントリープラン | CentOS 5.4 32bit | 256M(保証)/1G(最大) | -(拡張不可) | 10GB | 490円/月(1ヶ月契約) | 東京 |
DTI VPS | エントリープラン | CentOS 5.4 32bit | 256M(保証)/1G(最大) | -(拡張不可) | 10GB | 490円/月(1ヶ月契約) | 大阪 |
saases VPS | Osukiniサーバー LT | CentOS 5.8 32bit | 512M | 1G(拡張可) | 50GB | 450円/月(3ヶ月契約) | |
さくらインターネット VPS | さくらのVPS 1G | CentOS 5.8 32bit | 1G | 1G(拡張可) | 100GB | 980円/月(1ヶ月契約 2週間お試し無料含む) |
DTIの東京サーバーが不調のため、大阪サーバーを基本的に使用した。
クライアントソフトウェア
サーバーソフトウェア
- oracleのjvmモジュールをダウンロード、oracleのjavaページからダウンロード。ここでは1.6.0_33を使用しました。
- hadoopのモジュールをhadoopのダウンロードページからダウンロード。ここでは1.0.3を使用しました。
参考にしたページ
- hadoop 日本語
- hadoop 本家(英語)
- hadoop本家の1.0.3のガイド(英語)だけど内容は他のバージョンとほぼ同じで、コマンドとかプロパティが違う。
実施作業(マスターとスレーブは同じ設定をしています)
サーバーの初期設定
- サーバーを用意(VPSサーバー契約)
- teratermにてrootでsshログイン
- rootパスワード変更(passwd)
- 一般ユーザー(hogehoge)を追加(adduser hogehoge)
- 一般ユーザー(hogehoge)のパスワードを設定(passwd hogehoge)
- sshのrootログイン禁止設定(# vi /etc/ssh/sshd_config して #PermitRootLogin yesの下にPermitRootLogin noを追加)
- sshのポートを変更(# vi /etc/ssh/sshd_config して #Port 22の下にPort 3333とか追加)※sshのポートを変更する場合
- sshdを再起動する(# service sshd restart)
- teratermにて22番ポートに接続できないことを確認
- teratermにて変更後のポート(3333)に接続できることを確認
- teratermにてrootユーザーでログインできないことを確認
- teratermにて一般ユーザー(hogehoge)でログインできることを確認
- 一般ユーザー(hogehoge)の状態でsuコマンドでrootログインできることを確認
- 適宜不要なプロセスの停止
WinSCPでファイルアップロード
- jdk-6u33-linux-i586-rpm.binを一般ユーザー(hogehoge)のフォルダにアップロード
- hadoop-1.0.3-bin.tar.gzを一般ユーザー(hogehoge)のフォルダにアップロード
インストール
- teratermに一般ユーザー(hogehoge)でログイン
- su -にてrootユーザーになる
- #chmod 755 jdk-6u33-linux-i586-rpm.binを実行
- #./jdk-6u33-linux-i586-rpm.binを実行
- インストール中にEnterとか言われるのでEnterを押下
- java -versionとか実行してインストールされているか確認
- tar xvf hadoop-1.0.3-bin.tar.gzを実行
ssh設定
hadoopを起動する際にパスワード入力を省く。
- \$ ssh -p 3333 localhostを実行してpasswordを聞かれるか確認(聞かれる場合は以下の処理を実施)
- \$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
- \$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
- \$ ssh -p 3333 localhostを実行してpasswordを聞かれるか確認(聞かれる場合は以下の処理を実施)
- \$ chmod 700 .ssh
- \$ chmod 600 .ssh/*
- \$ ssh -p 3333 localhostを実行してpasswordを聞かれずにログインできることを確認
※赤太字はsshのポートを変更した場合のみ必要
マスターのファイルをスレーブにコピーすると、スレーブのログインの際にパスワードの入力が不要になるらしいが、今回はパス。
hadoop設定
設定ファイル
- teratermに一般ユーザー(hogehoge)でログイン
- \$ cd hadoop-1.0.3
設定ファイル | 設定内容 | デフォルト | 補足 |
---|---|---|---|
conf/hadoop-env.sh | export JAVA_HOME=実際のJavaのインストールフォルダ | # export JAVA_HOME=/usr/lib/j2sdk1.5-sun | find / -name "java" でも実行すれば見つかる /usr/java/jdk1.6.0_33 等 |
conf/masters | マスターにするサーバーのドメイン名(hogemaster.hoge.com)を設定 | localhost | |
conf/masters | スレーブにするサーバーのドメイン名(hogeslave1.hoge.com)を設定 | localhost | |
conf/core-site.xml | <configuration> <property> <name>fs.default.name</name> <value>hdfs://hogemaster.hoge.com:9000</value> </property> </configuration> | <configuration> </configuration> | |
conf/hdfs-site.xml |
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> | <configuration> </configuration> | スレーブ一つなので1を設定しています |
conf/mapred-site.xml |
<configuration> <property> <name>mapred.job.tracker</name> <value>hadoop.uchicom.com:9001</value> </property> <property> <name>mapred.tasktracker.map.tasks.maximum</name> <value>1</value> </property> <property> <name>mapred.tasktracker.reduce.tasks.maximum</name> <value>1</value> </property> </configuration> | <configuration> </configuration> |
sshのポートを変更した場合のみ必要な設定ファイル
設定ファイル | 設定内容 | デフォルト | 補足 |
---|---|---|---|
bin/hadoop-daemon.sh | rsync -a -e ssh -p 3333 --delete --exclude=.svn --exclude='logs/*' --exclude='contrib/hod/logs/*' \$HADOOP_MASTER/ "\$HADOOP_HOME" | rsync -a -e ssh --delete --exclude=.svn --exclude='logs/*' --exclude='contrib/hod/logs/*' \$HADOOP_MASTER/ "\$HADOOP_HOME" | |
bin/slave.sh | ssh -p 3333 \$HADOOP_SSH_OPTS \$slave \$"\${@// /\\ }" \ | ssh \$HADOOP_SSH_OPTS \$slave \$"\${@// /\\ }" \ |
javaのメモリを変更する場合にのみ必要な設定ファイル
設定ファイル | 設定内容 | デフォルト | 補足 |
---|---|---|---|
bin/hadoop | JAVA_HEAP_MAX="-Xmx64M -XX:MaxPermSize=32M" | JAVA_HEAP_MAX=1000M | conf/hadoop-env.shのHADOOP_HEAP_SIZEが未設定の場合に有効 |
HADOOP_HEAP_SIZEを設定すると-XX:MaxPermSizeを使用する場合にshのロジックを変更する必要があったので、HADOOP_HEAP_SIZEを使用していません。
調査結果
スタンドアロンモード
サーバー | grep実行(可/不可) | 補足 |
---|---|---|
DTI | 可 -Xmx512Mにて確認 | メモリ調整しない場合はエラー \$ bin/hadoop jar hadoop-examples-1.0.3.jar grep input output 'dfs[a-z.]+' Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine. |
saases | 可 | |
さくらインターネット | 可 | |
自宅サーバー | 可 |
擬似分散モード
サーバー | 起動(可/不可) | grep実行(可/不可) | 補足 |
---|---|---|---|
DTI | 可 -Xmx64Mにて確認 | 不可 -Xmx64Mにて確認 | メモリ調整しない場合はエラー \$ bin/hadoop namenode -format Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine. メモリ調整してもエラー \$ bin/hadoop fs -put conf input bin/hadoop: fork: Cannot allocate memory Error occurred during initialization of VM Could not reserve enough space for code cache |
saases | 可 | 可 | |
さくらインターネット | 可 | 可 | |
自宅サーバー | 可 | 可 |
完全分散モード
マスター | スレーブ | 起動(可/不可) | grep実行(可/不可) | javaメモリ調整(要/不要) | swap調整(要/不要) | 備考 |
---|---|---|---|---|---|---|
DTI | DTI | 可 | 不可 | 要 | - | |
DTI | saases | 可 | 可 | 要(DTI)/不要(saases) | ||
saases | DTI | 可 | 不可 | 要(DTI)/不要(saases) | ||
saases | さくらインターネット | 可 | 可 | 不要 | 不要 | |
さくらインターネット | saases | 可 | 可 | 不要 | 不要 |
マスターでnodename,secondarynamenode,jobtrackerが起動し、
スレーブでのdatanode,tasktrackerが起動する。
grepを実行した場合は、jarプロセスがマスター側、子プロセスがスレーブ側で起動される。
結論
swap設定が可能なサーバーなら動作確認は可能。
低価格VPSでは非力だから利点はないかな。