fbpx

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:~$

英単語集計プログラムは正常に実行されました。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA