雲服務器搭建高可用Hadoop集群


一、高可用HDFS

    hadoop基礎組成:https://www.cnblogs.com/funyoung/p/9889719.html

  1、HDFS基礎結構

  

  2、高可用HDFS架構

 

   

  • 主備切換控制器 ZKFailoverController:ZKFailoverController 作為獨立的進程運行,對 NameNode 的主備切換進行總體控制。ZKFailoverController 能及時檢測到 NameNode 的健康狀況,在主 NameNode 故障時借助 Zookeeper 實現自動的主備選舉和切換,當然 NameNode 目前也支持不依賴於 Zookeeper 的手動主備切換。
  • Zookeeper 集群:為主備切換控制器提供主備選舉支持。
  • 共享存儲系統:共享存儲系統是實現 NameNode 的高可用最為關鍵的部分,共享存儲系統保存了 NameNode 在運行過程中所產生的 HDFS 的元數據。
  • 主 NameNode 和 NameNode 通過共享存儲系統實現元數據同步。在進行主備切換的時候,新的主 NameNode 在確認元數據完全同步之后才能繼續對外提供服務。
  • DataNode 節點:除了通過共享存儲系統共享 HDFS 的元數據信息之外,主 NameNode 和備 NameNode 還需要共享 HDFS 的數據塊和 DataNode 之間的映射關系。
  • DataNode 會同時向主 NameNode 和備 NameNode 上報數據塊的位置信息。
  • Quorum Journal Manager (QJM):Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再從 JournalNode 集群定時同步 EditLog,當 Active NameNode 宕機后, Standby NameNode 在確認元數據完全同步之后就可以對外提供服務。向 JournalNode 集群寫入 EditLog 是遵循 “過半寫入則成功” 的策略,所以至少要有3個 JournalNode 節點。

  3、YARN結構

  

 

 

   4、高可用YARN

  

 

 

二、搭建說明

  1、搭建高可用的hadoop集群,本次搭建使用三台騰訊雲服務器。其中,一台作為NameNode管理DataNode的分布信息和運行狀態;兩台作為普通的DataNode節點。

  2、本次使用CentOS系統,搭建節點為hadoop1、hadoop2和hadoop3.

  3、節點結構:

 節點

Name

Node 

Secondary

Node

 Data

Node

Journal

Node 

 Resource

Manager

Secondary

Resource

Node

Manager

DFS

ZKFC

Zookeeper/JDK
hadoop1  √    √    
hadoop2    √ √   
hadoop3      √    

 

 

 

 

 

 

三、搭建准備

  1、更改用戶名或新建用戶,名為hadoop(確保每台機器上的用戶名相同,使ssh免密驗證更容易)。

adduser hadoop
passwd hadoop

//賦予root權限
//修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
## Allow root to run any commands anywhere
root    ALL=(ALL)     ALL
tommy   ALL=(ALL)     ALL

  

  2、修改主機名和ip-hostname映射關系(修改 /etc/hostname 和 /etc/hosts 兩個文件)。

    a.分別在三台機器的/etc/hostname文件修改主機名,分別取名為hadoop1,hadoop2,hadoop3。(centos可以用sudo hostnamectl set-hostname hadoop1)

    b.在每台機器的 /etc/hosts 文件中中添加Ip和主機名的映射關系。設置本機映射為內網ip,其他服務器的ip映射為公網ip(注意,每台機器都需要添加所有的映射)

  3、ssh免登陸配置:在每台服務器的/home/hadoop/.ssh/ 目錄中,執行如下命令生成一對密鑰,並將本地主機的公鑰添加到遠程主機的authorized_keys文件上。三台機器兩兩雙向進行配置,注意包括自己對自已。(例子緊配置了自己)

  ssh-keygen -t rsa
  ssh-copy-id -i ~/.ssh/id_rsa.pub master

  4、安裝java

------------------java安裝傳送門-----------------

  5、zookeeper集群環境搭建

  -------------------zookeeper搭建傳送門-----------------

  踩坑:版本在3.5以后需要下載bin版本;zoo配置文件中的server.x=hostname:host:host,若是本機,hostname在hosts文件中對應的是內網地址。

  5、Hadoop安裝:每台服務器Hadoop的安裝目錄必須一致,安裝包的配置信息也必須一致。新建/usr/hadoop/后執行以下命令,或官網下載通過XFTP導入安裝包(我下載的2.6.0版本)。    

sudo wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz
sudo tar -zxvf hadoop-2.8.5.tar.gz 

  6、添加環境變量:在每台服務器的 /etc/profile 文件最后添加hadoop,java的路徑。

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
export HADOOP_HOME=/usr/local/hadoop-2.8.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin 

source /etc/profile //執行后配置生效

7、測試安裝是否生效

java -version
hadoop version

  

三、配置文件的修改(配置文件位於/usr/hadoop/hadoop-2.6.0/conf)

  1、hadoop-env.sh:將25行左右的那一行替換成如下語句

export JAVA_HOME=/usr/java/jdk1.8.0_251

  2、core-site.xml

<configuration>
  <property>
    <!-- 指定namenode的hdfs協議文件系統的通信地址 -->
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop1:8020</value>
  </property>
  <property>
    <!-- 指定hadoop集群存儲臨時文件的目錄 -->
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/tmp</value>
  </property>
  <property>
    <!-- ZooKeeper集群的地址 -->
    <name>ha.zookeeper.quorum</name>
    <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
  </property>
  <property>
    <!-- ZKFC連接到ZooKeeper超時時長 -->
    <name>ha.zookeeper.session-timeout.ms</name>
    <value>10000</value>
  </property>

</configuration>

  3、hdfs-site.xml  

<configuration>
  <property>
    <!-- 指定HDFS副本的數量 -->
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <!-- namenode節點數據(即元數據)的存放位置,可以指定多個目錄實現容錯,多個目錄用逗號分隔 -->
    <name>dfs.namenode.name.dir</name>
    <value>file:/home/hadoop/namenode/data</value>
  </property>
  <property>
    <!-- datanode節點數據(即數據塊)的存放位置 -->
    <name>dfs.datanode.data.dir</name>
    <value>file:/home/hadoop/datanode/data</value>
  </property>
  <property>
    <!-- 集群服務的邏輯名稱 -->
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>
  <property>
    <!-- NameNode ID列表-->
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
  </property>
  <property>
    <!-- nn1的RPC通信地址 -->
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>hadoop1:8020</value>
  </property>
  <property>
    <!-- nn2的RPC通信地址 -->
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>hadoop2:8020</value>
  </property>
  <property>
    <!-- nn1的http通信地址 -->
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>hadoop1:50070</value>
  </property>
  <property>
    <!-- nn2的http通信地址 -->
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>hadoop2:50070</value>
  </property>
  <property>
    <!-- NameNode元數據在JournalNode上的共享存儲目錄 -->
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster</value>
  </property>
  <property>
    <!-- Journal Edit Files的存儲目錄 -->
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hadoop/journalnode/data</value>
  </property>
  <property>
    <!-- 配置隔離機制,確保在任何給定時間只有一個NameNode處於活動狀態 -->
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  <property>
    <!-- 使用sshfence機制時需要ssh免密登錄 -->
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
  </property>
  <property>
    <!-- SSH超時時間 -->
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
  </property>
  <property>
    <!-- 訪問代理類,用於確定當前處於Active狀態的NameNode -->
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <property>
    <!-- 開啟故障自動轉移 -->
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
</configuration>

  4、mapred-site.xml:修改mapred-site.xml(復制mapred-site.xml.template,再修改文件名)

<configuration>
  <property>
    <!--指定mapreduce作業運行在yarn上-->
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

  5、yarn-site.xml

<configuration>

  <!-- Site specific YARN configuration properties -->
  <property>
    <!--配置NodeManager上運行的附屬服務。需要配置成mapreduce_shuffle后才可以在Yarn上運行MapReduce程序。-->
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <!-- 是否啟用日志聚合(可選) -->
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
  <property>
    <!-- 聚合日志的保存時間(可選) -->
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>86400</value>
  </property>
  <property>
    <!-- 啟用RM HA -->
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <property>
    <!-- RM集群標識 -->
    <name>yarn.resourcemanager.cluster-id</name>
    <value>my-yarn-cluster</value>
  </property>
  <property>
    <!-- RM的邏輯ID列表 -->
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>
  <property>
    <!-- RM1的服務地址 -->
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>hadoop2</value>
  </property>
  <property>
    <!-- RM2的服務地址 -->
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>hadoop3</value>
  </property>
  <property>
    <!-- RM1 Web應用程序的地址 -->
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>hadoop2:8088</value>
  </property>
  <property>
    <!-- RM2 Web應用程序的地址 -->
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>hadoop3:8088</value>
  </property>
  <property>
    <!-- ZooKeeper集群的地址 -->
    <name>yarn.resourcemanager.zk-address</name>
    <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
  </property>
  <property>
    <!-- 啟用自動恢復 -->
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property>
  <property>
    <!-- 用於進行持久化存儲的類 -->
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  </property>

</configuration>

  6、slaves:在每台服務器的slaves文件中配置集群Datanode的主機名,只有這個文件里面的主機名才能被Namenode識別。

hadoop1
hadoop2
hadoop3

  7、可以通過分發形式部署到三個服務器中(也可分別單獨配置)

# 將安裝包分發到hadoop2
scp -r /usr/hadoop/hadoop-2.6.0/ hadoop2:/usr/hadoop/
# 將安裝包分發到hadoop3
scp -r /usr/hadoop/hadoop-2.6.0/ hadoop3:/usr/hadoop/

四、啟動Hadoop集群

  1、啟動zookeeper

zkServer.sh start

  2、分別到三台服務器的的hadoo-2.6.0p/sbin目錄下,啟動journalnode進程: 

hadoop-daemon.sh start journalnode

  3、在hadop001上執行NameNode初始化命令:

hdfs namenode -format

  執行初始化命令后,需要將NameNode元數據目錄的內容,復制到其他未格式化的NameNode上。元數據存儲目錄就是我們在hdfs-site.xml中使用dfs.namenode.name.dir屬性指定的目錄。這里我們需要將其復制到hadoop2上(可以通過scp命令)。

    4、在任意一台NameNode上使用以下命令來初始化ZooKeeper中的HA狀態:

hdfs zkfc -formatZK

    5、進啟動HDFS。此時hadoop001hadoop002上的NameNode服務,和三台服務器上的DataNode服務都會被啟動:

start-dfs.sh

    6、啟動YARN。此時hadoop2上的ResourceManager服務,和三台服務器上的NodeManager服務都會被啟動:

start-yarn.sh

      需要注意的是,這個時候hadoop003上的ResourceManager服務通常是沒有啟動的,需要手動啟動:

yarn-daemon.sh start resourcemanager

五、測試

  1、成功啟動后,每台服務器上的進程應該如下:

      

  2、可通過ip地址+50070和8088端口號HDFS和YARN的狀態

 

 

  3、運行一下hadoop提供的demo中的WordCount程序:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount input out

    

 


免責聲明!

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



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