Hadoop徹底分佈式集羣搭建

Hadoop徹底分佈式集羣搭建

1、介紹

    Hadoop2.0中,2個NameNode的數據實際上是實時共享的。新HDFS採用了一種共享機制,Quorum Journal Node(JournalNode)集羣或者Nnetwork File System(NFS)進行共享。NFS是操做系統層面的,JournalNode是hadoop層面的,咱們這裏使用JournalNode集羣進行數據共享(這也是主流的作法)。以下圖所示,即是JournalNode的架構圖。java

    兩個NameNode爲了數據同步,會經過一組稱做JournalNodes的獨立進程進行相互通訊。當active狀態的NameNode的命名空間有任何修改時,會告知大部分的JournalNodes進程。standby狀態的NameNode有能力讀取JNs中的變動信息,而且一直監控edit log的變化,把變化應用於本身的命名空間。standby能夠確保在集羣出錯時,命名空間狀態已經徹底同步了。node

    對於HA集羣而言,確保同一時刻只有一個NameNode處於active狀態是相當重要的。不然,兩個NameNode的數據狀態就會產生分歧,可能丟失數據,或者產生錯誤的結果。爲了保證這點,這就須要利用使用ZooKeeper了。首先HDFS集羣中的兩個NameNode都在ZooKeeper中註冊,當active狀態的NameNode出故障時,ZooKeeper能檢測到這種狀況,它就會自動把standby狀態的NameNode切換爲active狀態。web

2、配置

一、準備環境

    這裏搭建一個5臺服務器的集羣,固然最低三臺也能夠搭建。shell

    Zookeeper版本:3.4.7apache

    Hadoop版本:2.7.1bootstrap

1.主機角色分配

    如下爲每臺服務器的角色分配,能夠根據本身的服務器數量進行調整。vim

1>hadoop01

    Zookeeper、NameNode、DFSZKFailoverController、ResourceManager。bash

2>hadoop02

    Zookeeper、NameNode二、DFSZKFailoverController。服務器

3>hadoop03

    Zookeeper、DataNode、NodeManager、JournalNode。架構

4>hadoop04

    Zookeeper、DataNode、NodeManager、JournalNode。

5>hadoop05

    Zookeeper、DataNode、NodeManager、JournalNode。

2.關閉防火牆

    通常的生產環境不須要系統自帶的防火牆,若是沒有外置的防火牆也能夠開啓,可是要將通訊的端口等在防火牆中容許經過。這裏爲了實驗的簡單,就直接將防火牆關閉。

service iptables status #查看防火牆狀態
service iptables start #當即開啓防火牆,可是重啓後失效。
service iptables stop #當即關閉防火牆,可是重啓後失效。

#重啓後生效

chkconfig iptables on #開啓防火牆,重啓後生效。
chkconfig iptables off #關閉防火牆,重啓後生效。

  

3.配置主機名

    修改文件 /etc/sysconfig/network

vim /etc/sysconfig/network

    !!!!!注意安裝hadoop的集羣主機名不能有下劃線!!否則會找不到主機!沒法啓動!

source /etc/sysconfig/network

    通過上面的修改,主機名稱不會立刻改變,必須重啓才能生效。因此可使用以下命令進行當即更改:

hostname

4.配置hosts

    修改文件 /etc/hosts

vim /etc/hosts

    填入如下內容

127.0.0.1 hadoop01
其餘主機和ip對應信息。。。

    以上兩部操做是爲了實現ip的解耦,若是你在多個框架服務裏所有填寫的是ip那麼,一旦你服務器的ip發生改變,那麼每一個服務框架都須要修改ip,若是你設置的是主機名,那麼當你的服務器ip發生改變,只須要修改hosts文件中,主機名和ip的映射關係便可。

5.配置免密登陸

    集羣中全部主機都要互相進行免密登陸。

    生成密鑰:

ssh-keygen

發送公鑰:

ssh-copy-id root@hadoop01

    此時在遠程主機的/root/.ssh/authorized_keys文件中保存了公鑰,在known_hosts中保存了已知主機信息,當再次訪問的時候就不須要輸入密碼了。

ssh hadoop01

    經過此命令遠程鏈接,檢驗是否能夠不需密碼鏈接。

    這裏須要注意的是必定要給本機也發送一下。

6.安裝jdk

1>解壓安裝

    經過fz將jdk安裝包上傳、解壓安裝包,命令以下:

​​​​​​​tar -zxvf [jdk安裝包位置]

2>配置環境變量

    修改/etc/profile。

    這個文件是每一個用戶登陸時都會運行的環境變量設置,當用戶第一次登陸時,該文件被執行。並從/etc/profile.d目錄的配置文件中搜集shell的設置。

vim /etc/profile

    在文件行尾加入如下內容後保存退出。

export JAVA_HOME=/home/app/jdk1.7.0_45/
export PATH=$PATH:$JAVA_HOME/bin

3>從新加載

    從新加載profile使配置生效。

source /etc/profile

    環境變量配置完成,測試環境變量是否生效。

echo $JAVA_HOME
java -version

7.搭建Zookeeper集羣

    參見:ZooKepper集羣搭建

二、配置hadoop

1.解壓

    將安裝包上傳到服務器,進行解壓。

tar -zxvf hadoop-2.7.1_64bit.tar.gz

2.修改配置

    如下文件均爲Hadoop徹底分佈式須要配置的文件。此配置按照上述的5臺服務器組件的集羣。

1>hadoop-env.sh

    在此文件中,將java的環境變量改成和/etc/profile文件中的java環境變量值一致便可。

JAVA_HOME=/home/app/jdk1.7.0_45/

2>core-site.xml

    如下爲此文件的配置模版。

<configuration>
<!-- 指定hdfs的nameservice爲ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定hadoop數據臨時存放目錄-->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/work/hadoop-2.7.1/tmp</value>
</property>
<!--指定hdfs操做數據的緩衝區大小 能夠不配-->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181,hadoop05:2181</value>
</property>
</configuration>

3>hdfs-site.xml

<configuration>
<!--指定hdfs的nameservice爲ns,須要和core-site.xml中的保持一致 --> <property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop01:9000</value>
</property>
<!-- nn1的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop01:50070</value>
</property>
<!-- nn2的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop02:9000</value>
</property>
<!-- nn2的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop02:50070</value>
</property>
<!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop03:8485;hadoop04:8485;hadoop05:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/root/work/hadoop-2.7.1/tmp/journal</value>
</property>
<!-- 開啓NameNode故障時自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機制時須要ssh免登錄 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- namenode存儲位置 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/root/work/hadoop-2.7.1/tmp/name</value>
</property>    
<!-- dataode存儲位置 -->
<property>    
<name>dfs.datanode.data.dir</name>
<value>/root/work/hadoop-2.7.1/tmp/data</value>
</property>
<!-- 副本數量根據本身的需求配置,這裏配置2個 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 在NN和DN上開啓WebHDFS (REST API)功能,不是必須 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>

4>mapred-site.xml

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

5>yarn-site.xml

<configuration>
<!-- 指定nodemanager啓動時加載server的方式爲shuffle server -->
<property>    
<name>yarn.nodemanager.aux-services</name>    
<value>mapreduce_shuffle</value>    
</property>  
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
</configuration>

6>slaves

    這裏咱們將hadoop0三、hadoop0四、hadoop05配置爲存儲數據的節點。

vim slaves
hadoop03
hadoop04
hadoop05

3.環境變量

    配置文件/etc/profile:

vim /etc/profile

在其末尾追加以下內容:

export HADOOP_HOME=[hadoop的安裝路徑]
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

4.其餘服務器

    使用scp命令將配置文件拷貝到其餘服務器上。

    這裏要注意,若是其餘服務器的jdk,Zookeeper等配置和當前這臺服務器的配置是同樣的話,直接拷貝過去不用修改。

3、啓動

    啓動徹底分佈式hadoop:

一、啓動zk集羣 

./zkServer.sh start

二、啓動jn集羣

sbin/hadoop-daemons.sh start journalnode

1.格式化zkfc

    第一次啓動要格式化

hdfs zkfc -formatZK

2.格式化hdfs

    第一次啓動要格式化

hadoop namenode -format

三、啓動NameNode

在hadoop01上:

hadoop-daemon.sh start namenode

在hadoop02上:

hdfs namenode -bootstrapStandby #把NameNode的數據同步到hadoop02上
hadoop-daemon.sh start namenode #啓動備用的namenode

 

四、啓動DataNode

hadoop-daemons.sh start datanode

五、啓動yarn

start-yarn.sh

六、啓動ZKFC

    在hadoop01

hadoop-daemon.sh start zkfc

    在hadoop02

hadoop-daemon.sh start zkfc

 

七、啓動以後

    啓動完成以後,使用jps命令查看各臺服務器,進程以下:

    hadoop01:

10877 QuorumPeerMain
11351 NameNode
11871 DFSZKFailoverController
11570 ResourceManager

    hadoop02:

16019 QuorumPeerMain
16214 NameNode
16344 DFSZKFailoverController

    hadoop03:

16548 QuorumPeerMain
16783 DataNode
16893 NodeManager
16701 JournalNode

    hadoop04:

16565 QuorumPeerMain
16798 DataNode
16908 NodeManager
16716 JournalNode

    hadoop05:

16562 QuorumPeerMain
16809 DataNode
16919 NodeManager
16727 JournalNode

    至此整個集羣搭建完成,能夠正常使用!

 

上一篇:Hadoop僞分佈式模式搭建

下一篇:Hadoop-HDFS基礎原理與操做

相關文章
相關標籤/搜索