Hadoop是一個環境敏感的框架,在Win和類Unix上安裝的差別較大,但是一般我們都在Linux上進行安裝,這里安裝的版本為2.6.4,apache提供的hadoop-2.6.4的安裝包是在32位操作系統編譯的,因為hadoop依賴一些C++的本地庫,所以如果在64位的操作上安裝hadoop-2.6.4就需要重新在64操作系統上重新編譯;
一、環境準備
- 修改主機名,修改IP,添加主機名和IP的映射關系(/etc/hosts),配置免密登錄,配置防火墻(也可以直接關閉);
- 安裝JDK和配置環境變量;
二、集群安裝規劃
- 由于是HA集群,所以牽扯到的機器比以前稍多幾臺,當然也可以共用,提前做好集群的安裝規劃還是比較好的選擇:
主機名 規劃IP 要安裝軟件 角色 hdp1 192.168.70.130 JDK、hadoop NameNode、DFSZKFailoverController hdp2 192.168.70.131 JDK、hadoop NameNode、DFSZKFailoverController(zkfc) hdp3 192.168.70.132 JDK、hadoop ResourceManager hdp4 192.168.70.133 JDK、hadoop ResourceManager hdp5 192.168.70.135 JDK、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain hdp6 192.168.70.136 JDK、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain hdp7 192.168.70.137 JDK、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain - 注意:
- 在hadoop2.0中通常由兩個NameNode組成,一個處于active狀態,另一個處于standby狀態。Active NameNode對外提供服務,而Standby狀態的NameNode則不對外提供服務,僅同步Active狀態的NameNode的狀態,以便能夠在它失敗時快速進行切換。hadoop2.0官方提供了兩種HDFS的HA解決方案,一種是NFS,另一種是QJM。這里我們使用簡單的QJM。對于QJM,主備NameNode之間通過一組JournalNode同步元數據信息,一條數據只要成功寫入多數JournalNode即認為寫入成功,所以通常配置奇數個JournalNode;這里還配置了一個ZooKeeper集群,用于ZKFC(DFSZKFailoverController)故障轉移,當Active狀態的NameNode掛掉了,會自動切換Standby狀態的NameNode為Active狀態;
- hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.6.4解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調;
三、開始安裝
- 安裝ZooKeeper集群:
- 解壓tar.gz安裝包:
tar -zxvf zookeeper-3.4.5.tar.gz -C /usr/local/apps
; - 修改配置:
- 進入ZK的安裝目錄(后面簡稱:<ZK_HOME>)的conf文件夾:
cp zoo_sample.cfg zoo.cfg
; - 在
zoo.cfg
文件最后添加- 數據輸出目錄
dataDir=<your-hdp-data-dir>
,默認是在/tmp
文件夾下,不安全,并確保這個文件夾存在; - 節點間的關系,以及通訊接口:2888端口號是zookeeper服務之間通信的端口。 3888端口是zookeeper與其他應用程序通信的端口:
server.1=hdp5:2888:3888 server.2=hdp6:2888:3888 server.3=hdp7:2888:3888
- 數據輸出目錄
- 把配置好的hadoop安裝目錄拷貝到hdp6和hdp7:
scp -r <ZK_HOME>/zookeeper-3.4.5/hdp6:<ZK_HOME> scp -r <ZK_HOME>/zookeeper-3.4.5/hdp7:<ZK_HOME>
- 并把節點編號寫入各自節點數據輸出目錄的myid目錄,這里的節點編號分別是:1,2,3:
echo <num> > <your-hdp-data-dir>/myid
- 進入ZK的安裝目錄(后面簡稱:<ZK_HOME>)的conf文件夾:
- 解壓tar.gz安裝包:
- 安裝Hadoop集群:
- 解壓hadoop-2.6.4.tar.gz
- 配置環境變量,包括根路徑(HADOOP_HOME)和bin;
- 修改配置文件,這些配置文件全部位于
<HADOOP_HOME>/etc/hadoop
目錄下:- 在hadoo-env.sh文件中添加JAVA_HOME
export JAVA_HOME=<your-java-home>
- 修改core-site.xml,在最后添加:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.100.101:9000</value> <description>The name of the default file system</description> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/app/hdpdata/</value> <description>A base for other temporary directories</description> </property> <property> <name>ha.zookeeper.quorum</name> <value>hdp5:2181,hdp6:2181,hdp7:2181</value> <description>A list of ZooKeeper server addresses, separated by commas, that are to be used by the ZKFailoverController in automatic failover.</description> </property> </configuration>
- 修改hdfs-site.xml,在最后添加:
<configuration> <property> <name>dfs.nameservices</name> <value>ns</value> <description>指定hdfs的nameservice為ns,需要和core-site.xml中的保持一致</description> </property> <property> <name>dfs.ha.namenodes.ns</name> <value>nn1,nn2</value> <description>ns下面有兩個NameNode,分別是nn1,nn2</description> </property> <property> <name>dfs.namenode.rpc-address.ns.nn1</name> <value>hdp1:9000</value> <description>nn1的RPC通信地址</description> </property> <property> <name>dfs.namenode.http-address.ns.nn1</name> <value>hdp1:50070</value> <description>nn1的http通信地址</description> </property> <property> <name>dfs.namenode.rpc-address.ns.nn2</name> <value>hdp2:9000</value> <description>nn2的RPC通信地址</description> </property> <property> <name>dfs.namenode.http-address.ns.nn2</name> <value>hdp2:50070</value> <description>nn2的http通信地址</description> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hdp5:8485;hdp6:8485;hdp7:8485/ns</value> <description>指定NameNode的edits元數據在JournalNode上的存放位置</description> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hdp5/journaldata</value> <description>指定JournalNode在本地磁盤存放數據的位置</description> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> <description>開啟NameNode失敗自動切換</description> </property> <property> <name>dfs.client.failover.proxy.provider.ns</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <description>配置失敗自動切換實現方式</description> </property> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> <description>配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行</description> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/shreker/.ssh/id_rsa</value> <description>使用sshfence隔離機制時需要ssh免登陸</description> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> <description>配置sshfence隔離機制超時時間</description> </property> </configuration>
- 修改mapred-site.xml,在最后添加:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description>指定MR資源調度框架為yarn</description> </property> </configuration>
- 修改yarn-site.xml,在最后添加:
<configuration> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> <description>開啟RM高可用</description> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> <description>指定RM的cluster id</description> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> <description>指定RM的名字</description> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hdp3</value> <description>指定RM的地址</description> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hdp4</value> <description>指定RM的地址</description> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>hdp5:2181,hdp6:2181,hdp7:2181</value> <description>指定zk集群地址</description> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> <description>指定服務名稱</description> </property> </configuration>
- 指定當前節點的子節點,修改slaves文件:
hdp5 hdp6 hdp7
- 在hadoo-env.sh文件中添加JAVA_HOME
- 分發配置好的Hadoop到后面的機器:
scp -r <local-hadoop-home-dir> <user>@<host>:<target-parent-dir>
- 啟動集群
- 在hdp5、hdp6、hdp7上啟動zookeeper集群:
zkServer.sh start
- 在hdp5、hdp6、hdp7上啟動JournalNode:
hadoop-daemon.sh start journalnode
- 分別在ns的nn1和nn2上初始化HDFS的NameNode,注意兩個cluster-id必須一致,完成之后就會把元數據拷貝到對應的StandBy的機器上:
hdfs namenode -format -clusterID <your-cluster-id>
- 初始化ZKFC操作:
hdfs zkfc -formatZK
- 啟動HDFS(根據規劃在hdp1上執行):
start-dfs.sh
- 啟動YARN(為了性能把NameNode和ResourceManager放在不同的機器上,選擇hdp2):
start-yarn.sh
- 在hdp5、hdp6、hdp7上啟動zookeeper集群:
四、驗證測試
- 訪問瀏覽器:http://hdp1:50070和http://hdp2:50070;
- 驗證HA
- 上傳文件;
- 瀏覽器訪問,如1;
- 干掉hdp1上Active的NameNode:
kill -9 <nn-pid>
; - 瀏覽器訪問,如1,發現hdp2上NameNode的狀態已經切換為Active;
- 啟動剛才干掉的NameNode,狀態切換為StandBy;
五、常用集群測試命令
- 查看hdfs的各節點狀態信息
hdfs dfsadmin -report
- 獲取一個NameNode節點的HA狀態
hdfs haadmin -getServiceState nn1
- 單獨啟動一個NameNode進程
hadoop-daemon.sh start namenode
- 單獨啟動一個zkfc進程
hadoop-daemon.sh start zkfc