Hadoop集群完全分布式模式环境部署
分類:?HADOOP
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 hadoop2、SSH配置
在Hadoop啟動以后,Namenode是通過SSH(Secure Shell)來啟動和停止各個datanode上的各種守護進程的,這就須要在節點之間執行指令的時候是不須要輸入密碼的形式,故我們須要配置SSH運用無密碼公鑰認證的形式。以本文中的四臺機器為例,現在Master是主節點,他須要連接Slave1、Slave2和Slave3。須要確定每臺機器上都安裝了ssh,并且datanode機器上sshd服務已經啟動。
切換到hadoop用戶( 保證用戶hadoop可以無需密碼登錄,因為我們后面安裝的hadoop屬主是hadoop用戶。)
1) 在每臺主機生成密鑰對
這個命令生成一個密鑰對:id_rsa(私鑰文件)和id_rsa.pub(公鑰文件)。默認被保存在~/.ssh/目錄下。
2) 將Master公鑰添加到遠程主機Slave1的 authorized_keys 文件中
在/home/hadoop/.ssh/下創建authorized_keys
將剛才復制的公鑰復制進去
權限設置為600.(這點很重要,網沒有設置600權限會導致登陸失敗)
測試登陸:
同樣的方法,將Master 的公鑰復制到其他節點。
3、安裝Hadoop
1) 切換為hadoop用戶,下載安裝包后,直接解壓安裝即可:
#su - hadoop #wget?http://apache.stu.edu.tw/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz #tar -zxvf hadoop-1.2.1.tar.gz 我的安裝目錄為:
/home/hadoop/hadoop-1.2.1
為了方便,使用hadoop命令或者start-all.sh等命令,修改Master上/etc/profile 新增以下內容:
修改完畢后,執行source /etc/profile 來使其生效。
2) 配置conf/hadoop-env.sh文件
配置conf/hadoop-env.sh文件,添加:
這里修改為你的jdk的安裝位置。
測試hadoop安裝:
4、集群配置(所有節點相同)
1) 配置文件:conf/core-site.xml
? ? 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
? ? 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/tmpmapred.job.tracker是JobTracker的主機(或者IP)和端口。主機:端口。
3) 配置文件:conf/hdfs-site.xml
? ? 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來設置主從結點,注意最好使用主機名,并且保證機器之間通過主機名可以互相訪問,每個主機名一行。
配置結束,把配置好的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 =?https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2?-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:
執行完后可以到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所有支持的操作及其用法,這里以幾個簡單的操作為例。
建立目錄
在HDFS中建立一個名為testdir的目錄
復制文件
把本地文件/home/hadoop/hadoop-1.2.1.tar.gz拷貝到HDFS的根目錄/user/hadoop/下,文件名為testfile.zip
查看現有文件
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的Hadoop集群完全分布式模式环境部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios html字符转义字符串,iOS
- 下一篇: linux单点登录命令,配置RHEV中L