Hadoop叢集完全分散式模式環境部署

shilei1發表於2016-09-01

Hadoop簡介

        Hadoop是Apache軟體基金會旗下的一個開源分散式計算平臺。以Hadoop分散式檔案系統(HDFS,Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的開源實現)為核心的Hadoop為使用者提供了系統底層細節透明的分散式基礎架構。

對於Hadoop的叢集來講,可以分成兩大類角色:Master和Salve。一個HDFS叢集是由一個NameNode和若干個DataNode組成的。其中NameNode作為主伺服器,管理檔案系統的名稱空間和客戶端對檔案系統的訪問操作;叢集中的DataNode管理儲存的資料。MapReduce框架是由一個單獨執行在主節點上的JobTracker和執行在每個叢集從節點的TaskTracker共同組成的。主節點負責排程構成一個作業的所有任務,這些任務分佈在不同的從節點上。主節點監控它們的執行情況,並且重新執行之前的失敗任務;從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接收到提交作業和配置資訊之後,就會將配置資訊等分發給從節點,同時排程任務並監控TaskTracker的執行。

從上面的介紹可以看出,HDFS和MapReduce共同組成了Hadoop分散式系統體系結構的核心。HDFS在叢集上實現分散式檔案系統,MapReduce在叢集上實現了分散式計算和任務處理。HDFS在MapReduce任務處理過程中提供了檔案操作和儲存等支援,MapReduce在HDFS的基礎上實現了任務的分發、跟蹤、執行等工作,並收集結果,二者相互作用,完成了Hadoop分散式叢集的主要任務。

先決條件

1) 確保在你叢集中的每個節點上都安裝了所有必需軟體:sun-JDK ssh Hadoop。

2) JavaTM1.5.x,必須安裝,建議選擇Sun公司發行的Java版本。

3) ssh 必須安裝並且保證 sshd一直執行,以便用Hadoop 指令碼管理遠端Hadoop守護程式。

實驗環境

操作平臺:vmware

作業系統:CentOS 5.9

軟體版本:hadoop-1.2.1,jdk-6u45

叢集架構:包括4個節點:1個Master,3個Salve,節點之間區域網連線,可以相互ping通。節點IP地址分佈如下:

主機名

IP

系統版本

Hadoop node

hadoop程式名

Master

192.168.137.100

CetOS 5.9

master

namenode,jobtracker

Slave1

192.168.137.101

CetOS 5.9

slave

datanode,tasktracker

Slave2

192.168.137.102

CetOS 5.9

slave

datanode,tasktracker

Slave3

192.168.137.103

CetOS 5.9

slave

datanode,tasktracker

四個節點上均是CentOS5.9系統,並且有一個相同的使用者hadoop。Master機器主要配置NameNode和JobTracker的角色,負責總管分散式資料和分解任務的執行;3個Salve機器配置DataNode和TaskTracker的角色,負責分散式資料儲存以及任務的執行。

安裝步驟

下載:jdk-6u45-linux-x64.bin , hadoop-1.2.1.tar.gz (主機名和網路配置略)

說明:在生產的hadoop叢集環境中,由於伺服器可能會有許多臺,透過配置DNS對映機器名,相比配置/etc/host方法,可以避免在每個節點都配置各自的host檔案,而且在新增節點時也不需要修改每個節點的/etc/host的主機名-IP對映檔案。減少了配置步驟和時間,便於管理。

1、JDK安裝

#/bin/bash jdk-6u45-linux-x64.bin

#mv jdk1.6.0_45 /usr/local/

新增java環境變數:

#vim /etc/profile

#最後新增

# set java environment

export JAVA_HOME=/usr/local/jdk1.6.0_45/

export JRE_HOME=/usr/local/jdk1.6.0_45/jre

export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

生效java變數:

#source /etc/profile

# java -version

java version "1.6.0_45"

Java(TM) SE Runtime Environment (build 1.6.0_45-b06)

Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

在所有的機器上都建立相同的目錄,也可以就建立相同的使用者,最好是以該使用者的home路徑來做hadoop的安裝路徑。安裝路徑都是:/home/hadoop/hadoop-1.2.1

#useradd hadoop

#passwd hadoop

2、SSH配置

在Hadoop啟動以後,Namenode是透過SSH(Secure Shell)來啟動和停止各個datanode上的各種守護程式的,這就須要在節點之間執行指令的時候是不須要輸入密碼的形式,故我們須要配置SSH運用無密碼公鑰認證的形式。以本文中的四臺機器為例,現在Master是主節點,他須要連線Slave1、Slave2和Slave3。須要確定每臺機器上都安裝了ssh,並且datanode機器上sshd服務已經啟動。

切換到hadoop使用者( 保證使用者hadoop可以無需密碼登入,因為我們後面安裝的hadoop屬主是hadoop使用者。)

1) 在每臺主機生成金鑰對

#su - hadoop

#ssh-keygen -t rsa#cat ~/.ssh/id_rsa.pub

這個命令生成一個金鑰對:id_rsa(私鑰檔案)和id_rsa.pub(公鑰檔案)。預設被儲存在~/.ssh/目錄下。

2) 將Master公鑰新增到遠端主機Slave1的 authorized_keys 檔案中

在/home/hadoop/.ssh/下建立authorized_keys

#vim authorized_keys

將剛才複製的公鑰複製進去

許可權設定為600.(這點很重要,網沒有設定600許可權會導致登陸失敗)

測試登陸:

$ ssh Slave1

The authenticity of host 'slave2 (192.168.137.101)' can't be established.

RSA key fingerprint is d5:18:cb:5f:92:66:74:c7:30:30:bb:36:bf:4c:ed:e9.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'slave2,192.168.137.101' (RSA) to the list of known hosts.

Last login: Fri Aug 30 21:31:36 2013 from slave1

[hadoop@Slave1 ~]$

同樣的方法,將Master 的公鑰複製到其他節點。

3、安裝Hadoop

1) 切換為hadoop使用者,下載安裝包後,直接解壓安裝即可:

#su - hadoop

#wget 

#tar -zxvf hadoop-1.2.1.tar.gz

我的安裝目錄為:

/home/hadoop/hadoop-1.2.1

為了方便,使用hadoop命令或者start-all.sh等命令,修改Master上/etc/profile 新增以下內容:

export HADOOP_HOME=/home/hadoop/hadoop-1.2.1

export PATH=$PATH:$HADOOP_HOME/bin

修改完畢後,執行source /etc/profile 來使其生效。

2) 配置conf/hadoop-env.sh檔案

配置conf/hadoop-env.sh檔案,新增:

export JAVA_HOME=/usr/local/jdk1.6.0_45/

這裡修改為你的jdk的安裝位置。

測試hadoop安裝:

/home/hadoop/hadoop-1.2.1/bin/hadoop jar hadoop-0.20.2-examples.jarwordcount conf/ /tmp/out

4、叢集配置(所有節點相同)

1) 配置檔案:conf/core-site.xml

<!--?xml version="1.0"?-->

<!--?xml-stylesheet type="text/xsl" href="configuration.xsl"?-->

 

<!-- Put site-specific property overrides in this file. -->

 

fs.default.name

Master:9000

The name of the default file system. Either the literal string "local" or a host:port forDFS.

 

hadoop.tmp.dir

/home/hadoop/tmp

A base for other temporary directories.

fs.default.name是NameNode的URI。hdfs://主機名:埠/hadoop.tmp.dir :Hadoop的預設臨時路徑,這個最好配置,如果在新增節點或者其他情況下莫名其妙的DataNode啟動不了,就刪除此檔案中的tmp目錄即可。不過如果刪除了NameNode機器的此目錄,那麼就需要重新執行NameNode格式化的命令。

2) 配置檔案:conf/mapred-site.xml

<!--?xml-stylesheet type="text/xsl" href="configuration.xsl"?-->

 

<!-- Put site-specific property overrides in this file. -->

 

mapred.job.tracker

Master:9001

The host and port that the MapReduce job tracker runs at. If "local", then jobs are runin-process as a single map and reduce task.

 

mapred.local.dir

/home/hadoop/tmp

mapred.job.tracker是JobTracker的主機(或者IP)和埠。主機:埠。

3) 配置檔案:conf/hdfs-site.xml

<!--?xml version="1.0"?-->

<!--?xml-stylesheet type="text/xsl" href="configuration.xsl"?-->

 

<!-- Put site-specific property overrides in this file. -->

 

dfs.name.dir

/home/hadoop/name1, /home/hadoop/name2

Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy.

 

dfs.data.dir

/home/hadoop/data1, /home/hadoop/data2

Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are ignored.

 

dfs.replication

3

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.

dfs.name.dir是NameNode持久儲存名字空間及事務日誌的本地檔案系統路徑。 當這個值是一個逗號分割的目錄列表時,nametable資料將會被複制到所有目錄中做冗餘備份。

dfs.data.dir是DataNode存放塊資料的本地檔案系統路徑,逗號分割的列表。 當這個值是逗號分割的目錄列表時,資料將被儲存在所有目錄下,通常分佈在不同裝置上。

dfs.replication是資料需要備份的數量,預設是3,如果此數大於叢集的機器數會出錯。

注意:此處的name1、name2、data1、data2目錄不能預先建立,hadoop格式化時會自動建立,如果預先建立反而會有問題。

4) 配置masters和slaves主從結點

配置conf/masters和conf/slaves來設定主從結點,注意最好使用主機名,並且保證機器之間透過主機名可以互相訪問,每個主機名一行。

$vim masters:

輸入:

Master

$vim slaves:

輸入:

Slave1

Slave2

Slave3

配置結束,把配置好的hadoop資料夾複製到其他叢集的機器中,並且保證上面的配置對於其他機器而言正確,例如:如果其他機器的Java安裝路徑不一樣,要修改conf/hadoop-env.sh

$scp -r /home/hadoop/hadoop-1.2.1 Slave1:/home/hadoop/

$scp -r /home/hadoop/hadoop-1.2.1 Slave2:/home/hadoop/

$scp -r /home/hadoop/hadoop-1.2.1 Slave3:/home/hadoop/

5、hadoop啟動

1) 格式化一個新的分散式檔案系統

$ cd /home/hadoop/hadoop-1.2.1 $ bin/hadoop namenode -format

成功情況下系統輸出:

Warning: $HADOOP_HOME is deprecated.

 

13/09/10 16:39:31 INFO namenode.NameNode: STARTUP_MSG:

/************************************************************

STARTUP_MSG: Starting NameNode

STARTUP_MSG: host = Master/192.168.137.100

STARTUP_MSG: args = [-format]

STARTUP_MSG: version = 1.2.1

STARTUP_MSG: build =  -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013

STARTUP_MSG: java = 1.6.0_45

************************************************************/

13/09/10 16:39:32 INFO util.GSet: Computing capacity for map BlocksMap

13/09/10 16:39:32 INFO util.GSet: VM type = 64-bit

13/09/10 16:39:32 INFO util.GSet: 2.0% max memory = 1013645312

13/09/10 16:39:32 INFO util.GSet: capacity = 2^21 = 2097152 entries

13/09/10 16:39:32 INFO util.GSet: recommended=2097152, actual=2097152

13/09/10 16:39:32 INFO namenode.FSNamesystem: fsOwner=hadoop

13/09/10 16:39:32 INFO namenode.FSNamesystem: supergroup=supergroup

13/09/10 16:39:32 INFO namenode.FSNamesystem: isPermissionEnabled=true

13/09/10 16:39:32 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100

13/09/10 16:39:32 INFO namenode.FSNamesystem: isAccessTokenEnabled=falseaccessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)

13/09/10 16:39:32 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0

13/09/10 16:39:32 INFO namenode.NameNode: Caching file names occuring more than 10 times

13/09/10 16:39:33 INFO common.Storage: Image file /home/hadoop/name1/current/fsimage of size 112 bytes saved in 0 seconds.

13/09/10 16:39:33 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/home/hadoop/name1/current/edits

13/09/10 16:39:33 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/home/hadoop/name1/current/edits

13/09/10 16:39:33 INFO common.Storage: Storage directory /home/hadoop/name1 has been successfully formatted.

13/09/10 16:39:33 INFO common.Storage: Image file /home/hadoop/name2/current/fsimage of size 112 bytes saved in 0 seconds.

13/09/10 16:39:33 INFO namenode.FSEditLog: closing edit log: position=4, editlog= /home/hadoop/name2/current/edits

13/09/10 16:39:33 INFO namenode.FSEditLog: close success: truncate to 4, editlog= /home/hadoop/name2/current/edits

13/09/10 16:39:33 INFO common.Storage: Storage directory /home/hadoop/name2 has been successfully formatted.

13/09/10 16:39:33 INFO namenode.NameNode: SHUTDOWN_MSG:

/************************************************************

SHUTDOWN_MSG: Shutting down NameNode at Master/192.168.137.100

************************************************************/

檢視輸出保證分散式檔案系統格式化成功執行完後可以到master機器上看到/home/hadoop//name1和/home/hadoop/name2兩個目錄。在主節點master上面啟動hadoop,主節點會啟動所有從節點的hadoop。

2) 啟動所有節點

啟動方式1:

$ bin/start-all.sh

(同時啟動HDFS和Map/Reduce)系統輸出:

$ bin/start-all.sh

Warning: $HADOOP_HOME is deprecated.

 

starting namenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-namenode-Master.out

Slave3: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-Slave3.out

Slave2: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-Slave2.out

Slave1: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-Slave1.out

The authenticity of host 'master (192.168.137.100)' can't be established.

RSA key fingerprint is d5:18:cb:5f:92:66:74:c7:30:30:bb:36:bf:4c:ed:e9.

Are you sure you want to continue connecting (yes/no)? yes

Master: Warning: Permanently added 'master,192.168.137.100' (RSA) to the list of known hosts.

hadoop@master's password:

Master: starting secondarynamenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-secondarynamenode-Master.out

starting jobtracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-jobtracker-Master.out

Slave2: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-Slave2.out

Slave3: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-Slave3.out

Slave1: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-Slave1.out

執行完後可以到master(Master)和slave(Slave1,Slave2,Slave3)機器上看到/home/hadoop/hadoopfs/data1和/home/hadoop/data2兩個目錄。

啟動方式2:

啟動Hadoop叢集需要啟動HDFS叢集和Map/Reduce叢集。

在分配的NameNode上,執行下面的命令啟動HDFS:

$ bin/start-dfs.sh

(單獨啟動HDFS叢集)

bin/start-dfs.sh指令碼會參照NameNode上${HADOOP_CONF_DIR}/slaves檔案的內容,在所有列出的slave上啟動DataNode守護程式。

在分配的JobTracker上,執行下面的命令啟動Map/Reduce:$bin/start-mapred.sh

(單獨啟動Map/Reduce)

bin/start-mapred.sh指令碼會參照JobTracker上${HADOOP_CONF_DIR}/slaves檔案的內容,在所有列出的slave上啟動TaskTracker守護程式。

3) 關閉所有節點

從主節點master關閉hadoop,主節點會關閉所有從節點的hadoop。

$ bin/stop-all.sh

Hadoop守護程式的日誌寫入到 ${HADOOP_LOG_DIR} 目錄 (預設是 ${HADOOP_HOME}/logs).

${HADOOP_HOME}就是安裝路徑.

6、測試

1) 用jps檢驗各後臺程式是否成功啟動

--在master節點檢視後臺程式

$ /usr/local/jdk1.6.0_45/bin/jps

3180 Jps

2419 SecondaryNameNode

2236 NameNode

2499 JobTracker

--在slave節點檢視後臺程式

$ /usr/local/jdk1.6.0_45/bin/jps

2631 Jps

2277 DataNode

2365 TaskTracker

2) 透過用瀏覽器和http訪問NameNode和JobTracker的網路介面:

NameNode – http://192.168.137.100:50070/dfshealth.jsp

Jobtracker – http://192.168.137.101:50060/tasktracker.jsp

3) 使用netstat –nat檢視埠9000和9001是否正在使用。

HDFS操作

執行bin/目錄的hadoop命令,可以檢視Haoop所有支援的操作及其用法,這裡以幾個簡單的操作為例。

建立目錄

$bin/hadoop dfs -mkdir testdir

Warning: $HADOOP_HOME is deprecated.

 

13/09/10 17:29:05 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead.

在HDFS中建立一個名為testdir的目錄

複製檔案

$ bin/hadoop dfs -put /home/hadoop/hadoop-1.2.1.tar.gz testfile.zip

Warning: $HADOOP_HOME is deprecated.

 

13/09/10 17:30:32 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead.

13/09/10 17:30:33 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead

把本地檔案/home/hadoop/hadoop-1.2.1.tar.gz複製到HDFS的根目錄/user/hadoop/下,檔名為testfile.zip

檢視現有檔案

$ bin/hadoop dfs -ls

Warning: $HADOOP_HOME is deprecated.

 

13/09/10 17:32:00 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead.

Found 2 items

drwxr-xr-x - hadoop supergroup 0 2013-09-10 17:29 /user/hadoop/testdir

-rw-r--r-- 3 hadoop supergroup 63851630 2013-09-10 17:30 /user/hadoop/testfile.zip

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/196700/viewspace-2124373/,如需轉載,請註明出處,否則將追究法律責任。

相關文章