Hadoop3.1.4高可用環境搭建


規划部署節點

HDFS高可用至少有兩個NameNode(NN),副本存三份有 三個DataNode(DN)。Yarn高可用至少有兩個Resource Manager(RM),計算向存儲移動需要在每個DataNode上部署NodeManager(NM)。Zookeeper(ZK)三節點選主。JournalNode(JN)三節點才有過半成功。基於以上考慮,規划部署節點如下:

主機

ip

NN RM ZKFC DN NM JN ZK
master1 10.0.0.69        
master2 10.0.0.70        
slave1 10.0.0.71      
slave2 10.0.0.72      
slave3 10.0.0.73      

注意:1.ZKFC與NameNode必須同節點才能選主。

           2.DataNode與NodeManager必須同節點,體現計算向數據移動。

節點免密和網絡配置

   先要關閉五台機的防火牆,這一點非常重要。否則后面啟動zookeeper后,zkServer.sh status不能正常查看zk狀態,三個zk之間無法通訊。第二個Namenode也無法同步第一個Namenode的數據。

systemctl stop firewalld
systemctl disable firewalld

按照規划修改/etc/hostname文件中的主機名,在/etc/hosts文件中增加五台機的主機名解析。
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.69 master1
10.0.0.70 master2
10.0.0.71 slave1
10.0.0.72 slave2
10.0.0.73 slave3

    節點免密

由於master1、master2上可能會啟動其他節點的腳本,所以master1和master2要對其他節點免密。
以master1為例,依次輸入以下命令,將master1的公鑰分發給其他節點,達到免密登錄的目的。
注意一點,ssh-copy-id生成的authorized_keys權限是600,如果權限是644就沒辦法免密登錄,這個文件權限要求很苛刻。
ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
ssh-copy-id -i ~/.ssh/id_dsa.pub root@master2
scp ~/.ssh/id_dsa root@master2

zookeeper分布式集群搭建

從官網上下載apache-zookeeper-3.5.8-bin.tar.gz, 將文件解壓到/usr/local/zookeeper,復制zoo_sample.cfg到同一目錄,命名為zoo.cfg.然后在文件里配置

dataDir=/usr/local/zookeeper/data
server.1=slave1:2888:3888
server.2=slave2:2888:3888
server.3=slave3:2888:3888
然后在創建文件/usr/local/zookepper/data/myid,並寫入相應的id【例如1】

其他2節點重復上面步驟,然后在各機器上執行/usr/local/zookeeper/bin/zkServer.sh start來啟動zookeeper集群。

Hadoop分布式集群搭建

Hadoop基於Java開發,必須先安裝jdk。本次實驗使用的版本是jdk-11.0.8,安裝完成后需要在環境變量里加入JAVA_HOME。

  下載Hadoop

   從官網下載hadoop-3.1.4.tar.gz,解壓到/usr/local/hadoop目錄下

   配置Hadoop

    1. 修改/usr/local/hadoop/etc/hadoop/hadoop.env.sh

     export HADOOP_HOME=/usr/local/hadoop
     export ZOOKEEPER_HOME=/usr/local/zookeeper
     export HDFS_NAMENODE_USER=root # 為hadoop配置三個角色的用戶
     export HDFS_SECONDARYNAMEDODE_USER=root
     export HDFS_DATANODE_USER=root
     export HDFS_JOURNALNODE_USER=root
     export HDFS_ZKFC_USER=root
     export YARN_NODEMANAGER_USER=root
     export YARN_RESOURCEMANAGER_USER=root
     export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

    2. 修改/usr/local/hadoop/etc/hadoop/core-site.xml

<configuration>
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://mycluster</value>
    </property>
    <property>
      <name>hadoop.tmp.dir</name>
      <value>/opt/hadoop/tmp</value>
    </property>
     <property>
       <name>ha.zookeeper.quorum</name>
       <value>slave1:2181,slave2:2181,slave3:2181</value>
     </property>
</configuration>

3. 修改/usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
    </property>
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>master1:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>master2:8020</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>master1:9870</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>master2:9870</value>
    </property>
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://slave1:8485;slave2:8485;slave3:8485/mycluster</value>
    </property>
    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/root/.ssh/id_rsa</value>
    </property>
    <property>
      <name>dfs.ha.fencing.ssh.connect-timeout</name>
      <value>30000</value>
    </property>
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/usr/local/hadoop/journaldata</value>
    </property>
    <property>
      <name>dfs.ha.nn.not-become-active-in-safemode</name>
      <value>true</value>
    </property>
     <property>
       <name>dfs.ha.automatic-failover.enabled</name>
       <value>true</value>
     </property>
</configuration>
4. 修改/usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*</value>
    </property>
    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
</configuration>

5. 修改/usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.application.classpath</name>
        <value>這里配置為master1上執行hadoop classpath返回的內容</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
    <property>
      <name>yarn.resourcemanager.ha.enabled</name>
      <value>true</value>
    </property>
    <property>
      <name>yarn.resourcemanager.cluster-id</name>
      <value>cluster1</value>
    </property>
    <property>
      <name>yarn.resourcemanager.ha.rm-ids</name>
      <value>rm1,rm2</value>
    </property>
    <property>
      <name>yarn.resourcemanager.hostname.rm1</name>
      <value>master1</value>
    </property>
    <property>
      <name>yarn.resourcemanager.hostname.rm2</name>
      <value>master2</value>
    </property>
    <property>
      <name>yarn.resourcemanager.webapp.address.rm1</name>
      <value>master1:8088</value>
    </property>
    <property>
      <name>yarn.resourcemanager.webapp.address.rm2</name>
      <value>master2:8088</value>
    </property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property> <property> <name>hadoop.zk.address</name> <value>slave1:2181,slave2:2181,slave3:2181</value> </property> </configuration>

6. 修改/usr/local/hadoop/etc/hadoop/workers
slave1
slave2
slave3

   啟動Hadoop

1. 在slave1、slave2、slave3三台機執行/usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode命令,啟動journalnode。

2. 在master1上執行/usr/local/hadoop/bin/hadoop namenode -format,對HDFS格式化【執行一次即可,后序無須執行】。
3. 第一次啟動,在master1上執行/usr/local/hadoop/sbin/hadoop-daemon.sh start namenode。

4.
在master2上執行/usr/local/hadoop/bin/hadoop namenode -bootstrapStandby同步master1的信息。

5.
在master1上執行/usr/local/hadoop/bin/hdfs zkfc -formatZK格式化zkfc

6.
以上操作完成之后,在master1上執行/usr/local/hadoop/sbin/stop-all.sh,把相關的服務全部停掉。

7. 在master1上執行start-all.sh,啟動集群。

此時hadoop高可用集群已經搭建完成,我們可以訪問http://master1:9870,將會進入hadoop web UI

      當然,我們也可以訪問http://master1:8088可以訪問yarn web

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM