Hadoop メモ

Hadoopの環境(完全分散モード)をサンプルの実行ができるまで構築してみたので、そのメモ。

Hadoopとは

Apache Hadoopプロジェクトで開発されている分散処理用のJavaのフレームワーク。

事前準備

クライアント

Windows7

サーバー

サーバープランOSメモリswapHDD価格/月補足
自宅サーバー-ubuntu10.10 64bit2G6G(拡張可)-
DTI VPSエントリープランCentOS 5.4 32bit256M(保証)/1G(最大)-(拡張不可)10GB490円/月(1ヶ月契約)東京
DTI VPSエントリープランCentOS 5.4 32bit256M(保証)/1G(最大)-(拡張不可)10GB490円/月(1ヶ月契約)大阪
saases VPSOsukiniサーバー LTCentOS 5.8 32bit512M1G(拡張可)50GB450円/月(3ヶ月契約)
さくらインターネット VPSさくらのVPS 1GCentOS 5.8 32bit1G1G(拡張可)100GB980円/月(1ヶ月契約 2週間お試し無料含む)

DTIの東京サーバーが不調のため、大阪サーバーを基本的に使用した。

クライアントソフトウェア

  • サーバーを操作する端末ソフト。ここではteratermを使用
  • サーバーにファイルをアップロードするソフト。ここではWinSCPを使用

サーバーソフトウェア

参考にしたページ

実施作業(マスターとスレーブは同じ設定をしています)

サーバーの初期設定

  • サーバーを用意(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.shexport JAVA_HOME=実際のJavaのインストールフォルダ# export JAVA_HOME=/usr/lib/j2sdk1.5-sunfind / -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.shrsync -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.shssh -p 3333 \$HADOOP_SSH_OPTS \$slave \$"\${@// /\\ }" \ssh \$HADOOP_SSH_OPTS \$slave \$"\${@// /\\ }" \

javaのメモリを変更する場合にのみ必要な設定ファイル

設定ファイル設定内容デフォルト補足
bin/hadoopJAVA_HEAP_MAX="-Xmx64M -XX:MaxPermSize=32M"JAVA_HEAP_MAX=1000Mconf/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調整(要/不要)備考
DTIDTI不可-
DTIsaases要(DTI)/不要(saases)
saasesDTI不可要(DTI)/不要(saases)
saasesさくらインターネット不要不要
さくらインターネットsaases不要不要

マスターでnodename,secondarynamenode,jobtrackerが起動し、
スレーブでのdatanode,tasktrackerが起動する。
grepを実行した場合は、jarプロセスがマスター側、子プロセスがスレーブ側で起動される。

結論

swap設定が可能なサーバーなら動作確認は可能。
低価格VPSでは非力だから利点はないかな。