生產環境Hadoop大叢集完全分散式模式安裝 NFS+DNS+awk

dd_dong發表於2013-06-13
介紹

       這是利用Vmware9.0在一臺伺服器上搭建的分散式環境,作業系統CentOS 6.4 X64中配置Hadoop-1.0.4時的總結文件。     Hadoop配置建議所有配置檔案中使用主機名進行配置,並且機器上應在防火牆中開啟相應埠,並設定SSHD服務為開機啟動,此外java環境變數可以在/etc/profile中配置。

0 安裝程式
  

軟體

  

版本

地址

VMware-workstation-full-9.0.0-812388

9.0.0-812388

 

Centos

6.4 X64

http://mirrors.163.com/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-bin-DVD1.iso

jdk

jdk-6u45-linux-x64

http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html

hadoop

1.0.4

http://apache.fayea.com/apache-mirror/hadoop/common/stable/hadoop-1.0.4.tar.gz

  

1 叢集網路環境介紹及快速部署1.1 叢集環境
  

主機名

  

IP

備註

NFSServer

10.88.106.219

獨立伺服器,提供NFS服務

DNSServer

10.88.106.220

獨立伺服器,提供DNS服務

NameNode

10.88.106.221

NameNode

DataNode1

10.88.106.222

DataNode

DataNode2

10.88.106.223

DataNode

DataNode3

10.88.106.224

DataNode

DataNode4

10.88.106.225

DataNode

叢集包含七個節點:1個NFSServer,1個DNSServer,1個namenode,4個datanode,節點之間區域網連線,可以相互ping通。

1.2 快速部署節點

所有節點均是Centos 6.4 64位系統,防火牆均禁用,sshd服務均開啟並設定為開機啟動

a)   首先在VMware中安裝好一臺Centos 6.4,建立hadoop使用者。假設虛擬機器的名字為NameNode

b)   關閉虛擬機器,把NameNode資料夾,拷貝6份,並命名為DataNode1,..,DataNode4,NFSServer,DNSServer

c)   用VMware開啟每個DateNode,設定其虛擬機器的名字

d)   開啟作業系統,當彈出對話方塊時,選擇“I copy it”

e)   開啟每個虛擬機器,檢視ip地址

ifconfig

f)   每個虛擬機器,永久關閉防火牆(非常重要,一定要確認),並關閉SELINUX

chkconfig iptables off (永久生效)

service iptables stop (臨時有效)

vim  /etc/selinux/config

[root@DataNode1 local]# chkconfigiptables off

[root@DataNode1 local]# serviceiptables stop

iptables: Flushing firewall rules:                         [  OK  ]

iptables: Setting chains to policyACCEPT: filter          [  OK  ]

iptables: Unloading modules:                               [  OK  ]

[root@DataNode1 local]#

g)   配置NameNode

第一步,檢查機器名

#hostname


如發現不對,則修改,root使用者登陸,修改命令如下

# vim /etc/sysconfig/network

  
        

NETWORKING=yes

   

HOSTNAME=NameNode

   
   
   


依次對每個節點進行處理,修改完之後,重啟系統 #reboot

h)   規劃系統目錄

安裝目錄和資料目錄分開,且資料目錄和hadoop的使用者目錄分開,如果需要重新格式化,則可以直接刪除所有的資料目錄,然後重建資料目錄。

如果資料目錄和安裝目錄或者使用者目錄放置在一起,則對資料目錄操作時,存在誤刪除程式或者使用者檔案的風險。

  

完整路徑

  

說明

/usr/local

hadoop的程式安裝主目錄

/home/hadoop_space/tmp

臨時目錄

/home/hadoop_space/hdfs/name

namenode上儲存hdfs名字空間後設資料

/home/hadoop_space/hdfs/data

datanode上資料塊的物理儲存位置

/home/hadoop_space/mapred/local

tasktracker上執行mapreduce程式時的本地目錄

/home/hadoop_space/mapred/system

這個是hdfs中的目錄,儲存執行mr程式時的共享檔案

至於這裡為什麼在/usr/local下建立安裝目錄,解釋如下

/usr     檔案系統

  /usr檔案系統經常很大因為所有程式安裝在這裡. /usr 裡的所有檔案一般來自Linux distribution本地安裝的程式和其他東西在/usr/local .這樣可能在升級新版系統或新distribution時無須重新安裝全部程式.

/usr/local           本地安裝的軟體和其他檔案放在這裡.  

小貼士:建立目錄:mkdir(makedirectories)

功能說明:建立目錄
語  法:mkdir [-p][--help][--version][-m ][目錄名稱]
補充說明:mkdir可建立目錄並同時設定目錄的許可權。
參  數:
-m或–mode 建立目錄時同時設定目錄的許可權。
-p或–parents 若所要建立目錄的上層目錄目前尚未建立,則會一併建立上層目錄。
例:mkdir test

開始建立目錄:

在NameNode下,root使用者

mkdir-p /home/hadoop_space/tmp

mkdir-p /home/hadoop_space/hdfs/name

mkdir-p /home/hadoop_space/hdfs/data

mkdir-p /home/hadoop_space/mapred/local

mkdir-p /home/hadoop_space/mapred/system

chown-R hadoop:hadoop /home/hadoop_space/

修改目錄/home/hadoop的擁有者(因為該目錄用於安裝hadoop,使用者對其必須有rwx許可權。)

chown -R hadoop:hadoop /home/hadoop

chown -R hadoop:hadoop /home/hadoop_space

1.3 安裝jdk1.3.1.下載JDK

選定linux環境版本,下載到的檔案是:jdk-6u45-linux-x64.bin

1.3.2.複製JDK安裝包到系統指定資料夾

把下載的安裝檔案(jdk-6u45-linux-x64.bin)拷到linux路徑/usr/local/下。

1.3.3.給安裝檔案賦予許可權

a).進入目錄,命令:cd /usr/local/java

b).賦予許可權,命令:chmod +x jdk-6u45-linux-x64.bin

(如果因許可權問題執行失敗,則加上su, 即su chmod u+x jdk-6u45-linux-x64.bin)

1.3.4安裝JDK

開始安裝,在控制檯執行命令: ./ jdk-6u45-linux-x64.bin

(如果因許可權問題執行失敗,則加上su , 即sud./jdk-6u45-linux-x64.bin)

檔案會被安裝到當前目錄 /usr/local/jdk1.6.0_45

刪除安裝檔案rm jdk-6u45-linux-x64.bin

安裝完成後,修改/usr/local/jdk1.6.0_45目錄擁有著為hadoop使用者,

chown-R hadoop:hadoop /usr/local/jdk1.6.0_45

1.3.5 Java環境變數配置

       root使用者登陸,命令列中執行命令”vim /etc/profile”,並加入以下內容,配置環境變數(注意/etc/profile這個檔案很重要,後面Hadoop的配置還會用到)。

#java

JAVA_HOME=/usr/local/jdk1.6.0_45

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

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

CLASSPATH=.:$JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME CLASSPATH PATH

儲存並退出,執行以下命令使配置生效

chmod +x  /etc/profile

source  /etc/profile

    配置完畢,在命令列中使用命令“java -version”可以判斷是否成功。在hadoop使用者下測試java -version,一樣成功。

[root@NameNodehadoop]# java -version

javaversion "1.6.0_45"

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

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

2. 配置DNS解析主機名

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

詳細步驟見:【 hadoop大規模應用之CentOS6.4+DNS-BIND域名伺服器配置基礎詳解

http://blog.csdn.net/liema2000/article/details/9076333

3.建立hadoop執行賬號

在所有的節點建立hadoop執行賬號

[root@gc ~]#groupadd hadoop

[root@gc ~]#useradd -g hadoop hadoop  

說明:在大的hadoop叢集安裝環境中,這步可以在批量安裝linux系統之前完成,然後再進行系統的複製。

4.通過NFS配置ssh免密碼連入

說明:通過NFS配置ssh免密碼連入時,當我們有新的節點接入時,不再需要分別向其它節點各自新增自己公鑰資訊,只需要把公鑰資訊追加到共享的authorized_keys公鑰當中,其它節點就直接指向最新的公鑰檔案。便於分配公鑰和管理。

詳細步驟見: 【hadoop大規模應用之NFS安裝及SSH免密碼驗證配置

http://blog.csdn.net/liema2000/article/details/9076357

5.解壓hadoop安裝包

--可先一某節點(NameNode)解壓配置檔案

[root@NameNode hadoop]# pwd
/usr/local/hadoop
[root@NameNode hadoop]#
[root@NameNode hadoop]# tar -zxvf hadoop-1.0.4.tar.gz

6. 配置 Hadoop

(1)配置Hadoop的配置檔案

    (a)配置hadoop-env.sh

$ vim /usr/local/hadoop-1.0.4/conf/hadoop-env.sh

# set java environment

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

export HADOOP_HOME_WARN_SUPPRESS=1

export HADOOP_CLASSPATH=/usr/local/hadoop-1.0.4:/usr/local/hadoop-1.0.4/lib

(b)配置/etc/profile

#hadoop

export HADOOP_HOME=/usr/hadoop-1.0.4

export HADOOP_HOME_WARN_SUPPRESS=1

PATH=$HADOOP_HOME/bin:$PATH

export PATH

修改完,重啟/etc/profile

[root@NameNode ~]# source /etc/profile

(c)配置conf/hadoop-site.xml

Hadoop-0.20.2之後的版本請分別配置core-site.xml,hdfs-site.xml和mapred-site.xml三個配置檔案。

  

配置檔名(xml)

  

欄位名

欄位值

說明

core-site

fs.default.name

hdfs://NameNode:9000

 

hadoop.tmp.dir

/home/hadoop_space/tmp

臨時目錄

hdfs-site

dfs.name.dir

/home/hadoop_space/hdfs/name

namenode上儲存hdfs名字空間後設資料

dfs.data.dir

/home/hadoop_space/hdfs/data

datanode上資料塊的物理儲存位置

dfs.replication

3

副本個數,不配置預設是3,應小於datanode機器數量

mapred-site

mapred.job.tracker

NameNode:9001

jobtracker標識:埠號,不是URI

mapred.local.dir

/home/hadoop_space/mapred/local

tasktracker上執行mapreduce程式時的本地目錄

mapred.system.dir

/home/hadoop_space/mapred/system

這個是hdfs中的目錄,儲存執行mr程式時的共享檔案

編輯core-site.xml

      

              fs.default.name

              hdfs://NameNode.hdcw.org:9000

      

      

       hadoop.tmp.dir

       /home/hadoop_space/tmp  

      

編輯hdfs-site.xml

<!-- Put site-specific propertyoverrides in this file. --&gt

       dfs.name.dir

       /home/hadoop_space/hdfs/name

       dfs.data.dir

       /home/hadoop_space/hdfs/data

dfs.replication

       3

編輯mapred-site.xml

<!-- Put site-specific propertyoverrides in this file. --&gt

      

              mapred.job.tracker

              NameNode.hdcw.org:9001

      

      

              mapred.local.dir

              /home/hadoop_space/mapred/local

      

      

mapred.system.dir

              /home/hadoop_space/mapred/system

      

(d)配置masters檔案,把localhost修改為namenode的主機名

  

NameNode.hdcw.org

  

(e)配置slaves檔案, 刪除localhost,加入所有datanode的主機名

  

DataNode1.hdcw.org

  

DataNode2.hdcw.org

  

DataNode3.hdcw.org

  

DataNode4.hdcw.org

  

Namenode節點上root執行執行

chown-R hadoop:hadoop /usr/local

chown-R hadoop:hadoop /home/hadoop_space/



7.  向各節點複製hadoopawk命令)

--把NameNode主機上面hadoop配置好的檔案分別copy到各節點

--原來copy的方法是一個個命令執行,如下

[hadoop@NameNodehadoop]$ scp  -rp hadoop-1.0.4 hadoop@DataNode1:/usr/local/

[hadoop@NameNodehadoop]$ scp  -rp hadoop-1.0.4 hadoop@DataNode2:/usr/local/



--但站在hadoop大叢集的角度,上面方法會很費時,我們可用awk命令生成批量執行的指令碼,批量執行,省時省力,如下:

[root@NameNode local]# cat$HADOOP_HOME/conf/slaves| awk '{print "scp -rp hadoop-1.0.4hadoop@"$1":/usr/local/"}' > scp.sh            

[root@NameNode local]# cat scp.sh

scp -rp hadoop-1.0.4hadoop@DataNode1.hdcw.org:/usr/local/

scp -rp hadoop-1.0.4hadoop@DataNode2.hdcw.org:/usr/local/

scp -rp hadoop-1.0.4hadoop@DataNode3.hdcw.org:/usr/local/

scp -rp hadoop-1.0.4hadoop@DataNode4.hdcw.org:/usr/local/
切換到hadoop使用者,執行復制

複製java

[root@NameNode local]# cat$HADOOP_HOME/conf/slaves| awk '{print "scp -rp /usr/local/jdk1.6.0_45hadoop@"$1":/usr/local/"}' > scp_java.sh

複製hadoop_space

[root@NameNode local]# cat$HADOOP_HOME/conf/slaves| awk '{print "scp -rp /home/hadoop_spacehadoop@"$1":/home/"}' > scp_hadoop.sh                          

#複製/etc/profile

[root@NameNodelocal]#  cat $HADOOP_HOME/conf/slaves|awk '{print "scp -rp /etc/profile root@"$1":/etc/"}' >scp_profile.sh   

root使用者執行

8. 格式化namenode

--在namenode節點進行格式化

[hadoop@NameNode local]$cd $HADOOP_HOME

[hadoop@NameNodehadoop-1.0.4]$ bin/hadoop namenode -format

13/06/11 20:28:16 INFOnamenode.NameNode: STARTUP_MSG:

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

STARTUP_MSG: StartingNameNode

STARTUP_MSG:   host = java.net.UnknownHostException:NameNode: NameNode

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  305:13:58 UTC 2012

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

Re-format filesystem in/home/hadoop_space/hdfs/name ? (Y or N) Y

13/06/11 20:28:18 INFOutil.GSet: VM type       = 64-bit

13/06/11 20:28:18 INFOutil.GSet: 2% max memory = 19.33375 MB

13/06/11 20:28:18 INFOutil.GSet: capacity      = 2^21 = 2097152entries

13/06/11 20:28:18 INFOutil.GSet: recommended=2097152, actual=2097152

13/06/11 20:28:19 INFOnamenode.FSNamesystem: fsOwner=hadoop

13/06/11 20:28:19 INFOnamenode.FSNamesystem: supergroup=supergroup

13/06/11 20:28:19 INFOnamenode.FSNamesystem: isPermissionEnabled=true

13/06/11 20:28:19 INFOnamenode.FSNamesystem: dfs.block.invalidate.limit=100

13/06/11 20:28:19 INFOnamenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0min(s), accessTokenLifetime=0 min(s)

13/06/11 20:28:19 INFOnamenode.NameNode: Caching file names occuring more than 10 times

13/06/11 20:28:29 INFOcommon.Storage: Image file of size 112 saved in 0 seconds.

13/06/11 20:28:29 INFOcommon.Storage: Storage directory /home/hadoop_space/hdfs/name has beensuccessfully formatted.

13/06/11 20:28:29 INFOnamenode.NameNode: SHUTDOWN_MSG:

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

SHUTDOWN_MSG: Shuttingdown NameNode at java.net.UnknownHostException: NameNode: NameNode

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

[hadoop@NameNodehadoop-1.0.4]$



9.        啟動hadoop

--在NameNode節點啟動hadoop守護程式

[hadoop@NameNodehadoop-1.0.4]$ bin/start-all.sh

starting namenode, loggingto /usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-namenode-NameNode.out

DataNode1.hdcw.org:starting datanode, logging to /usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-datanode-DataNode1.out

DataNode4.hdcw.org:starting datanode, logging to/usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-datanode-DataNode4.out

DataNode2.hdcw.org:starting datanode, logging to /usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-datanode-DataNode2.out

DataNode3.hdcw.org:starting datanode, logging to/usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-datanode-DataNode3.out

NameNode.hdcw.org:starting secondarynamenode, logging to /usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-secondarynamenode-NameNode.out

starting jobtracker,logging to/usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-jobtracker-NameNode.out

DataNode2.hdcw.org:starting tasktracker, logging to /usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-tasktracker-DataNode2.out

DataNode4.hdcw.org:starting tasktracker, logging to/usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-tasktracker-DataNode4.out

DataNode1.hdcw.org:starting tasktracker, logging to /usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-tasktracker-DataNode1.out

DataNode3.hdcw.org:starting tasktracker, logging to/usr/local/hadoop-1.0.4/libexec/../logs/hadoop-hadoop-tasktracker-DataNode3.out

[hadoop@NameNodehadoop-1.0.4]$

10.    用jps檢驗各後臺程式是否成功啟動

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

[hadoop@NameNodehadoop-1.0.4]$ jps

28219 JobTracker

27989 NameNode

28141SecondaryNameNode

28376 Jps

[hadoop@NameNodehadoop-1.0.4]$

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

[hadoop@DataNode1 home]$ jps

56556 DataNode

56681 Jps

56635 TaskTracker

[hadoop@DataNode1 home]$

[grid@hotel03~]$ /usr/java/jdk1.6.0_18/bin/jps

29936TaskTracker

29828 DataNode

30924 Jps






11.    通過web瞭解Hadoop的活動

通過用瀏覽器和http訪問jobtracker所在節點的50030埠監控jobtracker

Jobtracker監控

http://10.88.106.221:50030/jobtracker.jsp



通過用瀏覽器和http訪問namenode所在節點的50070埠監控叢集

http://10.88.106.221:50070/dfshealth.jsp

常見問題

1、許可權問題

[hadoop @NameNode local]# scp -rhadoop-1.0.4 hadoop@DataNode1.hdcw.org:/usr/local

scp: /usr/local/hadoop-1.0.4: Permissiondenied

[hadoop @NameNode local]

原因:/usr/local資料夾的屬主是roothadoop沒有許可權操作

解決方法1:規劃時,把hadoop的目錄放到/home/hadoop/下面

解決方法2:更改/usr/local/的屬主為hadoop

現在採用的是方法2

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

相關文章