Pages

Subscribe:

Ads 468x60px

Labels

2013年12月1日 星期日

[hadoop]Hadoop 小象安裝測試在 Ubuntu

小象要開始跑

在了解大概 hadoop 能做什麼之後,就來安裝試試吧。Michael G. Noll 寫了幾份非常好的教學。 這裡就按照他的教學,一步步重做一遍。就從他的 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
新安裝的 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。
 image
使用 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 的  ...  中間:


  hadoop.tmp.dir
  /app/hadoop/tmp
  A base for other temporary directories.



  fs.default.name
  hdfs://localhost:54310
  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.
把下列的文字,加到 /usr/local/hadoop/conf/mapred-site.xml 的  ...  中間:


  mapred.job.tracker
  localhost:54311
  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.
  
把下列的文字,加到 /usr/local/hadoop/conf/hdfs-site.xml 的  ...  中間:


  dfs.replication
  1
  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.
  

如果要對設定檔多了解,可以到以下連結查看:

格式化 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:~$
原篇照我的方式走,真的太長。因此下一篇來驗證,這個系統真的可以用。


資料來源 

沒有留言:

張貼留言