1. 程式人生 > >hadoop + zookeepe HA架構搭建

hadoop + zookeepe HA架構搭建

確保5臺linux系統節點已準備
|主機名| 記憶體|cpu
|nna|2G|2核
|nns|2G|2核
|dn1|1G|1核
|dn2|1G|1核
dn3|1G|1核

2、所有linux系統配置hosts系統檔案。新增ip對映,
vi /etc/hosts
在這裡插入圖片描述
3、建立hadoop 賬號,用來專門管理叢集環境
useradd hadoop
passwd hadoop
//建立後再sudoers檔案新增hadoop
3.1 新增 sudoers 寫許可權
chmod +w /etc/sudoers
3.2 vi在末尾新增:hadoop ALL=(root)NOPASSWD:ALL
3.3 關閉寫許可權
chmod -w /etc/sudoers

4.SSH 免密登入
4.1 在nna 節點下 生成該節點的私鑰和公鑰
ssh-keygen -t rsa
4.2 認證授權,將id-rsa.pub 檔案內容追加到authorized_keys 檔案中,如果在、~/.ssh 目錄下沒有authorized_keys 檔案,自己手動新增即可。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/suthorized_keys

4.3 檔案授權,賦予600許可權
chmod 600 ~/.ssh/authorized_keys
4.4 其他節點通過使用hadoop 賬號授權,然後將各個節點的id_rsa.pub 追加到nna 節點的authorized_keys 中
,生成公鑰後,使用 ssh-copy-id nna,即可
在這裡插入圖片描述


4.5 在完成所有節點公鑰追加之後,將nna節點下的authorized_keys 檔案通過scp,分發到其他節點的hadoop ~/.ssh 目錄下。
在這裡插入圖片描述
5 、關閉防火牆
所有linux系統都執行下面語句關閉防火牆,當然我的是centos7,不同版本關閉防火牆命令不同,自行百度。
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動**
6修改時區。確保hadoop叢集各個節點時間同步。
能與當前網路的時間有誤差。下面介紹一下與時間伺服器上的時間同步的方法

  1. 安裝ntpdate工具
    yum -y install ntp ntpdate
    (如果安裝不了,請在/etc/sysconfig/network_scripts 下面的ifcfg-ens33, 新增域名)
    在這裡插入圖片描述
  2. 將系統時間寫入硬體時間
    hwclock --systohc

在這裡插入圖片描述

在data 檔案下面建立myid 檔案,在該檔案下入一個0-255之間的整數,每個節點這個數字都是唯一的,本書的這些數字從1開始。
比如server.1=dn1:2888:3888,那麼在節點dn1,就應該填數字1.
然後scp同步dn1節點上的zookeeper檔案到其他節點
在這裡插入圖片描述

7.4 配置zookeeper 環境變數:dn1,dn2,dn3 節點都需要
在 /etc/profile 下新增
export ZK_HOME=/home/hadoop/zookeeper
export PATH=$ PATH:$ZK_HOME/bin
在這裡插入圖片描述

7.5 驗證 ,在dn1,dn2,dn3終端輸入jps命令:如下圖,有了QuorumPeerMian
在這裡插入圖片描述

8、部署安裝hadoop
下載hadoop 安裝包,並解壓到/home/hadoop 目錄下
,配置環境變數:
export HADOOP_HOME=/home/hadoop/hadoop-2.7.7
exprot PATH=PATH:PATH:HADOOP_HOME

8.2 配置 core-site.xml

  <configuration>
    <!--指定分散式系統檔案儲存的nameservice 為cluster1-->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://cluster1</value>
    </property>
    <!-- 指定hadoop臨時目錄 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/hadoop-2.7.7/tmp</value>
    </property>  
    <!-- 指定zookeeper地址 -->
    <property>
    <name>ha.zookeeper.quorum</name>
    <value>dn1:2181,dn2:2181,dn3:2181</value>
    </property>
    <!-- 所有賬戶都可以訪問 -->
    <property>
    <name>hadoop.proxyuser.hadoop.groups</name>
    <value>*</value>
    </property>
    <!-- 所有IP都可以訪問 -->
    <property>
    <name>hadoop.proxyuser.hadoop.hosts</name>
    <value>*</value>
    </property>
    </configuration>
配置 yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <!-- RM(Resource Manager)失聯後重新連結的時間 -->
  <property>
    <name>yarn.resourcemanager.connect.retry-interval.ms</name>
    <value>2000</value>
  </property>
  <!-- 開啟Resource Manager HA,預設為false -->
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <!-- 配置Resource Manager -->
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>dn1:2181,dn2:2181,dn3:2181</value>
  </property>
  <!-- 開啟故障自動切換 -->
  <property>
    <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
  <!-- rm1配置開始 -->
  <!-- 配置Resource Manager主機別名rm1角色為NameNode Active-->
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>nna</value>
  </property>
  <!-- 配置Resource Manager主機別名rm1角色為NameNode Standby-->
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>nns</value>
  </property>
  <!-- 在nna上配置rm1,在nns上配置rm2,將配置好的檔案遠端複製到其它機器上,但在yarn的另一個機器上一定要修改-->
  <property>
    <name>yarn.resourcemanager.ha.id</name>
    <value>rm1</value>
  </property>
  <!-- 開啟自動恢復功能 -->
  <property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property>
  <!-- 配置與zookeeper的連線地址 -->
  <property>
    <name>yarn.resourcemanager.zk-state-store.address</name>
    <value>dn1:2181,dn2:2181,dn3:2181</value>
  </property>
  <!--用於持久化RM(Resource Manager簡稱)狀態儲存,基於Zookeeper實現 -->
  <property>
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  </property>
  <!-- Zookeeper地址用於RM(Resource Manager)實現狀態儲存,以及HA的設定-->
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>dn1:2181,dn2:2181,dn3:2181</value>
  </property>
  <!-- 叢集ID標識 -->
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>cluster1-yarn</value>
  </property>
  <!-- schelduler失聯等待連線時間 -->
  <property>
    <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
    <value>5000</value>
  </property>
  <!-- 配置rm1,其應用訪問管理介面 -->
  <property>
    <name>yarn.resourcemanager.address.rm1</name>
    <value>nna:8132</value>
  </property>
  <!-- 排程介面地址 -->
  <property>
    <name>yarn.resourcemanager.scheduler.address.rm1</name>
    <value>nna:8130</value>
  </property>
  <!-- RM的Web訪問地址 -->
  <property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>nna:8188</value>
  </property>
  <property>
    <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
    <value>nna:8131</value>
  </property>
  <!-- RM管理員介面地址 -->
  <property>
    <name>yarn.resourcemanager.admin.address.rm1</name>
    <value>nna:8033</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.admin.address.rm1</name>
    <value>nna:23142</value>
  </property>
  <!-- rm1配置結束 -->
  <!-- rm2配置開始 -->
  <!-- 配置rm2,與rm1配置一致,只是將nna節點名稱換成nns節點名稱 -->
  <property>
    <name>yarn.resourcemanager.address.rm2</name>
    <value>nns:8132</value>
  </property>
  <property>
    <name>yarn.resourcemanager.scheduler.address.rm2</name>
    <value>nns:8130</value>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>nns:8188</value>
  </property>
  <property>
    <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
    <value>nns:8131</value>
  </property>
  <property>
    <name>yarn.resourcemanager.admin.address.rm2</name>
    <value>nns:8033</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.admin.address.rm2</name>
    <value>nns:23142</value>
  </property>
  <!-- rm2配置結束 -->
  <!-- NM(NodeManager得簡稱)的附屬服務,需要設定成mapreduce_shuffle才能執行MapReduce任務 -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <!-- 配置shuffle處理類 -->
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>
  <!-- NM(NodeManager得簡稱)本地檔案路徑 -->
  <property>
    <name>yarn.nodemanager.local-dirs</name>
    <value>/home/hadoop/hadoop-2.7.7/yarn/local</value>
  </property>
  <!-- NM(NodeManager得簡稱)日誌存放路徑 -->
  <property>
    <name>yarn.nodemanager.log-dirs</name>
    <value>/home/hadoop/hadoop-2.7.7/yarn/log</value>
  </property>
  <!-- ShuffleHandler執行服務埠,用於Map結果輸出到請求Reducer  -->
  <property>
    <name>mapreduce.shuffle.port</name>
    <value>23080</value>
  </property>
  <!-- 故障處理類 -->
  <property>
    <name>yarn.client.failover-proxy-provider</name>
    <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value>
  </property>
  <!-- 故障自動轉移的zookeeper路徑地址 -->
  <property>
    <name>yarn.resourcemanager.ha.automatic-failover.zk-base-path</name>
    <value>/yarn-leader-election</value>
  </property>
  <property>
    <name>mapreduce.jobtracker.address</name>
    <value>http://nna:9001</value>
  </property>
 <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
 </property>
 <property>
     <name>yarn.nodemanager.remote-app-log-dir</name>
     <value>/tmp/logs</value>
 </property>
 <property>
     <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
     <value>logs</value>     
  </property>
 <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>259200</value>
 </property>
 <property>
    <name>yarn.log-aggregation.retain-check-interval-seconds</name>
    <value>3600</value>
 </property>
<property>
    <name>yarn.web-proxy.address</name>
    <value>nna:8090</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.system-metrics-publisher.enabled</name>
    <value>true</value>
</property>
<property>
    <name>yarn.scheduler.fair.allocation.file</name>
    <value>/data/soft/new/hadoop/etc/hadoop/fair-scheduler.xml</value>
</property>
 -->
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>1024</value>
</property>
<property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>1</value>
</property>
<property>
  <name>yarn.nodemanager.vmem-pmem-ratio</name>
  <value>4.2</value>
</property>
</configuration>

配置mapred-site.xml

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <!-- 指定mr框架為yarn方式 -->
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    <property>
         <name>mapreduce.jobhistory.address</name>
         <value>0.0.0.0:10020</value>
    </property>
    <property>
         <name>mapreduce.jobhistory.webapp.address</name>
         <value>0.0.0.0:19888</value>
    </property>
    </configuration>
配置hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice為...,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
<!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>nna,nns</value>
</property>
<!-- nna的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster1.nna</name>
<value>nna:9000</value>
</property>
<!-- nna的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.cluster1.nna</name>
<value>nna:50070</value>
</property>
<!-- nns的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster1.nns</name>
<value>nns:9000</value>
</property>
<!-- nns的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.cluster1.nns</name>
<value>hostbb:50070</value>
</property>
<!-- 指定NameNode的元資料在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://dn1:8485;dn2:8485;dn3:8485/cluster1</value>
</property>
<!-- 指定JournalNode在本地磁碟存放資料的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/hadoop-2.7.7/journaldata</value>
</property>
<!-- 開啟NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制方法-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 指定元資料冗餘分數 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定datanode 資料儲存地址 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/hadoop-2.7.7/nodedata</value>
</property>
<!-- 指定web 訪問hdfs目錄 -->
<property>
<name>dfs.webhdfs.enable</name>
<value>true</value>
</property>
<!-- 實現自動故障切換 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>dn1:2181,dn2:2181,dn3:2181</value>
</property>
</configuration>

8.3 啟動journalnode
8.3.1 在任意一臺namdnode節點上啟動Journalnode
sbin/hadoop-daemon.sh start journalnode
8.3.2 輸入jps
檢視終端是否 顯示對應執行緒(journalNode)
在這裡插入圖片描述

8.4,啟動hadoop
初次啟動叢集時,需要格式化namenode節點,
bin/hdfs namenode -format
8.5 向zookeeper 註冊
bin/hdfs zkfc -formatZK
8.6啟動叢集
bin/hdfs start-all.sh

我的是在windows 系統下訪問,記得修改win的hosts 地址對映,
加上
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述