Hadoopを使ってみよう [3]
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
CDHv3をUbuntu Serverにインストール
前回は米Cloudera社が提供しているKVM用のデモイメージを使ってHadoopを体験しました。
今回はUbuntu Server 10.04 LTS (x86_64)にCDHv3のインストールを行います。
Java Development Kitのインストール
Javaにはオープンな実装がいくつか存在しますが、ClouderaはOracle JDKの使用を推奨しているため、ここではそれにならいます。Oracle JDKはダウンロードに手間がかかるため、余裕を持って準備を行ってください。
Oracle JDKのダウンロードが完了したら、Ubuntu Server 10.04 LTS (x86_64)にインストールを行います。
root@ubuntu:~# sh jdk-6u26-linux-x64.bin : Done. root@ubuntu:~# root@ubuntu:~# mv jdk1.6.0_26 /usr/local/lib root@ubuntu:~#
パスを通します。
root@ubuntu:~# cat >> /etc/bash.bashrc export JAVA_HOME=/usr/local/lib/jdk1.6.0_26 export PATH=$JAVA_HOME/bin:$PATH root@ubuntu:~#
CDHv3のインストール
CDHv3用のレポジトリ設定パッケージを取得し、インストールします。
root@ubuntu:~# wget http://archive.cloudera.com/one-click-install/lucid/cdh3-repository_1.0_all.deb --2012-05-29 21:52:19-- http://archive.cloudera.com/one-click-install/lucid/cdh3-repository_1.0_all.deb archive.cloudera.com をDNSに問いあわせています... 75.101.147.51 archive.cloudera.com|75.101.147.51|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 3274 (3.2K) [application/x-debian-package] `cdh3-repository_1.0_all.deb' に保存中 100%[======================================>] 3,274 --.-K/s 時間 0s 2012-05-29 21:52:20 (387 MB/s) - `cdh3-repository_1.0_all.deb' へ保存完了 [3274/3274] root@ubuntu:~# dpkg -i cdh3-repository_1.0_all.deb 未選択パッケージ cdh3-repository を選択しています。 (データベースを読み込んでいます ... 現在 45728 個のファイルとディレクトリがインストールされています。) (cdh3-repository_1.0_all.deb から) cdh3-repository を展開しています... cdh3-repository (1.0) を設定しています ... gpg: 鍵輪「/etc/apt/trusted.gpg.d/cloudera-cdh3.gpg」ができました gpg: 鍵02A818DD: 公開鍵“Cloudera Apt Repository”を読み込みました gpg: 処理数の合計: 1 gpg: 読込み: 1 root@ubuntu:~#
Hadoopのコアパッケージをインストールします。
root@ubuntu:~# aptitude update : root@ubuntu:~# aptitude search hadoop v hadoop - p hadoop-0.20 - A software platform for processing vast am p hadoop-0.20-conf-pseudo - Pseudo-distributed Hadoop configuration p hadoop-0.20-datanode - Data Node for Hadoop p hadoop-0.20-doc - Documentation for Hadoop p hadoop-0.20-fuse - HDFS exposed over a Filesystem in Userspac p hadoop-0.20-jobtracker - Job Tracker for Hadoop p hadoop-0.20-namenode - Name Node for Hadoop p hadoop-0.20-native - Native libraries for Hadoop (e.g., compres p hadoop-0.20-pipes - Interface to author Hadoop MapReduce jobs p hadoop-0.20-sbin - Server-side binaries necessary for secured p hadoop-0.20-secondarynamenode - Secondary Name Node for Hadoop p hadoop-0.20-source - Source code for Hadoop p hadoop-0.20-tasktracker - Task Tracker for Hadoop : root@ubuntu:~# aptitude install hadoop-0.20 hadoop-0.20-native : 取得:1 http://jp.archive.ubuntu.com/ubuntu/ lucid/main liblzo2-2 2.03-2 [59.2kB] 取得:2 http://jp.archive.ubuntu.com/ubuntu/ lucid-updates/main libzip1 0.9-3ubuntu0.1 [26.0kB] 取得:3 http://archive.cloudera.com/debian/ lucid-cdh3/contrib hadoop-0.20 0.20.2+923.256-1~lucid-cdh3 [32.2MB] 取得:4 http://archive.cloudera.com/debian/ lucid-cdh3/contrib hadoop-0.20-native 0.20.2+923.256-1~lucid-cdh3 [321kB] : liblzo2-2 (2.03-2) を設定しています ... libzip1 (0.9-3ubuntu0.1) を設定しています ... hadoop-0.20 (0.20.2+923.256-1~lucid-cdh3) を設定しています ... update-alternatives: /etc/hadoop-0.20/conf (hadoop-0.20-conf) を提供するために 自動モード で /etc/hadoop-0.20/conf.empty を使います。 update-alternatives: /usr/bin/hadoop (hadoop-default) を提供するために 自動モード で /usr/bin/hadoop-0.20 を使います。 hadoop-0.20-native (0.20.2+923.256-1~lucid-cdh3) を設定しています ... : root@ubuntu:~#
疑似クラスタパッケージをインストールします。これにより、マスター、スレーブすべての処理を1台で行うホストが完成します。
root@ubuntu:~# aptitude install hadoop-0.20-conf-pseudo : 取得:1 http://archive.cloudera.com/debian/ lucid-cdh3/contrib hadoop-0.20-namenode 0.20.2+923.256-1~lucid-cdh3 [256kB] 取得:2 http://archive.cloudera.com/debian/ lucid-cdh3/contrib hadoop-0.20-datanode 0.20.2+923.256-1~lucid-cdh3 [256kB] 取得:3 http://archive.cloudera.com/debian/ lucid-cdh3/contrib hadoop-0.20-secondarynamenode 0.20.2+923.256-1~lucid-cdh3 [256kB] 取得:4 http://archive.cloudera.com/debian/ lucid-cdh3/contrib hadoop-0.20-jobtracker 0.20.2+923.256-1~lucid-cdh3 [256kB] 取得:5 http://archive.cloudera.com/debian/ lucid-cdh3/contrib hadoop-0.20-tasktracker 0.20.2+923.256-1~lucid-cdh3 [256kB] 取得:6 http://archive.cloudera.com/debian/ lucid-cdh3/contrib hadoop-0.20-conf-pseudo 0.20.2+923.256-1~lucid-cdh3 [263kB] : hadoop-0.20-namenode (0.20.2+923.256-1~lucid-cdh3) を設定しています ... update-rc.d: warning: hadoop-0.20-namenode start runlevel arguments (2 3 4 5) do not match LSB Default-Start values (3 5) update-rc.d: warning: hadoop-0.20-namenode stop runlevel arguments (0 1 6) do not match LSB Default-Stop values (0 1 2 4 6) hadoop-0.20-datanode (0.20.2+923.256-1~lucid-cdh3) を設定しています ... update-rc.d: warning: hadoop-0.20-datanode start runlevel arguments (2 3 4 5) do not match LSB Default-Start values (3 5) update-rc.d: warning: hadoop-0.20-datanode stop runlevel arguments (0 1 6) do not match LSB Default-Stop values (0 1 2 4 6) hadoop-0.20-secondarynamenode (0.20.2+923.256-1~lucid-cdh3) を設定しています ... update-rc.d: warning: hadoop-0.20-secondarynamenode start runlevel arguments (2 3 4 5) do not match LSB Default-Start values (3 5) update-rc.d: warning: hadoop-0.20-secondarynamenode stop runlevel arguments (0 1 6) do not match LSB Default-Stop values (0 1 2 4 6) hadoop-0.20-jobtracker (0.20.2+923.256-1~lucid-cdh3) を設定しています ... update-rc.d: warning: hadoop-0.20-jobtracker start runlevel arguments (2 3 4 5) do not match LSB Default-Start values (3 5) update-rc.d: warning: hadoop-0.20-jobtracker stop runlevel arguments (0 1 6) do not match LSB Default-Stop values (0 1 2 4 6) hadoop-0.20-tasktracker (0.20.2+923.256-1~lucid-cdh3) を設定しています ... update-rc.d: warning: hadoop-0.20-tasktracker start runlevel arguments (2 3 4 5) do not match LSB Default-Start values (3 5) update-rc.d: warning: hadoop-0.20-tasktracker stop runlevel arguments (0 1 6) do not match LSB Default-Stop values (0 1 2 4 6) hadoop-0.20-conf-pseudo (0.20.2+923.256-1~lucid-cdh3) を設定しています ... update-alternatives: /etc/hadoop-0.20/conf (hadoop-0.20-conf) を提供するために 自動モード で /etc/hadoop-0.20/conf.pseudo を使います。 : root@ubuntu:~#
設定を確認してみます。
root@ubuntu:~# cat /etc/hadoop-0.20/conf/core-site.xml : <property> <name>fs.default.name</name> <value>hdfs://localhost:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/var/lib/hadoop-0.20/cache/${user.name}</value> </property> :
NameNodeのURI (fs.default.name)は hdfs://localhost:8020 で、HDFS のデータを保存するローカルのディレクトリ (hadoop.tmp.dir) は /var/lib/hadoop-0.20/cache/${user.name} となります。
root@ubuntu:~# cat /etc/hadoop-0.20/conf/hdfs-site.xml : <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> : <property> <!-- specify this so that running 'hadoop namenode -format' formats the right dir --> <name>dfs.name.dir</name> <value>/var/lib/hadoop-0.20/cache/hadoop/dfs/name</value> </property> :
DataNode上にいくつコピーを作成するか (dfs.replication) は、疑似クラスタでは1つしかDataNodeがないので必然的に 1 となります。パーミッションチェック (dfs.permissions) は false なので行いません。NameNodeのデータを保存するローカルのディレクトリ (dfs.name.dir) は /var/lib/hadoop-0.20/cache/hadoop/dfs/name となります。
root@ubuntu:~# cat /etc/hadoop-0.20/conf/mapred-site.xml : <property> <name>mapred.job.tracker</name> <value>localhost:8021</value> </property> :
JobTrackerのホスト名とIPアドレス (mapred.job.tracker) は localhost:8021 です。
JAVA_HOMEを設定します。
root@ubuntu:~# cp -a /usr/lib/hadoop-0.20/conf/hadoop-env.sh /usr/lib/hadoop-0.20/conf/hadoop-env.sh.orig root@ubuntu:~# vi /usr/lib/hadoop-0.20/conf/hadoop-env.sh root@ubuntu:~# diff -u /usr/lib/hadoop-0.20/conf/hadoop-env.sh.orig /usr/lib/hadoop-0.20/conf/hadoop-env.sh --- /usr/lib/hadoop-0.20/conf/hadoop-env.sh.orig 2012-05-08 06:04:31.000000000 +0900 +++ /usr/lib/hadoop-0.20/conf/hadoop-env.sh 2012-05-29 21:29:36.530836405 +0900 @@ -7,6 +7,7 @@ # The java implementation to use. Required. # export JAVA_HOME=/usr/lib/j2sdk1.6-sun +export JAVA_HOME=/usr/local/lib/jdk1.6.0_26 # Extra Java CLASSPATH elements. Optional. # export HADOOP_CLASSPATH="<extra_entries>:$HADOOP_CLASSPATH" root@ubuntu:~#
CDHv3 疑似クラスタの実行
各デーモンを起動します。
root@ubuntu:~# /etc/init.d/hadoop-0.20-namenode start Starting Hadoop namenode daemon: starting namenode, logging to /usr/lib/hadoop-0.20/logs/hadoop-hadoop-namenode-ubuntu.out hadoop-0.20-namenode. root@ubuntu:~# root@ubuntu:~# /etc/init.d/hadoop-0.20-jobtracker start Starting Hadoop jobtracker daemon: starting jobtracker, logging to /usr/lib/hadoop-0.20/logs/hadoop-hadoop-jobtracker-ubuntu.out hadoop-0.20-jobtracker. root@ubuntu:~# root@ubuntu:~# /etc/init.d/hadoop-0.20-datanode start Starting Hadoop datanode daemon: starting datanode, logging to /usr/lib/hadoop-0.20/logs/hadoop-hadoop-datanode-ubuntu.out hadoop-0.20-datanode. root@ubuntu:~# root@ubuntu:~# /etc/init.d/hadoop-0.20-tasktracker start Starting Hadoop tasktracker daemon: starting tasktracker, logging to /usr/lib/hadoop-0.20/logs/hadoop-hadoop-tasktracker-ubuntu.out hadoop-0.20-tasktracker. root@ubuntu:~#
起動に成功したら、円周率計算プログラムを実行します。
cf@ubuntu:~$ hadoop-0.20 jar /usr/lib/hadoop-0.20/hadoop-0.20.2-cdh3u4-examples.jar pi 4 2000 Number of Maps = 4 Samples per Map = 2000 Wrote input for Map #0 Wrote input for Map #1 Wrote input for Map #2 Wrote input for Map #3 Starting Job 12/05/29 22:30:18 INFO mapred.FileInputFormat: Total input paths to process : 4 12/05/29 22:30:18 INFO mapred.JobClient: Running job: job_201205292226_0001 12/05/29 22:30:19 INFO mapred.JobClient: map 0% reduce 0% 12/05/29 22:30:25 INFO mapred.JobClient: map 50% reduce 0% 12/05/29 22:30:30 INFO mapred.JobClient: map 100% reduce 0% 12/05/29 22:30:35 INFO mapred.JobClient: map 100% reduce 33% 12/05/29 22:30:37 INFO mapred.JobClient: map 100% reduce 100% 12/05/29 22:30:38 INFO mapred.JobClient: Job complete: job_201205292226_0001 12/05/29 22:30:38 INFO mapred.JobClient: Counters: 27 12/05/29 22:30:38 INFO mapred.JobClient: Job Counters 12/05/29 22:30:38 INFO mapred.JobClient: Launched reduce tasks=1 12/05/29 22:30:38 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=18747 12/05/29 22:30:38 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 12/05/29 22:30:38 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 12/05/29 22:30:38 INFO mapred.JobClient: Launched map tasks=4 12/05/29 22:30:38 INFO mapred.JobClient: Data-local map tasks=4 12/05/29 22:30:38 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=11574 12/05/29 22:30:38 INFO mapred.JobClient: FileSystemCounters 12/05/29 22:30:38 INFO mapred.JobClient: FILE_BYTES_READ=94 12/05/29 22:30:38 INFO mapred.JobClient: HDFS_BYTES_READ=928 12/05/29 22:30:38 INFO mapred.JobClient: FILE_BYTES_WRITTEN=277187 12/05/29 22:30:38 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=215 12/05/29 22:30:38 INFO mapred.JobClient: Map-Reduce Framework 12/05/29 22:30:38 INFO mapred.JobClient: Map input records=4 12/05/29 22:30:38 INFO mapred.JobClient: Reduce shuffle bytes=112 12/05/29 22:30:38 INFO mapred.JobClient: Spilled Records=16 12/05/29 22:30:38 INFO mapred.JobClient: Map output bytes=72 12/05/29 22:30:38 INFO mapred.JobClient: CPU time spent (ms)=1510 12/05/29 22:30:38 INFO mapred.JobClient: Total committed heap usage (bytes)=558579712 12/05/29 22:30:38 INFO mapred.JobClient: Map input bytes=96 12/05/29 22:30:38 INFO mapred.JobClient: Combine input records=0 12/05/29 22:30:38 INFO mapred.JobClient: SPLIT_RAW_BYTES=456 12/05/29 22:30:38 INFO mapred.JobClient: Reduce input records=8 12/05/29 22:30:38 INFO mapred.JobClient: Reduce input groups=2 12/05/29 22:30:38 INFO mapred.JobClient: Combine output records=0 12/05/29 22:30:38 INFO mapred.JobClient: Physical memory (bytes) snapshot=874717184 12/05/29 22:30:38 INFO mapred.JobClient: Reduce output records=0 12/05/29 22:30:38 INFO mapred.JobClient: Virtual memory (bytes) snapshot=2528505856 12/05/29 22:30:38 INFO mapred.JobClient: Map output records=8 Job Finished in 20.835 seconds Estimated value of Pi is 3.14100000000000000000 cf@ubuntu:~$
このように、円周率計算に成功しました。
次に、英単語集計プログラムを実行します。
cf@ubuntu:~$ export HADOOP_HOME=/usr/lib/hadoop-0.20 cf@ubuntu:~$ export HADOOP_VERSION=0.20.2-cdh3u4 cf@ubuntu:~$ cf@ubuntu:~$ javac -classpath ${HADOOP_HOME}/hadoop-${HADOOP_VERSION}-core.jar -d wordcount_classes WordCount.java cf@ubuntu:~$ cf@ubuntu:~$ jar -cvf wordcount.jar -C wordcount_classes/ . マニフェストが追加されました。 org/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました) org/myorg/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました) org/myorg/WordCount.class を追加中です。(入 = 1546) (出 = 749)(51% 収縮されました) org/myorg/WordCount$Map.class を追加中です。(入 = 1938) (出 = 798)(58% 収縮されました) org/myorg/WordCount$Reduce.class を追加中です。(入 = 1611) (出 = 649)(59% 収縮されました) cf@ubuntu:~$
cf@ubuntu:~$ hadoop fs -mkdir /usr/joe/wordcount/input cf@ubuntu:~$ cf@ubuntu:~$ cat > file01 Hello World Bye World cf@ubuntu:~$ cat > file02 Hello Hadoop Goodbye Hadoop cf@ubuntu:~$ cf@ubuntu:~$ hadoop fs -put file01 file02 /usr/joe/wordcount/input cf@ubuntu:~$
cf@ubuntu:~$ hadoop jar wordcount.jar org.myorg.WordCount /usr/joe/wordcount/input /usr/joe/wordcount/output 12/05/29 22:53:51 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 12/05/29 22:53:51 WARN snappy.LoadSnappy: Snappy native library is available 12/05/29 22:53:51 INFO util.NativeCodeLoader: Loaded the native-hadoop library 12/05/29 22:53:51 INFO snappy.LoadSnappy: Snappy native library loaded 12/05/29 22:53:51 INFO mapred.FileInputFormat: Total input paths to process : 2 12/05/29 22:53:51 INFO mapred.JobClient: Running job: job_201205292251_0001 12/05/29 22:53:52 INFO mapred.JobClient: map 0% reduce 0% 12/05/29 22:53:59 INFO mapred.JobClient: map 66% reduce 0% 12/05/29 22:54:02 INFO mapred.JobClient: map 100% reduce 0% 12/05/29 22:54:08 INFO mapred.JobClient: map 100% reduce 33% 12/05/29 22:54:10 INFO mapred.JobClient: map 100% reduce 100% 12/05/29 22:54:10 INFO mapred.JobClient: Job complete: job_201205292251_0001 12/05/29 22:54:10 INFO mapred.JobClient: Counters: 27 12/05/29 22:54:10 INFO mapred.JobClient: Job Counters 12/05/29 22:54:10 INFO mapred.JobClient: Launched reduce tasks=1 12/05/29 22:54:10 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=12458 12/05/29 22:54:10 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 12/05/29 22:54:10 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 12/05/29 22:54:10 INFO mapred.JobClient: Launched map tasks=3 12/05/29 22:54:10 INFO mapred.JobClient: Data-local map tasks=3 12/05/29 22:54:10 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=10009 12/05/29 22:54:10 INFO mapred.JobClient: FileSystemCounters 12/05/29 22:54:10 INFO mapred.JobClient: FILE_BYTES_READ=79 12/05/29 22:54:10 INFO mapred.JobClient: HDFS_BYTES_READ=354 12/05/29 22:54:10 INFO mapred.JobClient: FILE_BYTES_WRITTEN=221338 12/05/29 22:54:10 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=41 12/05/29 22:54:10 INFO mapred.JobClient: Map-Reduce Framework 12/05/29 22:54:10 INFO mapred.JobClient: Map input records=2 12/05/29 22:54:10 INFO mapred.JobClient: Reduce shuffle bytes=91 12/05/29 22:54:10 INFO mapred.JobClient: Spilled Records=12 12/05/29 22:54:10 INFO mapred.JobClient: Map output bytes=82 12/05/29 22:54:10 INFO mapred.JobClient: CPU time spent (ms)=1220 12/05/29 22:54:10 INFO mapred.JobClient: Total committed heap usage (bytes)=426913792 12/05/29 22:54:10 INFO mapred.JobClient: Map input bytes=50 12/05/29 22:54:10 INFO mapred.JobClient: Combine input records=8 12/05/29 22:54:10 INFO mapred.JobClient: SPLIT_RAW_BYTES=300 12/05/29 22:54:10 INFO mapred.JobClient: Reduce input records=6 12/05/29 22:54:10 INFO mapred.JobClient: Reduce input groups=5 12/05/29 22:54:10 INFO mapred.JobClient: Combine output records=6 12/05/29 22:54:10 INFO mapred.JobClient: Physical memory (bytes) snapshot=681357312 12/05/29 22:54:10 INFO mapred.JobClient: Reduce output records=5 12/05/29 22:54:10 INFO mapred.JobClient: Virtual memory (bytes) snapshot=2033528832 12/05/29 22:54:10 INFO mapred.JobClient: Map output records=8 cf@ubuntu:~$
cf@ubuntu:~$ hadoop dfs -cat /usr/joe/wordcount/output/part-00000 Bye 1 Goodbye 1 Hadoop 2 Hello 2 World 2 cf@ubuntu:~$
英単語集計プログラムは正常に実行されました。