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

一、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/CentOS五、RHEL6/CentOS六、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可用於實現配置文件的同步等。java

二、Hadoop的運行環境node

2.1 各節點的主機名linux

Hadoop在基於主機引用各節點時會有一些獨特的方式,這已經讓不少的Hadoop管理員爲此頭疼不已。實際使用中,應該避免集羣中的各節點尤爲是從節點(DataNode和TaskTracker)使用localhost做爲本機的主機名稱,除非是在僞分佈式環境中。git

2.2 用戶、組及目錄程序員

前文已經說明,一個完整的Hadoop集羣包含了MapReduce集羣和HDFS集羣,MapReduce集羣包含JobTracker和TaskTracker兩類進程和許多按需啓動的任務類進程(如map任務),HDFS集羣包含NameNode、SecondaryNameNode和DataNode三類進程。安全起見,應該以普通用戶的身份啓動這些進程,而且MapReduce集羣的進程與HDFS集羣的進程還應該使用不一樣的用戶,好比分別使用mapred和hdfs用戶。使用CDH的RPM包安裝Hadoop時,這些用戶都會被自動建立,若是基於tar包安裝,則須要手動建立這些用戶。apache

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

三、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),所以,生產環境中,徹底分佈式環境須要至少三個節點。

四、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

相關文章
相關標籤/搜索