Hadoop系列之九:Hadoop集羣僞分佈式模式的實現詳解

版權聲明:原創作品,如需轉載,請與作者聯繫。否則將追究法律責任。
學習聯繫QQ:1660809109、1661815153、2813150558
更多資訊:www.magedu.com

1、Hadoop依賴軟件

Hadoop基於Java語言開發,因此其運行嚴重依賴於JDK(Java Development Kit),並且Hadoop的許多功能依賴於Java 6及以後的版本才提供的特性。Hadoop可以良好地運行於經過測試的各JDK,如Sun JDK、OpenJDK、Oracle JRockit、IBM JDK各自實現的某些版本。但迄今爲止,HotSpot JVM仍是性能最好且與Hadoop搭配運行最穩定的實現。http://wiki.apache.org/hadoop/HadoopJavaVersions頁面給出了Hadoop目前幾大著名企業實現的Hadoop集羣中所使用的JDK版本,Hortonworks已經爲JDK 1.6.0_31在RHEL5/CentOS5、RHEL6/CentOS6、SLES11運行Hadoop、HBase、Pig, Hive、HCatalog、Oozie、Sqoop等進行了認證。建議參考它們的測試結果進行選擇。

在選擇安裝版本,Sun JDK有幾種不同格式的安裝包,其使用及功能上並沒有區別;但如果在安裝Hadoop使用CDH的RPM格式的包的話,它們依賴於RPM格式的JDK,不過,ASF提供的RPM包並沒有定義任何外在的依賴關係,因此,其可以使用基於任何方式安裝配置的JDK,但這也意味着得手動解決依賴關係。無論如何,一個生產環境的Hadoop集羣應該運行在64位的操作系統上,JDK等也要使用相應的64位版本,否則,單JVM進程將無法使用大於2GB以上的內存。

除了JDK之外,Hadoop集羣的正常運行還可能根據實際環境依賴於其它的一些軟件以實現集羣的維護、監控及管理等。這些軟件諸如cron、ntp、ssh、postfix/sendmail及rsync等。cron通常用於在Hadoop集羣中過期的臨時文件、歸檔壓縮日誌等定期任務的執行;ntp則用於爲集羣的各節點實現時間同步;ssh並非是必須的,但在MapReduce或HDFS的master節點上一次性啓動整個集羣時通過要用到ssh服務;postfix/sendmail則用於將cron的執行結果通知給管理員;rsync可用於實現配置文件的同步等。
 
2、Hadoop的運行環境
 
2.1 各節點的主機名
 
Hadoop在基於主機引用各節點時會有一些獨特的方式,這已經讓很多的Hadoop管理員爲此頭疼不已。實際使用中,應該避免集羣中的各節點尤其是從節點(DataNode和TaskTracker)使用localhost作爲本機的主機名稱,除非是在僞分佈式環境中。
 
2.2 用戶、組及目錄
 
前文已經說明,一個完整的Hadoop集羣包含了MapReduce集羣和HDFS集羣,MapReduce集羣包含JobTracker和TaskTracker兩類進程和許多按需啓動的任務類進程(如map任務),HDFS集羣包含NameNode、SecondaryNameNode和DataNode三類進程。安全起見,應該以普通用戶的身份啓動這些進程,並且MapReduce集羣的進程與HDFS集羣的進程還應該使用不同的用戶,比如分別使用mapred和hdfs用戶。使用CDH的RPM包安裝Hadoop時,這些用戶都會被自動創建,如果基於tar包安裝,則需要手動創建這些用戶。
 
Hadoop的每一個進程都會訪問系統的各類資源,然而,Linux系統通過PAM限定了用戶的資源訪問能力,如可打開的文件數(默認爲1024個)及可運行的進程數等,這此默認配置在一個略具規模的Hadoop集羣中均會帶來問題。因此,需要爲mapred和hdfs用戶修改這些限制,這可以在/etc/security/limits.conf中進行。修改結果如下。
# Allow users hdfs, mapred, and hbase to open 32k files. The
# type '-' means both soft and hard limits.
#
# See 'man 5 limits.conf' for details.
# user type resource value
hdfs - nofile 32768
mapred - nofile 32768
 
3、Hadoop的分佈式模型
 
Hadoop通常有三種運行模式:本地(獨立)模式、僞分佈式(Pseudo-distributed)模式和完全分佈式(Fully distributed)模式。
 
安裝完成後,Hadoop的默認配置即爲本地模式,此時Hadoop使用本地文件系統而非分佈式文件系統,而且其也不會啓動任何Hadoop守護進程,Map和Reduce任務都作爲同一進程的不同部分來執行。因此,本地模式下的Hadoop僅運行於本機。此種模式僅用於開發或調試MapReduce應用程序但卻避免了複雜的後續操作。
 
僞分佈式模式下,Hadoop將所有進程運行於同一臺主機上,但此時Hadoop將使用分佈式文件系統,而且各jobs也是由JobTracker服務管理的獨立進程。同時,由於僞分佈式的Hadoop集羣只有一個節點,因此HDFS的塊複製將限制爲單個副本,其secondary-master和slave也都將運行於本地主機。此種模式除了並非真正意義的分佈式之外,其程序執行邏輯完全類似於完全分佈式,因此,常用於開發人員測試程序執行。
 
要真正發揮Hadoop的威力,就得使用完全分佈式模式。由於ZooKeeper實現高可用等依賴於奇數法定數目(an odd-numbered quorum),因此,生產環境中,完全分佈式環境需要至少三個節點。
 

4、Hadoop集羣僞分佈式的實現 

4.1 安裝前的準備工作

本示例所演示的過程基於RHEL 6.3(64bit)平臺,主機名爲hadoop.magedu.com,用到的應用程序如下所示。

JDK採用的爲Oracle的HotSpot JDK 1.6.0_31,64位版本,文件名爲jdk-6u31-linux-x64-rpm.bin;
Hadoop採用的Hortonworks的HDP 1.1中提供的1.0版本的hadoop,tar包格式,文件名爲hadoop-1.0.3.16.tar.gz;下載地址鏈接http://hortonworks.com/thankyou-hdp11/;

注意:本文演示中全部採用支持MRv1的Hadoop版本,因此其可以爲CDH3中的0.20.2系列的Hadoop,或HDP 1.1中提供的1.0系列的hadoop。

安全起見,運行Hadoop需要以普通用戶的身份進行,按前文的說明,運行MapReduce集羣和HDFS集羣應該以不同的用戶進行。但這裏僅爲僞分佈式模式,是爲初步認識hadoop的運行,因此,這裏只使用一個普通用戶hadoop來完成。接下來建立運行hadoop進程的用戶hadoop並給其設定密碼;

  1. # useradd hadoop 
  2. # echo "password" | passwd --stdin hadoop  

而後配置hadoop用戶能夠以基於密鑰的驗正方式登錄本地主機,以便Hadoop可遠程啓動各節點上的Hadoop進程並執行監控等額外的管理工作。

  1. # su - hadoop 
  2. $ ssh-keygen -t rsa -P ''  
  3. $ ssh-copy-id -i .ssh/id_rsa.pub hadoop@localhost 

4.2 安裝JDK

Hadoop依賴於1.6 update 8或更新版本的Java環境。本文采用的jdk是Oracle官方提供的rpm格式的安裝包,在oracle官方的下載頁面中即可找到合適的版本。其安裝過程非常簡單,使用類似如下命令即可。

  1. # chmod +x jdk-6u31-linux-x64-rpm.bin  
  2. # ./jdk-6u31-linux-x64-rpm.bin 

Hadoop運行時需要能訪問到如前安裝的Java環境,這可以通過將其二進制程序(/usr/java/jdk1.6.0_31,如果其爲其爲當前系統上最高版本的JDK,通常會有鏈接/usr/java/latest指向此目錄)所在的目錄添加至PATH環境變量的路徑中實現,也可以通過設定hadoop-env.sh腳本來進行(後文hadoop的配置章節會有說明)。這裏採用前一種方式,編輯/etc/profile.d/java.sh,在文件中添加如下內容:

  1. JAVA_HOME=/usr/java/latest/ 
  2. PATH=$JAVA_HOME/bin:$PATH 
  3. export JAVA_HOME PATH 

而後切換至hadoop用戶,並執行如下命令測試jdk環境配置是否就緒。

  1. # su - hadoop 
  2. $ java -version 

其輸出內容應該如下面所示。

java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)
 

4.3 hadoop安裝配置

4.3.1 安裝

  1. # tar xf hadoop-1.0.3.16.tar.gz -C /usr/local
  2. # chown -R hadoop:hadoop /usr/local/hadoop-1.0.3.16/ 
  3. # ln -sv /usr/local/hadoop-1.0.3.16 /usr/local/hadoop 

然後編輯/etc/profile.d/hadoop.sh,設定HADOOP_PREFIX環境變量的值爲hadoop的解壓目錄,並讓其永久有效。編輯/etc/profile,添加如下內容:

  1. HADOOP_PREFIX=/usr/local/hadoop 
  2. PATH=$HADOOP_PREFIX/bin:$PATH 
  3. export HADOOP_PREFIX PATH 

切換至hadoop用戶,並執行如下命令測試hadoop是否就緒。

  1. $ su - hadoop 
  2. $ hadoop version 

其輸出內容應該爲如下所示:

Hadoop 1.0.3.16
Subversion git://localhost.localdomain/ on branch hdp-hadoop-1.0.3.16 -r 6cbf3791d67a1c726ce81927045e54eb1f2e3a95
Compiled by jenkins on Mon Oct  1 00:25:03 PDT 2012
From source with checksum d351ec52aec40ae43fb833c8cc54a6c5

4.3.2 配置Hadoop工作於僞分佈式模式

安裝完成後的Hadoop默認配置就可以啓動,但其工作於本地模式;爲了模擬hadoop集羣的工作環境,完成配置測試,MarReduce程序測試等工作,可以配置其在單臺主機模擬提供分佈式的hadoop,即僞分佈式。

hadoop的配置共有四種級別:集羣、進程、作業和單獨操作,前兩類由集羣管理員負責配置,後面的兩類則屬於程序員的工作範疇。


hadoop的配置文件位於conf目錄中,其中的core-site.xmlmapred-site.xmlhdfs-site.xml三個配置文件最爲關鍵。core-site.xml用於配置hadoop集羣的特性,它作用於全部進程及客戶端,mapred-site.xml配置mapreduce集羣的工作屬性,hdfs-site.xml配置hdfs集羣的工作屬性。此三個文件均爲XML格式,其每個屬性配置請求格式如下:

<property>
    <name>some.property.name</name>
    <value>some-value</value>
</property>

另外還有三個配置文件需要留意。hadoop-env.sh是Hadoop的多個腳本執行時source的配置信息,其用於爲Hadoop指定運行時使用的JDK、各進程的JDK屬性、PID文件及日誌文件的保存目錄等。masters則用於指定輔助名稱節點(SecondaryNameNode)的主機名或主機地址,slaves用於指定各從服務器(TaskTracker或DataNode)的主機名或主機地址。對僞分佈式的Hadoop集羣來講,這些節點均爲本機。

4.3.2.1 編輯conf/core-site.xml

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
  3.  
  4. <configuration> 
  5.   <property> 
  6.     <name>hadoop.tmp.dir</name
  7.     <value>/hadoop/temp</value> 
  8.   </property> 
  9.    
  10.   <property> 
  11.     <name>fs.default.name</name
  12.     <value>hdfs://localhost:8020</value> 
  13.   </property>   
  14. </configuration> 

上面示例中hadoop.tmp.dir屬性用於定義Hadoop的臨時目錄,其默認爲/tmp/hadoop-${username}。HDFS進程的許多目錄默認都在此目錄中,本示例將其定義到了/hadoop/temp目錄,需要注意的是,要保證運行Hadoop進程的用戶對其具有全部訪問權限。fs.default.name屬性用於定義HDFS的名稱節點和其默認的文件系統,其值是一個URI,即NameNode的RPC服務器監聽的地址(可以是主機名)和端口(默認爲8020)。其默認值爲file:///,即本地文件系統。

  1. # mkdir -p /hadoop/temp 
  2. # chown -R hadoop:hadoop /hadoop 

4.3.2.2 編輯conf/mapred-site.xml

運行MapReduce需要爲其指定一個主機作爲JobTracker節點,在一個小規模的Hadoop集羣中,它通常跟NameNode運行於同一物理主機,在僞分佈式環境中,其爲本地主機。可以通過mapred.job.trakcer屬性定義JobTracker監聽的地址(或主機名)和端口(默認爲8021),與前面的fs.default.name屬性的值不同的是,這不是一個URI,而僅一個“主機-端口”組合。

在MapReduce作業運行過程中,中間數據(intermediate data)和工作文件保存於本地臨時文件中。根據運行的MapReduce作業不同,這些數據文件可能會非常大,因此,應該通過mapred.local.dir屬性爲其指定一個有着足夠空間的本地文件系統路徑,其默認值爲${hadoop.tmp.dir}/mapred/local。mapred.job.tracker可以接受多個以逗號分隔路徑列表作爲其值,並會以輪流的方式將數據分散存儲在這些文件系統上,因此指定位於不同磁盤上的多個文件系統路徑可以分散數據I/O。

另外,MapReduce使用分佈式文件系統爲各TaskTracker保存共享數據,這可以通過mapred.system.dir屬性進行定義,其默認值爲${hadoop.tmp.dir}/mapred/system。下面給出了一個較簡單的mapred-site.xml文件示例。
  1. <?xml version="1.0"?> 
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
  3.  
  4. <configuration> 
  5.   <property> 
  6.     <name>mapred.job.tracker</name
  7.     <value>localhost:8021</value> 
  8.   </property> 
  9. </configuration> 

4.3.2.3 編輯conf/hdfs-site.xml,定義hdfs的屬性

HDFS集羣進程有許多屬性可以定義其工作路,如dfs.name.dir屬性定義的HDFS元數據持久存儲路徑默認爲${hadoop.tmp.dir}/dfs/name、dfs.data.dir屬性定義的DataNode用於存儲數據塊的目錄路徑默認爲${hadoop.tmp.dir}/dfs/data、fs.checkpoint.dir屬性定義的SecondaryNameNode用於存儲檢查點文件的目錄默認爲${hadoop.tmp.dir}/dfs/namesecondary。

爲了數據可用性及冗餘的目的,HDFS會在多個節點上保存同一個數據塊的多個副本,其默認爲3個。而只有一個節點的僞分佈式環境中其僅用保存一個副本即可,這可以通過dfs.replication屬性進行定義。如下所示的內容即可作爲最簡單的hdfs-site.xml配置文件。
 

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
  3.  
  4. <configuration> 
  5.   <property> 
  6.     <name>dfs.replication</name
  7.     <value>1</value> 
  8.   </property> 
  9. </configuration> 

4.3.2.4 格式化名稱節點

如普通文件系統一樣,HDFS文件系統必須要先格式化,創建元數據數據結構以後才能使用。以hadoop用戶運行如下命令即可實現。

  1. $ hadoop namenode -format 

其輸出信息應該如下面所示。

 

13/01/06 11:43:50 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = hadoop.magedu.com/172.16.200.11
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.0.3.16
STARTUP_MSG:   build = git://localhost.localdomain/ on branch hdp-hadoop-1.0.3.16 -r 6cbf3791d67a1c726ce81927045e54eb1f2e3a95; compiled by 'jenkins' on Mon Oct  1 00:25:03 PDT 2012
************************************************************/
13/01/06 11:43:51 INFO util.GSet: VM type       = 64-bit
13/01/06 11:43:51 INFO util.GSet: 2% max memory = 19.33375 MB
13/01/06 11:43:51 INFO util.GSet: capacity      = 2^21 = 2097152 entries
13/01/06 11:43:51 INFO util.GSet: recommended=2097152, actual=2097152
13/01/06 11:43:51 INFO namenode.FSNamesystem: fsOwner=hadoop
13/01/06 11:43:51 INFO namenode.FSNamesystem: supergroup=supergroup
13/01/06 11:43:51 INFO namenode.FSNamesystem: isPermissionEnabled=true
13/01/06 11:43:51 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
13/01/06 11:43:51 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
13/01/06 11:43:51 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = -1
13/01/06 11:43:51 INFO namenode.NameNode: Caching file names occuring more than 10 times 
13/01/06 11:43:51 INFO common.Storage: Image file of size 112 saved in 0 seconds.
13/01/06 11:43:51 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/hadoop/temp/dfs/name/current/edits
13/01/06 11:43:51 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/hadoop/temp/dfs/name/current/edits
13/01/06 11:43:51 INFO common.Storage: Storage directory /hadoop/temp/dfs/name has been successfully formatted.
13/01/06 11:43:51 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop.magedu.com/172.16.200.11
************************************************************/ 

 

4.3.2.5 啓動hadoop

Hadoop提供了2個腳本start-dfs.sh和start-mapred.sh,分別用於啓動hdfs相關的進程和mapred相關的進程。事實上,爲了使用的便捷性,在NameNode和JobTracker運行於同一主機的場景中,Hadoop還專門提供了腳本start-all.sh腳本來自動執行前述兩個腳本。不過,需要注意的是,使用這類腳本啓動Hadoop集羣,其需要當前主機的當前用戶能夠通過ssh服務以基於密鑰認證的方式訪問任何一個從節點。

除此之外,管理員也可以使用hadoop-daemon.sh腳本手動啓動某一個Hadoop進程,或使用腳本hadoop-daemons.sh腳本手動啓動某些進程。

這裏通過前一種方式中的start-all.sh腳本來一次性啓動所有的進程。

  1. $ start-all.sh  

其會輸出類似如下內容:  

starting namenode, logging to /usr/local/hadoop-1.0.3.16/libexec/../logs/hadoop-hadoop-namenode-hadoop.magedu.com.out
localhost: starting datanode, logging to /usr/local/hadoop-1.0.3.16/libexec/../logs/hadoop-hadoop-datanode-hadoop.magedu.com.out
localhost: starting secondarynamenode, logging to /usr/local/hadoop-1.0.3.16/libexec/../logs/hadoop-hadoop-secondarynamenode-hadoop.magedu.com.out
starting jobtracker, logging to /usr/local/hadoop-1.0.3.16/libexec/../logs/hadoop-hadoop-jobtracker-hadoop.magedu.com.out
localhost: starting tasktracker, logging to /usr/local/hadoop-1.0.3.16/libexec/../logs/hadoop-hadoop-tasktracker-hadoop.magedu.com.out

運行jps命令可查看正在運行的Hadoop進程。
 
  1. $ jps | grep -iv "jps" 
顯示結果類似如下內容:
28935 JobTracker
28840 SecondaryNameNode
28691 DataNode
28565 NameNode
29062 TaskTracker

4.3.2.6 Hadoop進程監聽的地址和端口

Hadoop啓動時會運行兩個服務器進程,一個爲用於Hadoop各進程之間進行通信的RPC服務器,另一個是提供了便於管理員查看Hadoop集羣各進程相關信息頁面的HTTP服務器。
 
用於定義各RPC服務器所監聽的地址和端口的屬性有如下幾個:
  • fs.default.name:定義HDFS的NameNode用於提供URI所監聽的地址和端口,默認端口爲8020;
  • dfs.datanode.ipc.address:DataNode上RPC服務器監聽的地址和端口,默認爲0.0.0.0:50020;
  • mapred.job.tracker:JobTracker的PRC服務器所監聽的地址和端口,默認端口爲8021;
  • mapred.task.tracker.report.address:TaskTracker的RPC服務器監聽的地址和端口;TaskTracker的子JVM使用此端口與TaskTracker進行通信,它僅需要監聽在本地迴環地址127.0.0.1上,因此可以使用任何端口;只有在當本地沒有迴環接口時才需要修改此屬性的值;
除了RPC服務器之外,DataNode還會運行一個TCP/IP服務器用於數據塊傳輸,其監聽的地址和端口可以通過dfs.datanode.address屬性進行定義,默認爲0.0.0.0:50010。
 
可用於定義各HTTP服務器的屬性有如下幾個:
  • mapred.job.tracker.http.addrss:JobTracker的HTTP服務器地址和端口,默認爲0.0.0.0:50030;
  • mapred.task.tracker.http.address:TaskTracker的HTTP服務器地址和端口,默認爲0.0.0.0:50060;
  • dfs.http.address:NameNode的HTTP服務器地址和端口,默認爲0.0.0.0:50070;
  • dfs.datanode.http.address:DataNode的HTTP服務器地址和端口,默認爲0.0.0.0:50075;
  • dfs.secondary.http.address:SecondaryNameNode的HTTP服務器地址和端口,默認爲0.0.0.0:50090;

上述的HTTP服務器均可以通過瀏覽器直接訪問以獲取對應進程的相關信息,訪問路徑爲http://Server_IP:Port。如JobTracker的相關信息:


還有NameNode的相關信息:
 


參考文獻:
Hadoop Operations
Hadoop In Action
Hadoop The Definative Guide 3rd Edtion
Hadoop Documentation

本文出自 “馬哥教育Linux運維培訓” 博客,轉載請與作者聯繫!

學習聯繫QQ:1660809109、1661815153、2813150558
更多資訊:www.magedu.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章