Ubuntu 14.10 64位java
openjdk-7-jdknode
hadoop 2.6.0web
zookeeper-3.4.6apache
hbase-1.0.0bootstrap
192.168.1.100 1421-0000
192.168.1.106 1421-0003
192.168.1.107 1421-0004
192.168.1.108 1421-0005
192.168.1.109 1421-0006安全
192.168.1.100 1421-0000 DN節點,Journal節點,zookeeper節點
192.168.1.101 1421-0001 備NN,DN節點
192.168.1.102 1421-0002 主NN
192.168.1.103 1423-0001 DN節點,主RM
192.168.1.104 1423-0002 DN節點,備RM
192.168.1.105 1423-0003 DN節點,JobHistory
192.168.1.106 1421-0003 DN節點,Journal節點,zookeeper節點
192.168.1.107 1421-0004 DN節點,Journal節點,zookeeper節點
192.168.1.108 1421-0005 DN節點,Journal節點,zookeeper節點
192.168.1.109 1421-0006 DN節點,Journal節點,zookeeper節點app
說明:
框架
1.在hadoop2.0中一般由兩個NameNode組成,一個處於active狀態,另外一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便可以在它失敗時快速進行切換。
hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另外一種是QJM。這裏咱們使用簡單的QJM。在該方案中,主備NameNode之間經過一組JournalNode同步元數據信息,一條數據只要成功寫入多數JournalNode即認爲寫入成功。一般配置奇數個JournalNode
這裏還配置了一個zookeeper集羣,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode爲standby狀態ssh
2.hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.4.1解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調webapp
機羣的安裝步驟大概以下:1 JDK配置;2 SSH免密碼登陸設置;3 ZooKeeper配置;4 Hadoop配置;5 HBase配置
下載Hadoop穩定版,而後用mvn進行編譯
mvn package -Pdist,native -DskipTests –Dtar
便可在其目錄下:/hadoop-dist/target 就能夠找到編譯好的 hadoop 了。編譯 過程須要 jdk,maven,protobuf 和 cmake 爲基礎。
SSH 也可經過 apt 進行下載,在生成 key 的時候指定密碼爲空,其餘用回車跳過設置爲默認便可,在 home 下的用戶目錄下,找到.ssh 文件夾,經過建立
文件夾 authorized_keys,主要 Shell 命令以下:
ssh-keygen -t rsa -P ''
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
其中 id_rsa.pub 位於.ssh 文件夾下,爲 ssh 公鑰,添加爲信任方後,便可完成免密碼登錄操做。
ZooKeeper的配置文件在conf中,名爲zoo.conf,主要配置的內容位其log和data的磁盤路徑,以及各個節點的基礎信息。它自己提供了一個zoo_sample.cfg,咱們將他複製一份,命名爲
zoo.cfg,而後在其中添加一些配置,下面之列出新增的部分。
dataDir=/home/hadoop/software/cloud/zookeeper-3.4.6/zoodata dataLogDir=/home/hadoop/software/cloud/zookeeper-3.4.6/zoolog server.0=1421-0000:2888:3888 server.1=1421-0003:2888:3888 server.2=1421-0004:2888:3888 server.3=1421-0005:2888:3888 server.4=1421-0006:2888:3888
接下來須要在每一個dataDir目錄下新建myid文件,每一個文件中輸入響應的server.後面的數字,例如在1421-0000中的myid輸入0.在各個目錄下作相同處理,同時還要在每一個文件夾創建dataDir和dataLogDir文件夾,這樣ZooKeeper配置完畢
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop-cluster</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>1421-0000:2181,1421-0003:2181,1421-0004:2181,1421-0005:2181,1421-0006:2181</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/software/cloud/hadoop-2.6.0/tmp</value> <description> adoop的臨時目錄,其它目錄會基於此路徑。本地目錄。只能夠設置一個值;建議設置到一個足夠空間的地方,而不是默認的/tmp下,服務端參數,修改需重啓。本地路徑 </description> </property> </configuration>
<configuration> <property> <name>dfs.nameservices</name> <value>hadoop-cluster</value> <description>指定命名空間名稱,可隨易取</description> </property> <property> <name>dfs.ha.namenodes.hadoop-cluster</name> <value>nn1,nn2</value> <description>在命名空間下指定NameNode邏輯名</description> </property> <property> <name>dfs.namenode.rpc-address.hadoop-cluster.nn1</name> <value>1421-0002:9000</value> <description></description> </property> <property> <name>dfs.namenode.rpc-address.hadoop-cluster.nn2</name> <value>1421-0001:9000</value> <description></description> </property> <property> <name>dfs.namenode.http-address.hadoop-cluster.nn1</name> <value>1421-0002:50070</value> <description></description> </property> <property> <name>dfs.namenode.http-address.hadoop-cluster.nn2</name> <value>1421-0001:50070</value> <description></description> </property> <property> <name>dfs.namenode.servicerpc-address.hadoop-cluster.nn1</name> <value>1421-0002:53310</value> <description></description> </property> <property> <name>dfs.namenode.servicerpc-address.hadoop-cluster.nn2</name> <value>1421-0001:53310</value> <description></description> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> <description></description> </property> <property> <name>dfs.client.failover.proxy.provider.hadoop-cluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <description>出現故障,哪一個實現類負責執行故障切換</description> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> <description>一旦NameNode切換,使用ssh方式進行操做</description> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> <description>若是使用ssh進行故障切換,使用ssh通訊時用的密鑰存儲的位置 </description> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>3000</value> <description>ssh鏈接超時的最大時間</description> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/journal</value> <description>配置項用於設置journalnode節點保存本地狀態的目錄。本地路徑</description> </property> <property> <name>dfs.replication</name> <value>3</value> <description>數據備份數目</description> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://1421-0000:8485;1421-0003:8485;1421-0004:8485;1421-0005:8485;1421-0006:8485/hadoop-journal</value> <description>這是NameNode讀寫JNs組的uri。經過這個uri,NameNodes能夠讀寫edit log內容。hadoop-journal指journalnode設置的「dfs.journalnode.edits.dir」下的本地路徑</description> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/name</value> <description>本地磁盤目錄,NN存儲fsimage文件的地方。能夠是按逗號分隔的目錄列表,fsimage文件會存儲在所有目錄,冗餘安全。這裏多個目錄設定,最好在多個磁盤,另外,若是其中一個磁盤故障,不會致使系統故障,會跳過壞磁盤。因爲使用了HA,建議僅設置一個。本地路徑</description> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/data</value> <description>本地磁盤目錄,HDFS數據應該存儲Block的地方。能夠是逗號分隔的目錄列表(典型的,每一個目錄在不一樣的磁盤)。這些目錄被輪流使用,一個塊存儲在這個目錄,下一個塊存儲在下一個目錄,依次循環。每一個塊在同一個機器上僅存儲一份。不存在的目錄被忽略。必須建立文件夾,不然被視爲不存在。本地路徑</description> </property> </configuration>
該文檔主要配置 MapReduce 的計算框架類型和 Job 日誌記錄節點內容與保存路徑便可,如需對 MapReduce 過程資源分配調優,則能夠配置其 mapreduce.map.memory.mb、mapreduce.map.cpu.vcores、mapreduce.map.java.opts 等等,即對其 MapReduce 具體的每項流程進行資源配置,Map、Shuffle 和 Reduce 各佔用的內存與 CPU 核數,是否壓縮數據傳遞,在 Map 的到達百分之幾時開始進行 Reduce 操做,並行數與 Shuffle 佔 Reduce內存中的百分比等等
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.map.output.compress</name> <value>true</value> </property> <property> <name>mapreduce.reduce.shuffle.merge.percent</name> <value>0.66</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>1421-0003:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>1421-0003:19888</value> </property> <property> <name>mapreduce.jobhistory.intermediate-done-dir</name> <value>/hadoop/mr_history/tmp</value> <description> 參數解釋:MapReduce做業產生的日誌存放位置。HDFS路徑 </description> </property> <property> <name>mapreduce.jobhistory.done-dir</name> <value>/hadoop/mr_history/done</value> <description> 參數解釋:MR JobHistory Server管理的日誌的存放位置。HDFS路徑 </description> </property> </configuration>
<configuration> <!-- configeration for ResourceManger--> <property> <name>yarn.resourcemanager.hostname</name> <value>1423-0001</value> </property> <!-- configeration for NodeManager--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>16384</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value>/home/hadoop/software/cloud/hadoop-2.6.0/yarn/local</value> <description> 數據寫入本地文件系統路徑的列表用逗號分隔,多條存儲路徑能夠提升磁盤的讀寫速度 </description> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value>/home/hadoop/software/cloud/hadoop-2.6.0/yarn/log</value> <description> 本地文件系統日誌路徑的列表逗號分隔,多條存儲路徑能夠提升磁盤的讀寫速度 </description> </property> <!-- HA 配置 =============================================================== --> <!-- Resource Manager Configs --> <property> <name>yarn.resourcemanager.connect.retry-interval.ms</name> <value>2000</value> </property> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 使嵌入式自動故障轉移。HA環境啓動,與 ZKRMStateStore 配合 處理fencing --> <property> <name>yarn.resourcemanager.ha.automatic-failover.embedded</name> <value>true</value> </property> <!-- 集羣名稱,確保HA選舉時對應的集羣 --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-cluster</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 這裏RM主備結點須要單獨指定,(可選) <property> <name>yarn.resourcemanager.ha.id</name> <value>rm2</value> </property> --> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name> <value>5000</value> </property> <!-- ZKRMStateStore 配置 --> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>1421-0000:2181,1421-0003:2181,1421-0004:2181,1421-0005:2181,1421-0006:2181</value> </property> <property> <name>yarn.resourcemanager.zk.state-store.address</name> <value>1421-0000:2181,1421-0003:2181,1421-0004:2181,1421-0005:2181,1421-0006:2181</value> </property> <!-- Client訪問RM的RPC地址 (applications manager interface) --> <property> <name>yarn.resourcemanager.address.rm1</name> <value>1423-0001:23140</value> </property> <property> <name>yarn.resourcemanager.address.rm2</name> <value>1423-0002:23140</value> </property> <!-- AM訪問RM的RPC地址(scheduler interface) --> <property> <name>yarn.resourcemanager.scheduler.address.rm1</name> <value>1423-0001:23130</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>1423-0002:23130</value> </property> <!-- RM admin interface --> <property> <name>yarn.resourcemanager.admin.address.rm1</name> <value>1423-0001:23141</value> </property> <property> <name>yarn.resourcemanager.admin.address.rm2</name> <value>1423-0002:23141</value> </property> <!--NM訪問RM的RPC端口 --> <property> <name>yarn.resourcemanager.resource-tracker.address.rm1</name> <value>1423-0001:23125</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm2</name> <value>1423-0002:23125</value> </property> <!-- RM web application 地址 --> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>1423-0001:23188</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>1423-0002:23188</value> </property> <property> <name>yarn.resourcemanager.webapp.https.address.rm1</name> <value>1423-0001:23189</value> </property> <property> <name>yarn.resourcemanager.webapp.https.address.rm2</name> <value>1423-0002:23189</value> </property> </configuration>
1421-0000 1423-0001 1423-0002 1423-0003 1421-0003 1421-0004 1421-0005 1421-0006
1421-0001
/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/data
/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/name
/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/journal
/home/hadoop/software/cloud/hadoop-2.6.0/tmp
/home/hadoop/software/cloud/hadoop-2.6.0/yarn/local
/home/hadoop/software/cloud/hadoop-2.6.0/yarn/log
在全部的 ZK 節點執行命令:zkServer.sh start,查看各個 ZK 的從屬關係:zkServer.sh status 結果爲 Mode: follower or leader,注意:哪一個 ZK 節點會成爲 leader 默認是經過 ZK 快速選舉誕生的,這裏就不介紹其快速選舉的具體流程了。此時,在各個節點均可以查看到 ZK 進程,在 Shell 窗口下輸入jps 便可,內容以下:
xxxx QuorumPeerMain
xxxx Jps
任意 namenode 節點上執行:hdfs zkfc –formatZK
ZookeeperFailoverController 是用來監控 NN 狀態,協助實現主備 NN 切換的,因此僅僅在主備 NN 節點上啓動就行:hadoop-daemon.sh start zkfc,啓動後咱們能夠看到 ZKFC 進程:
xxxx Jps
xxxx DFSZKFailoverController
啓動用於主備 NN 之間同步元數據信息的共享存儲系統 JournalNode,參見角色分配表,在各個 JN 節點上啓動:hadoop-daemon.sh start journalnode,啓動後在各個 JN 節點均可以看到 JournalNode 進程:
xxxx QuorumPeerMain
xxxx Jps
xxxx JournalNode
格式化:hdfs namenode –format hadoop-cluster,注意:只有第一次啓動系統時需格式化,請勿重複格式化。在主 NN 節點執行命令啓動 NN:hadoop-daemon.sh start namenode
啓動後能夠看到 NN 進程:
xxxx Jps
xxxx NameNode
xxxx DFSZKFailoverController
hdfs namenode –bootstrapStandby,正常執行時的最後部分日誌中,INFO util.ExitUtil: Exiting with status 後的數字爲0 則是正常退出,即正常啓動。而若是爲其餘數字,則須要到 hadoop 安裝目錄下的 log 中查詢 namenode 啓動失敗的緣由,根據其描述進行解決。
(這一步能夠省略,這是在設置手動切換 NN 時的步驟,ZK 已經自動選擇一個節點做爲主 NN 了,若是兩個節點都是Standby,那麼能夠用下面的命令設置主NN,可是由於是自動切換的,因此兩個都是standby說明機羣有問題)
hdfs haadmin -transitionToActive nn1
由於namenode和resourcemanger都要戰勇很大量資源,因此把他倆分開部署。首先在1423-0001啓動yarn:start-yarn.sh,在備機啓動RM:yarn-daemon.sh start resourcemanager
在以後若是沒有特殊緣由,能夠經過命令 start-all.sh 和 stop-all.sh 分別啓動或關閉整個 Hadoop 集羣。
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /hadoop/input/zookeeper.out /hadoop/output/wordcount
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64 export HBASE_MANAGES_ZK=false
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://1421-0002:9000/hbase</value> <description></description> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> <description></description> </property> <property> <name>hbase.master</name> <value>1421-0002:6000</value> <description></description> </property> <property> <name>hbase.zookeeper.quorum</name> <value>1421-0000,1421-0003,1421-0004,1421-0005,1421-0006</value> <description></description> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> <description></description> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/hadoop/software/cloud/zookeeper-3.4.6/zoodata</value> <description></description> </property> <property> <name>hbase.zookeeper.property.logDir</name> <value>/home/hadoop/software/cloud/zookeeper-3.4.6/zoolog</value> <description></description> </property> </configuration>
1421-0000
1421-0001
1423-0001
1423-0002
1423-0003
1421-0003
1421-0004
1421-0005
1421-0006
Hbase 的啓動很是簡單,只須要在主節點上輸入 start-hbase.sh 便可啓動HMaster 與 HRegionServer 守護進程。
7.1 在我修改了整個機羣的機器名和hadoop,zookeeper配置後,在啓動hadoop,發現兩個namenode都是standby,以前都是好好的,可是又一次啓動以後發現兩個NN都是standby,那麼只能手動切換了,可是手動切換後剛開始是好的,可是過了一小會就海變成了standby,後來看日誌發現多是由於修改了機器名,可是沒有從新格式化,致使了文件中主機名不一致,其中有一個錯誤是關於ZK中edit的,而後只能從新格式化NN,格式化完就行了,可是數據沒備份,沒了。。
hdfs haadmin -transitionToActive --forcemanual nn1
附上一些實用命令
執行命令「hdfs haadmin」,會顯示子命令列表,以下
Usage: DFSHAAdmin [-ns <nameserviceId>] [-transitionToActive <serviceId>] [-transitionToStandby <serviceId>] [-failover [--forcefence] [--forceactive] <serviceId> <serviceId>] [-getServiceState <serviceId>] [-checkHealth <serviceId>] [-help <command>]
若是要查看具體用法,使用「hdfs haadmin -help <command>」。其中,
transitionToActive和transitionToStandby是用於在不一樣狀態之間切換的。這些命令沒有任何防禦錯誤,不多使用。
failover 初始化一個故障恢復。該命令會從一個失效的NameNode切換到另外一個上面。
getServiceState 獲取當前NameNode的狀態。
checkHealth 檢查NameNode的狀態。正常就返回0,不然返回非0值。