hadoop開發環境搭建:利用Cloudera實現Hadoop?

Tags: 環境, 主機,

hadoop開發環境搭建:利用Cloudera實現Hadoop

1.1 安裝

規劃好了就開始安裝Hadoop,如前言中所說使用Cloudera的Hadoop釋出版安裝Hadoop是十分方便的,首先當然是在每臺主機上一個乾淨的作業系統(我用的是Ubuntu 8.04,使用者設為Hadoop,其它的版本應該差不多),然後就是安裝Hadoop了(這樣安裝的是Hadoop-0.20,也可以安裝Hadoop-0.18的版本,反正安裝步驟都差不多。注意,不能同時啟用Hadoop-0.20和Hadoop-0.18)。由於每臺機器安裝步驟都一樣,這裡就寫出了一臺主機的安裝步驟,主要分為以下幾個步驟:

1.1.1 設定Cloudera的源

生成Cloudera原始檔(這裡採用的是Hadoop-0.20版本,源資訊可能過時,最新資訊請參見官方文件:http://archive.cloudera.com/docs/_apt.html ):

sudo vi /etc/apt/sources.list.d/cloudera.list

#穩定版(Hadoop-0.18)

#deb http://archive.cloudera.com/debian hardy-stable contrib

#deb-src http://archive.cloudera.com/debian hardy-stable contrib

#測試版(Hadoop-0.20)

deb http://archive.cloudera.com/debian hardy-testing contrib

deb-src http://archive.cloudera.com/debian hardy-testing contrib

生成源的金鑰:

sudo apt-get install curl

curl -s sudo apt-key add -

1.1.2 安裝Hadoop

更新源包索引:

sudo apt-get update

sudo apt-get dist-upgrade

安裝Hadoop:

sudo apt-get install hadoop-0.20 hadoop-0.20-conf-pseudo

1.2 部署

安裝好這幾臺主機的Hadoop環境之後,就要對它們進行分散式執行模式的部署了,首先是設定它們之間的互聯。

1.2.1 主機互聯

Hadoop環境中的互聯是指各主機之間網路暢通,機器名與IP地址之間解析正常,可以從任一主機ping通其它主機的主機名。注意,這裡指的是主機名,即在Hadoop-01主機上可以通過命令ping Hadoop-02來ping通Hadoop-02主機(同理,要求這幾臺主機都能相互Ping通各自的主機名)。可以通過在各主機的/etc/hosts檔案來實現,具體設定如下:

sudo vi /etc/hosts

127.0.0.1 localhost

10.x.253.201 hadoop-01 hadoop-01

10.x.253.202 hadoop-02 hadoop-02

10.x.253.203 hadoop-03 hadoop-03

10.x.253.204 hadoop-04 hadoop-04

10.x.3.30 firehare-303 firehare-303

將每個主機的hosts檔案都改成上述設定,這樣就實現了主機間使用主機名互聯的要求。

注:如果深究起來,並不是所有的主機都需要知道Hadoop環境中其它主機主機名的。其實只是作為主節點的主機(如NameNode、JobTracker),需要在該主節點hosts檔案中加上Hadoop環境中所有機器的IP地址及其對應的主機名,如果該臺機器作Datanode用,則只需要在hosts檔案中加上本機和主節點機器的IP地址與主機名即可(至於JobTracker主機是否也要同NameNode主機一樣加上所有機器的IP和主機名,本人由於沒有環境,不敢妄言,但猜想是要加的,如果哪位兄弟有興趣,倒是不妨一試)。在這裡只是由於要作測試,作為主節點的主機可能會改變,加上本人比較懶,所以就全加上了。:)

注意2:ubuntu 原有的 /etc/hosts 檔案中有將本機計算機名解析為 127.0.1.1 的欄位,例如:

127.0.1.1 hadoop-01

請務必刪除,否則會由於繫結 ip 不正確導致namenode和jobtracker無法連線的問題。

1.2.1.1 主機互聯的可選方法(配置複雜並不推薦)

如果各個主機使用 dhcp 動態分配地址且不具有網路管理員許可權,或者由於 /etc/hosts 檔案的修改量過大,對於同一子網中的主機可以同過架設一個 WINS 服務或使用網路中有的 WINS 服務來解決互聯問題。相關的包可以通過執行 tasksel 命令,安裝 samba client 包獲得,安裝之後還需要修改 /etc/samba/smb.conf 架設或設定 WINS 服務,並修改 /etc/nsswitch.conf 新增機器名的解析方式。

1.2.2 計算帳號設定

Hadoop要求所有機器上hadoop的部署目錄結構要相同,並且都有一個相同使用者名稱的帳戶。由於這裡採用的是Cloudera釋出的Hadoop包,所以並不需要這方面的設定,大家瞭解一下即可。

1.2.3 SSH設定

在 Hadoop 分散式環境中,主節點(NameNode、JobTracker) 需要通過 SSH 來啟動和停止從節點(DataNode、TeskTracker)上的各類程序。因此需要保證環境中的各臺機器均可以通過 SSH 登入訪問,並且主節點用 SSH 登入從節點時,不需要輸入密碼,這樣主節點才能在後臺自如地控制其它結點。可以將各臺機器上的 SSH 配置為使用無密碼公鑰認證方式來實現。 Ubuntu上的SSH協議的開源實現是OpenSSH, 預設狀態下是沒有安裝的,如需使用需要進行安裝。

1.2.3.1 安裝OpenSSH

安裝OpenSSH很簡單,只需要下列命令就可以把openssh-client和openssh-server給安裝好:

sudo apt-get install ssh

1.2.3.2 設定OpenSSH的無密碼公鑰認證

首先在Hadoop-01機器上執行以下命令:

[email protected]:~$ ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):(在這裡直接回車)

Enter same passphrase again:(在這裡直接回車)

Your identification has been saved in /home/hadoop/.ssh/id_rsa.

Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.

The key fingerprint is:

9d:42:04:26:00:51:c7:4e:2f:7e:38:dd:93:1c:a2:d6 [email protected]

上述命令將為主機hadoops-01上的當前使用者hadoop生成其金鑰對,該金鑰對被儲存在/home/hadoop/.ssh/id_rsa檔案中,同時命令所生成的證書以及公鑰也儲存在該檔案所在的目錄中(在這裡是:/home/hadoop/.ssh),並形成兩個檔案 id_rsa,id_rsa.pub。然後將 id_rsa.pub 檔案的內容複製到每臺主機(其中包括本機hadoop-01)的/home/hadoop/.ssh/authorized_keys檔案的尾部,如果該檔案不存在,可手工建立一個。

注意:id_rsa.pub 檔案的內容是長長的一行,複製時不要遺漏字元或混入了多餘換行符。

1.2.3.3 無密碼公鑰SSH的連線測試

從 hadoop-01 分別向 hadoop-01, hadoop-04, firehare-303 發起 SSH 連線請求,確保不需要輸入密碼就能 SSH 連線成功。注意第一次 SSH 連線時會出現類似如下提示的資訊:

The authenticity of host [hadoop-01] can't be established. The key fingerprint is:

c8:c2:b2:d0:29:29:1a:e3:ec:d9:4a:47:98:29:b4:48 Are you sure you want to continue connecting (yes/no)?

請輸入 yes, 這樣 OpenSSH 會把連線過來的這臺主機的資訊自動加到 /home/hadoop/.ssh/know_hosts 檔案中去,第二次再連線時,就不會有這樣的提示資訊了。

1.2.4 設定主節點的Hadoop

1.2.4.1 設定JAVA_HOME

Hadoop的JAVA_HOME是在檔案/etc/hadoop/conf/hadoop-env.sh中設定,具體設定如下:

sudo vi /etc/hadoop/conf/hadoop-env.sh

export JAVA_HOME="/usr/lib/jvm/java-6-sun"

1.2.4.2 Hadoop的核心配置

Hadoop的核心配置檔案是/etc/hadoop/conf/core-site.xml,具體配置如下:

fs.default.name

hdfs://hadoop-01:8020

hadoop.tmp.dir

/var/lib/hadoop-0.20/cache/${user.name}

1.2.4.3 設定Hadoop的分散式儲存環境

Hadoop的分散式環境設定主要是通過檔案/etc/hadoop/conf/hdfs-site.xml來實現的,具體配置如下:

dfs.replication

3

dfs.permissions

false

dfs.name.dir

/var/lib/hadoop-0.20/cache/hadoop/dfs/name

1.2.4.4 設定Hadoop的分散式計算環境

Hadoop的分散式計算是採用了Map/Reduce演算法,該演算法環境的設定主要是通過檔案/etc/hadoop/conf/mapred-site.xml來實現的,具體配置如下:

mapred.job.tracker

hadoop-01:8021

1.2.4.5 設定Hadoop的主從節點

首先設定主節點,編輯/etc/hadoop/conf/masters檔案,如下所示:

hadoop-01

然後是設定從節點,編輯/etc/hadoop/conf/slaves檔案,如下所示:

hadoop-02

hadoop-03

hadoop-04

firehare-303

1.2.5 設定從節點上的Hadoop

從節點上的Hadoop設定很簡單,只需要將主節點上的Hadoop設定,複製一份到從節點上即可。

scp -r /etc/hadoop/conf hadoop-02:/etc/hadoop

scp -r /etc/hadoop/conf hadoop-03:/etc/hadoop

scp -r /etc/hadoop/conf hadoop-04:/etc/hadoop

scp -r /etc/hadoop/conf firehare-303:/etc/hadoop

1.3 啟動Hadoop

1.3.1 格式化分散式檔案系統

在啟動Hadoop之前還要做最後一個準備工作,那就是格式化分散式檔案系統,這個只需要在主節點做就行了,具體如下:

/usr/lib/hadoop-0.20/bin/hadoop namenode -format

1.3.2 啟動Hadoop服務

啟動Hadoop可以通過以下命令來實現:

/usr/lib/hadoop-0.20/bin/start-all.sh

注意:該命令是沒有加sudo的,如果加了sudo就會提示出錯資訊的,因為root使用者並沒有做無驗證ssh設定。以下是輸出資訊,注意hadoop-03是故意沒接的,所以出現No route to host資訊。

[email protected]:~$ /usr/lib/hadoop-0.20/bin/start-all.sh

namenode running as process 4836. Stop it first.

hadoop-02: starting datanode, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-datanode-hadoop-02.out

hadoop-04: starting datanode, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-datanode-hadoop-04.out

firehare-303: starting datanode, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-datanode-usvr-303b.out

hadoop-03: ssh: connect to host hadoop-03 port 22: No route to host

hadoop-01: secondarynamenode running as process 4891. Stop it first.

jobtracker running as process 4787. Stop it first.

hadoop-02: starting tasktracker, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-tasktracker-hadoop-02.out

hadoop-04: starting tasktracker, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-tasktracker-hadoop-04.out

firehare-303: starting tasktracker, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-tasktracker-usvr-303b.out

hadoop-03: ssh: connect to host hadoop-03 port 22: No route to host

這樣Hadoop就正常啟動了!

正常啟動之後,可以在 master 主機上通過以下網址檢視 hadoop 執行狀況:

http://localhost:50070/ , 檢視分散式檔案系統狀況,其中 Live Nodes 欄位應當顯示為正常執行並連線到 namenode 伺服器的 datanode 個數。

http://localhost:50030/ , 檢視叢集運轉狀況,其中 Nodes 欄位應當顯示正常執行並連線到 jobtracker 的 task tracker 個數。

1.3.3 通過 cloudera 提供的服務包實現服務的自啟動(可選)

通過安裝 cloudera 提供的服務包,可以實現每次開機之後,hadoop 服務自動啟動。

首先,在 master 對應的機器上安裝 hadoop-0.20-jobtracker 和 hadoop-0.20-namenode 包。

sudo apt-get install hadoop-0.20-jobtracker hadoop-0.20-namenode

在 slave 對應機器上安裝 hadoop-0.20-tasktracker 和 hadoop-0.20-datanode 包

sudo apt-get install hadoop-0.20-tasktracker hadoop-0.20-datanode

重新啟動這些機器,可以通過上節提到的兩個網址檢視系統執行狀況。

1.4 測試Hadoop

Hadoop架設好了,接下來就是要對其進行測試,看看它是否能正常工作,具體程式碼如下:

[email protected]:~$ hadoop-0.20 fs -mkdir input

[email protected]:~$ hadoop-0.20 fs -put /etc/hadoop-0.20/conf/*.xml input

[email protected]:~$ hadoop-0.20 fs -ls input

Found 6 items

-rw-r--r-- 3 hadoop supergroup 3936 2010-03-11 08:55 /user/hadoop/input/capacity-scheduler.xml

-rw-r--r-- 3 hadoop supergroup 400 2010-03-11 08:55 /user/hadoop/input/core-site.xml

-rw-r--r-- 3 hadoop supergroup 3032 2010-03-11 08:55 /user/hadoop/input/fair-scheduler.xml

-rw-r--r-- 3 hadoop supergroup 4190 2010-03-11 08:55 /user/hadoop/input/hadoop-policy.xml

-rw-r--r-- 3 hadoop supergroup 536 2010-03-11 08:55 /user/hadoop/input/hdfs-site.xml

-rw-r--r-- 3 hadoop supergroup 266 2010-03-11 08:55 /user/hadoop/input/mapred-site.xml

[email protected]:~$ hadoop-0.20 jar /usr/lib/hadoop-0.20/hadoop-*-examples.jar grep input output 'dfs[a-z.]+'

10/03/11 14:35:57 INFO mapred.FileInputFormat: Total input paths to process : 6

10/03/11 14:35:58 INFO mapred.JobClient: Running job: job_201003111431_0001

10/03/11 14:35:59 INFO mapred.JobClient: map 0% reduce 0%

10/03/11 14:36:14 INFO mapred.JobClient: map 33% reduce 0%

10/03/11 14:36:20 INFO mapred.JobClient: map 66% reduce 0%

10/03/11 14:36:26 INFO mapred.JobClient: map 66% reduce 22%

10/03/11 14:36:36 INFO mapred.JobClient: map 100% reduce 22%

10/03/11 14:36:44 INFO mapred.JobClient: map 100% reduce 100%

10/03/11 14:36:46 INFO mapred.JobClient: Job complete: job_201003111431_0001

10/03/11 14:36:46 INFO mapred.JobClient: Counters: 19

10/03/11 14:36:46 INFO mapred.JobClient: Job Counters

10/03/11 14:36:46 INFO mapred.JobClient: Launched reduce tasks=1

10/03/11 14:36:46 INFO mapred.JobClient: Rack-local map tasks=4

10/03/11 14:36:46 INFO mapred.JobClient: Launched map tasks=6

10/03/11 14:36:46 INFO mapred.JobClient: Data-local map tasks=2

10/03/11 14:36:46 INFO mapred.JobClient: FileSystemCounters

10/03/11 14:36:46 INFO mapred.JobClient: FILE_BYTES_READ=100

10/03/11 14:36:46 INFO mapred.JobClient: HDFS_BYTES_READ=12360

10/03/11 14:36:46 INFO mapred.JobClient: FILE_BYTES_WRITTEN=422

10/03/11 14:36:46 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=204

10/03/11 14:36:46 INFO mapred.JobClient: Map-Reduce Framework

10/03/11 14:36:46 INFO mapred.JobClient: Reduce input groups=4

10/03/11 14:36:46 INFO mapred.JobClient: Combine output records=4

10/03/11 14:36:46 INFO mapred.JobClient: Map input records=315

10/03/11 14:36:46 INFO mapred.JobClient: Reduce shuffle bytes=124

10/03/11 14:36:46 INFO mapred.JobClient: Reduce output records=4

10/03/11 14:36:46 INFO mapred.JobClient: Spilled Records=8

10/03/11 14:36:46 INFO mapred.JobClient: Map output bytes=86

10/03/11 14:36:46 INFO mapred.JobClient: Map input bytes=12360

10/03/11 14:36:46 INFO mapred.JobClient: Combine input records=4

10/03/11 14:36:46 INFO mapred.JobClient: Map output records=4

10/03/11 14:36:46 INFO mapred.JobClient: Reduce input records=4

10/03/11 14:36:46 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.

10/03/11 14:36:46 INFO mapred.FileInputFormat: Total input paths to process : 1

10/03/11 14:36:46 INFO mapred.JobClient: Running job: job_201003111431_0002

10/03/11 14:36:47 INFO mapred.JobClient: map 0% reduce 0%

10/03/11 14:36:56 INFO mapred.JobClient: map 100% reduce 0%

10/03/11 14:37:08 INFO mapred.JobClient: map 100% reduce 100%

10/03/11 14:37:10 INFO mapred.JobClient: Job complete: job_201003111431_0002

10/03/11 14:37:11 INFO mapred.JobClient: Counters: 18

10/03/11 14:37:11 INFO mapred.JobClient: Job Counters

10/03/11 14:37:11 INFO mapred.JobClient: Launched reduce tasks=1

10/03/11 14:37:11 INFO mapred.JobClient: Launched map tasks=1

10/03/11 14:37:11 INFO mapred.JobClient: Data-local map tasks=1

10/03/11 14:37:11 INFO mapred.JobClient: FileSystemCounters

10/03/11 14:37:11 INFO mapred.JobClient: FILE_BYTES_READ=100

10/03/11 14:37:11 INFO mapred.JobClient: HDFS_BYTES_READ=204

10/03/11 14:37:11 INFO mapred.JobClient: FILE_BYTES_WRITTEN=232

10/03/11 14:37:11 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=62

10/03/11 14:37:11 INFO mapred.JobClient: Map-Reduce Framework

10/03/11 14:37:11 INFO mapred.JobClient: Reduce input groups=1

10/03/11 14:37:11 INFO mapred.JobClient: Combine output records=0

10/03/11 14:37:11 INFO mapred.JobClient: Map input records=4

10/03/11 14:37:11 INFO mapred.JobClient: Reduce shuffle bytes=0

10/03/11 14:37:11 INFO mapred.JobClient: Reduce output records=4

10/03/11 14:37:11 INFO mapred.JobClient: Spilled Records=8

10/03/11 14:37:11 INFO mapred.JobClient: Map output bytes=86

10/03/11 14:37:11 INFO mapred.JobClient: Map input bytes=118

10/03/11 14:37:11 INFO mapred.JobClient: Combine input records=0

10/03/11 14:37:11 INFO mapred.JobClient: Map output records=4

10/03/11 14:37:11 INFO mapred.JobClient: Reduce input records=4

不難看出,上述測試已經成功,這說明Hadoop部署成功,能夠在上面進行Map/Reduce分佈性計算了。

1.5 開發環境

1.7.1 使用 netbeans 及其 hadoop 外掛

安裝 netbeans:

sudo apt-get install netbeans

安裝並配置 hadoop 外掛可以參見:

原作者: 北風網

環境, 主機,
相關問題答案