小象要開始跑
在了解大概 hadoop 能做什麼之後,就來安裝試試吧。Michael G. Noll 寫了幾份非常好的教學。 這裡就按照他的教學,一步步重做一遍。就從他的 Running Hadoop On Ubuntu Linux (Single-Node Cluster) 開始讓小象跑。
http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/
而我這篇是讓我自己這個新手能夠不忘記我是怎麼安裝的筆記。
安裝 ubuntu 在 vmware 裡,完成 vmware-tool 安裝。
這一步是原來教學沒有的步驟。為了大家可以在公司、或自家的電腦試用,所以用 vmware 裝一個虛擬電腦。首先要注意,vmware-tool 的安裝跟 vmware 版本有關。vmware-tool 最重要的是可以讓 host 系統 及 guest 系統用「拖拉」、「複製貼上」的方式,交換檔案及文字。我使用的版本是 vmware 8,在裝好 ubuntu 12.04 之後,vmware-tool 可使用隨附的 8.8.0 版安裝。(vmware 7 可裝 ubuntu 11.04 配合 6.0.2。)在確認完 vmware 版本之後,就不用擔心之後會有問題了。
到 http://www.ubuntu.com/download/desktop 下載 12.04 LTS,下載 iso 檔。選擇 desktop 是因為有桌面可用,比較方便。
將 ubuntu 安裝完畢,先加入一個使用者 hduser,這是之後專門執行 hadoop 程式的使用者。
$ sudo addgroup hadoop
$ sudo adduser --ingroup hadoop hduser
hduser 要加入 sudoer 名單中,才能安裝 vmware-tool。
先用安裝者的帳號執行
$ sudo visudo
再把 hduser (ALL:ALL)=ALL 加在 root (ALL:ALL)=ALL 底下。
或把 hduser 加到 admin 的 group 裡面。(首先要確定有 admin 的 group。可參考)
$ sudo usermod -g admin hduser
然後切換使用者為 hduser。
接下來,在 vmware 的「VM」選單,按下「install VMware tool」,在虛擬電腦裡,會 mount 一個檔案。點兩下,會使用 archie manager 開啟檔案,把裡面的目錄「vmware-tools-distrib」拖到桌面上。
啟動 terminal,切換到 ~/Desktop/vmware-tools-distrib,執行
$ sudo ./vmware-install.pl
中間經過一連串的問題,都是按 enter 通過。如果有因為任何的錯誤而停下,都是因為 vmware-tools 的版本與 ubuntu 版本不合導致。我花了很多冤枉時間,才知道是版本問題。vmware 出 vmware-tools 程式一定是可以用才釋出,把版本弄對就不用白花時間。
安裝完畢,重開機一次。
設定 SSH
因為 hadoop 使用 ssh 管理它的 node,接下來要設定 ssh。
首先,產生 ssh key。
$ su - hduser # 換成 root 權限
hduser@ubuntu:~$ ssh-keygen -t rsa -P ""
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hduser/.ssh/id_rsa):
Created directory '/home/hduser/.ssh'.
Your identification has been saved in /home/hduser/.ssh/id_rsa.
Your public key has been saved in /home/hduser/.ssh/id_rsa.pub.
The key fingerprint is:
db:35:f4:ae:e3:79:48:d3:95:fa:2d:22:a8:43:5c:dd hduser@ubuntu
The key's randomart image is:
...
hduser@ubuntu:~$
第二行是產生一個不用密碼的 RSA key pari。這樣就不用 hadoop 與 node 溝通時,都要人去打密碼。
再來,把新產生的 key 放到已認證的 key 中。
hduser@ubuntu:~$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
因為 desktop 版沒有 ssh server,因此,要加裝 openssh-server
hduser@ubuntu:~$ sudo apt-get install openssh-server
測試一下能不能連上 ssh server。因為這版的 server 預設使用 ECDSA 所以,ssh 的指令要強迫使用 rsa。
hduser@ubuntu:~$ ssh -oHostKeyAlgorithms='ssh-rsa' localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
RSA key fingerprint is a3:99:7f:2b:8e:92:34:20:59:2f:2d:10:94:c9:60:74.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Welcome to Ubuntu 12.10 (GNU/Linux 3.5.0-17-generic i686)* Documentation: https://help.ubuntu.com/
222 packages can be updated.
52 updates are security updates.Last login: Mon Dec 24 00:56:30 2012 from localhost
hduser@ubuntu:~$ exit
logout
Connection to localhost closed.
hduser@ubuntu:~$
另一個解決辦法是產生 ECDSA,並使用 ECDSA。
hduser@ubuntu:~$ ssh-keygen -t ecdsa -P ""
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/hduser/.ssh/id_ecdsa):
Your identification has been saved in /home/hduser/.ssh/id_ecdsa.
Your public key has been saved in /home/hduser/.ssh/id_ecdsa.pub.
The key fingerprint is:
27:64:63:de:16:4b:97:f4:58:96:11:46:6d:a2:24:7e hduser@ubuntu
The key's randomart image is:
因為後續的過程中,按照這個教學的話,hadoop 會自然的使用 ECDSA,所以,還是要用 ECDSA 的方式把 key 加到 .ssh/authorized_keys 裡面。
hduser@ubuntu:~$ cat $HOME/.ssh/id_ecdsa.pub >> $HOME/.ssh/authorized_keys
Noll 先生說,如果有遇到問題,要檢查一下在 /etc/ssh/sshd_config 裡:
- PubkeyAuthentication 應該是 yes。
- AllowUsers 如果有打開,則要把 hduser 加進去。
- 如果 ssh server 的設定有異動,要強迫 ssh server 重載設定。 $ sudo /etc/init.d/ssh reload
安裝 java
java 至少要用到 ,我們可以使用指令來檢查 java 版本
hduser@ubuntu:~$ java -version
The program 'java' can be found in the following packages:
* default-jre
* gcj-4.6-jre-headless
* gcj-4.7-jre-headless
* openjdk-7-jre-headless
* openjdk-6-jre-headless
Try: sudo apt-get install <selected package>
新安裝的 ubuntu 12.04 desktop LTS 沒有裝 java runtime。要自己安裝。
hduser@ubuntu:~$ sudo apt-get install default-jre
…
hduser@ubuntu:~$ java -version
java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.3) (7u9-2.3.3-0ubuntu1~12.10.1)
OpenJDK Client VM (build 23.2-b09, mixed mode, sharing)
hduser@ubuntu:~$
安裝小象
從 Apache 下載 hadoop,目前穩定版是 1.0.4,到 http://www.apache.org/dyn/closer.cgi/hadoop/common/ 它會給你最近的 mirror 站點。下載 1.0.4 版的 hadoop-1.0.4.tar.gz。
使用 firefox 下載,預設會放到 ~/Downloads 裡面。點兩下 hadoop-1.0.4.tar.gz,archive manager 會打開該壓縮檔,把裡面的目錄 hadoop-1.0.4 拉到桌面,改名為 hadoop,再移到 /usr/local 裡面去。使用指令
hduser@ubuntu:~$ sudo mv Desktop/hadoop/ /usr/local/
[sudo] password for hduser:
hduser@ubuntu:~$ ls -l /usr/local
total 36
drwxr-xr-x 2 root root 4096 Oct 17 07:56 bin
drwxr-xr-x 2 root root 4096 Oct 17 07:56 etc
drwxr-xr-x 2 root root 4096 Oct 17 07:56 games
drwxr-xr-x 14 hduser hadoop 4096 Dec 24 01:09 hadoop
drwxr-xr-x 2 root root 4096 Oct 17 07:56 include
drwxr-xr-x 4 root root 4096 Oct 17 07:59 lib
lrwxrwxrwx 1 root root 9 Dec 13 10:10 man -> share/man
drwxr-xr-x 2 root root 4096 Oct 17 07:56 sbin
drwxr-xr-x 7 root root 4096 Oct 17 08:00 share
drwxr-xr-x 2 root root 4096 Oct 17 07:56 src
接下來要設定 .bashrc。(ubuntu 預設是用 bash。)使用指令開啟 .bashrc 來改。
hduser@ubuntu:~$ gedit .bashrc
在檔案的最後加進以下的設定。(原文中的 HADOOP_HOME 的設定已經要改用 HADOOP_PREFIX。)
################# for hadoop settings ##############
# Set Hadoop-related environment variables
export HADOOP_PREFIX=/usr/local/hadoop# Set JAVA_HOME (we will also configure JAVA_HOME directly for Hadoop later on)
export JAVA_HOME=/usr/lib/jvm/default-java# Some convenient aliases and functions for running Hadoop-related commands
unalias fs &> /dev/null
alias fs="hadoop fs"
unalias hls &> /dev/null
alias hls="fs -ls"# If you have LZO compression enabled in your Hadoop cluster and
# compress job outputs with LZOP (not covered in this tutorial):
# Conveniently inspect an LZOP compressed file from the command
# line; run via:
#
# $ lzohead /hdfs/path/to/lzop/compressed/file.lzo
#
# Requires installed 'lzop' command.
#
lzohead () {
hadoop fs -cat $1 | lzop -dc | head -1000 | less
}# Add Hadoop bin/ directory to PATH
export PATH=$PATH:$HADOOP_PREFIX/bin
其他使用者要用 hadoop 的,也要更新這個 ~/.bashrc
設定 hadoop -- 1
第一個要處理的是 hadoop-env.sh
hduser@ubuntu:~$ gedit /usr/local/hadoop/conf/hadoop-env.sh
把裡面的
# export JAVA_HOME=/usr/lib/j2sdk1.5-sun
的底下,加上
export JAVA_HOME=/usr/lib/jvm/default-java
再來要把 ipv6 關掉。檔案的最後加上
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
設定 hadoop -- 2
接下來是 core-site.xml,這是設定 hadoop 要在真實檔案系統的位置。因此,先建立一個目錄給 hadoop 使用。
hduser@ubuntu:~$ sudo mkdir -p /app/hadoop/tmp
[sudo] password for hduser:
hduser@ubuntu:~$ ls -l /app/hadoop/
total 4
drwxr-xr-x 2 root root 4096 Dec 24 02:02 tmp
hduser@ubuntu:~$ sudo chown hduser:hadoop /app/hadoop/tmp
hduser@ubuntu:~$ ls -l /app/hadoop/
total 4
drwxr-xr-x 2 hduser hadoop 4096 Dec 24 02:02 tmp
hduser@ubuntu:~$ sudo chmod 750 /app/hadoop/tmp
hduser@ubuntu:~$ ls -l /app/hadoop/
total 4
drwxr-x--- 2 hduser hadoop 4096 Dec 24 02:02 tmp
hduser@ubuntu:~$
把下列的文字,加到 /usr/local/hadoop/conf/core-site.xml 的 <configuration> ... </configuration> 中間:
<!-- In: conf/core-site.xml -->
<property>
<name>hadoop.tmp.dir</name>
<value>/app/hadoop/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:54310</value>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>
把下列的文字,加到 /usr/local/hadoop/conf/mapred-site.xml 的 <configuration> ... </configuration> 中間:
<!-- In: conf/mapred-site.xml -->
<property>
<name>mapred.job.tracker</name>
<value>localhost:54311</value>
<description>The host and port that the MapReduce job tracker runs
at. If "local", then jobs are run in-process as a single map
and reduce task.
</description>
</property>
把下列的文字,加到 /usr/local/hadoop/conf/hdfs-site.xml 的 <configuration> ... </configuration> 中間:
<!-- In: conf/hdfs-site.xml -->
<property>
<name>dfs.replication</name>
<value>1</value>
<description>Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
</description>
</property>
如果要對設定檔多了解,可以到以下連結查看:
http://wiki.apache.org/hadoop/GettingStartedWithHadoop
http://hadoop.apache.org/core/docs/current/api/overview-summary.html
格式化 HDFS 的檔案系統
Noll 先生在這非常強調,不要對正在使用中的系統做格式化的動作。該系統資料會消失。
我們這個新系統要啟用,則必須先格式化檔案系統。
hduser@ubuntu:~$ /usr/local/hadoop/bin/hadoop namenode -format
結果如下:
hduser@ubuntu:~$ /usr/local/hadoop/bin/hadoop namenode -format
12/12/24 02:14:23 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = ubuntu/127.0.1.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 1.0.4
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290; compiled by 'hortonfo' on Wed Oct 3 05:13:58 UTC 2012
************************************************************/
12/12/24 02:14:23 INFO util.GSet: VM type = 32-bit
12/12/24 02:14:23 INFO util.GSet: 2% max memory = 19.33375 MB
12/12/24 02:14:23 INFO util.GSet: capacity = 2^22 = 4194304 entries
12/12/24 02:14:23 INFO util.GSet: recommended=4194304, actual=4194304
12/12/24 02:14:24 INFO namenode.FSNamesystem: fsOwner=hduser
12/12/24 02:14:24 INFO namenode.FSNamesystem: supergroup=supergroup
12/12/24 02:14:24 INFO namenode.FSNamesystem: isPermissionEnabled=true
12/12/24 02:14:24 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
12/12/24 02:14:24 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
12/12/24 02:14:24 INFO namenode.NameNode: Caching file names occuring more than 10 times
12/12/24 02:14:25 INFO common.Storage: Image file of size 112 saved in 0 seconds.
12/12/24 02:14:25 INFO common.Storage: Storage directory /app/hadoop/tmp/dfs/name has been successfully formatted.
12/12/24 02:14:25 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at ubuntu/127.0.1.1
************************************************************/
hduser@ubuntu:~$
啟動 cluster
到了要啟動系統的時候,使用指令:
hduser@ubuntu:~$ /usr/local/hadoop/bin/start-all.sh
看到以下的 log 就代表成功了。
hduser@ubuntu:~$ /usr/local/hadoop/bin/start-all.sh
starting namenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-namenode-ubuntu.out
localhost: starting datanode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-datanode-ubuntu.out
localhost: starting secondarynamenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-secondarynamenode-ubuntu.out
starting jobtracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-jobtracker-ubuntu.out
localhost: starting tasktracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-tasktracker-ubuntu.out
hduser@ubuntu:~$
利用 jps 來看是否已啟動
Noll 先生說可以使用 jps 來看啟動是否成功。但新裝的 ubuntu 沒有這東西。
The program 'jps' can be found in the following packages:
* openjdk-6-jdk
* openjdk-7-jdk
Ask your administrator to install one of them
於是,安裝 openjdk-7-jdk
sudo apt-get install openjdk-7-jdk
再試一次
hduser@ubuntu:~$ jps
7516 TaskTracker
7287 SecondaryNameNode
7839 DataNode
12038 Jps
6491 NameNode
6901 JobTracker
hduser@ubuntu:~$
也可以用 netstat 來看監聽的 port 是否有開。
hduser@ubuntu:~$ sudo netstat -plten | grep java
停止 single-node cluster
使用這個指令:
hduser@ubuntu:~$ /usr/local/hadoop/bin/stop-all.sh
會看到:
hduser@ubuntu:~$ /usr/local/hadoop/bin/stop-all.sh
stopping jobtracker
localhost: Agent admitted failure to sign using the key.
localhost: stopping tasktracker
stopping namenode
localhost: Agent admitted failure to sign using the key.
localhost: stopping datanode
localhost: Agent admitted failure to sign using the key.
localhost: no secondarynamenode to stop
hduser@ubuntu:~$
原篇照我的方式走,真的太長。因此下一篇來驗證,這個系統真的可以用。