Hadoop3 HA高可用集羣搭建

1. linux ssh免密登陸配置

hadoop節點之間的通訊是通過ssh進行的,SSH默認都是需要密碼的,開啓免密鑰登錄會減少很多麻煩。操作很簡單,兩步(三步)就可以完成。

  • 首先在本地生成公鑰和私鑰。分別在所有節點上執行:
ssh-keygen -t rsa

#後面都按回車跳過即可(三次)
# 運行結束後在 ~/.ssh/下生成兩個新文件: id_rsa.pub和id_rsa

設置本機ssh免密
#cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
  • 將公鑰拷貝到本機和遠程主機.
ssh-copy-id username@host 
or
ssh-copy-id node01
ssh-copy-id node02
……
# username是用戶名  host是主機的地址
#遠程主機將用戶的公鑰保存在 ~/.ssh/authorized_keys文件中
  • 如果發現. Agent admitted failure to sign using the key 這個錯誤,還要輸入密碼,是ssh本身的問題.

    可以使用命令:

ssh-add   ~/.ssh/id_rsa  把私鑰加進來即可

測試能否免密登陸:

[root@node01 /]# ssh node02
[root@node02 ~]# 

免密登陸設置成功。

2. java環境配置

vi /etc/profile

在profile文件末尾加入: 
export JAVA_HOME=/usr/share/jdk1.6.0_14 
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 

3. Hadoop完全分佈式(full)

  • 理論

並行:提升速度的關鍵
分佈式運行
計算與數據在一起——計算向數據移動

Hadoop簡介:

  • 分佈式存儲系統HDFS (Hadoop Distributed File System )
    分佈式存儲系統
    提供了 高可靠性、高擴展性和高吞吐率的數據存儲服務
  • 分佈式計算框架MapReduce
    分佈式計算框架(計算向數據移動)
    具有 易於編程、高容錯性和高擴展性等優點。
  • 分佈式資源管理框架YARN(Yet Another Resource Management)
    負責集羣資源的管理和調度

本文搭建了4虛擬機部署hadoop,可根據實際機器性能指定,搭建3臺也可以,只需修改下配置即可。

  • 修改4臺虛擬機的hosts文件
vi /etc/hosts
加入如下:
192.168.33.101 node01
192.168.33.102 node02
192.168.33.103 node03
192.168.33.104 node04

節點 配置
node01 namenode
node02 secondarynamenode、datanode
node03 datanode
node04 datanode
  • 進入node01主機,安裝配置hadoop:
將hadoop解壓到/opt/目錄下
tar -zxvf hadoop-3.1.1.tar.gz -C /opt/

然後進入/opt/目錄,刪掉doc文件夾
cd /opt/hadoop-3.1.1/
rm -rf share/doc

修改hadoop配置

cd $HADOOP_HOME/etc/hadoop
vi + hadoop-env.sh
在末尾加入:
export JAVA_HOME=/usr/share/jdk8
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
vi + core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://node01:9820</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/aaron/hadoop/full</value>
    </property>
</configuration>
vi + hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node02:9868</value>
    </property>
</configuration>
vi workers
刪掉localhost,加入:
node02
node03
node04
  • 再把修改配置後的hadoop分發到其他節點的相同目錄下
scp /opt/hadoop-3.1.1 node02:`pwd`
scp /opt/hadoop-3.1.1 node03:`pwd`
scp /opt/hadoop-3.1.1 node04:`pwd`
  • 啓動
先在主節點namenode裏進行格式化
~/sbin/hdfs namenode -format

格式化完成後再啓動hadoop hdfs
~/sbin/start-dfs.sh

查看啓動是否成功,分別在各個節點執行:
jps

4. Hadoop HDFS高可用集羣搭建(HA)

hostname NN-1 NN-2 DN ZK ZKFC JNN
node01 * * *
node02 * * * * *
node03 * * *
node04 * *

4.1 安裝配置zookeeper

進入主機node02,將zookeeper解壓到/opt/目錄下

tar -zxvf zookeeper-3.4.6.tar.gz -C /opt/
修改zookeeper配置文件
cd conf/
cp zoo_sample.cfg zoo.cfg
vi + zoo.cfg
修改:
dataDir=/var/aaron/zookeeper
並在末尾加入:
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
創建dataDir文件夾,並新建myid文件,在node02輸入1
mkdir /var/aaron/zookeeper
cd /var/aaron/zookeeper
echo 1 > myid

將zookeeper分發到node03、node04,分別修改其myid文件值爲2、3。
至此初步配置完成,啓動3臺zookeeper服務:

~/bin/zkServer.sh start
~/bin/zkServer.sh status
連接:
~/bin/zkCli.sh

4.2 安裝配置hadoop HA

export JAVA_HOME=/usr/share/jdk8
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
  • 修改 core-site.xml
<configuration>
    <!-- 指定hdfs的nameservice -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
    <!-- 指定hadoop臨時目錄 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/aaron/hadoop/full</value>
    </property>
    <!-- 指定zookeeper地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node02:2181,node03:2181,node04:2181</value>
    </property>
</configuration>
  • 修改 hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <!--指定hdfs的nameservice爲mycluster,需要和core-site.xml中的保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
<!-- mycluster下面有兩個NameNode,分別是nn1,nn2 -->
<property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
</property>

<!-- RPC通信地址 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>node01:9820</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>node02:9820</value>
</property>
<!-- http通信地址 -->
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>node01:9870</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>node02:9870</value>
</property>
<!-- 指定NameNode的edits元數據在JournalNode上的存放位置 -->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/var/aaron/hadoop/journaldata</value>
</property>
<!-- 開啓NameNode失敗自動切換 -->
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</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>
<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
</property>
</configuration>

  • hadoop分發到其他節點

4.3 Hadoop HDFS HA集羣的啓動步驟

注意:嚴格按照下面的啓動步驟

  1. 按照前面的啓動方式啓動zookeeper集羣(分別node02、node03、node04上啓動zk)
  2. 啓動journalnode(分別在node01、node02、node03上執行)
sbin/hdfs --daemon start journalnode

[root@node01 /]# jps
2444 JournalNode
2493 Jps
出現JournalNode則表示journalnode啓動成功。
  1. 格式化 HDFS
    在node01上執行命令:
hdfs namenode -format

倒數4行左右的地方,出現這一句就表示成功
common.Storage: Storage directory /home/hadoop/apps/dfs/name has been successfully formatted.

  1. 複製 hadoop.tmp.dir 配置下的文件到node02中
必須先啓動node01節點上的namenode,在node01上執行:
hdfs --daemon start namenode
jps查看namenode是否已啓動
[root@node01 hadoop]# jps
2710 Jps
2444 JournalNode
2668 NameNode

然後再node02上執行:
hdfs namenode -bootstrapStandby
  1. 格式化ZKFC(在node01上執行一次即可)
hdfs zkfc -formatZK

在倒數第3行提示如下內容表示成功
ha.ActiveStandbyElector: Successfully created /hadoop-ha/bi in ZK.

此時在zookeeper集羣中可以查看:

[root@node04 hadoop]# zkCli.sh

[zk: localhost:2181(CONNECTED) 4] get /hadoop-ha/mycluster

cZxid = 0x100000006
ctime = Thu Dec 20 22:29:00 CST 2018
mZxid = 0x100000006
mtime = Thu Dec 20 22:29:00 CST 2018
pZxid = 0x100000006
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0
  1. 啓動HDFS(在node01上執行)
start-dfs.sh
  1. 訪問192.168.33.101:9870、192.168.33.102:9870

5. Hadoop MapReduce、YARN 高可用集羣搭建

前面搭建好HDFS後,繼續在此基礎上完成MapReduce、YARN的配置。

hostname NN-1 NN-2 DN ZK ZKFC JNN RS NM
node01 * * *
node02 * * * * * *
node03 * * * * *
node04 * * * *

5.1 修改 mapred-site.xml

<configuration>
    <!-- 指定mr框架爲yarn方式 -->
    <property>              
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

5.2 修改yarn-site.xml

<configuration>
    <!-- 開啓RM高可用 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <!-- 指定RM的cluster id -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yrc</value>
    </property>

    <!-- 指定RM的名字 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <!-- 分別指定RM的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
    <value>node03</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
    <value>node04</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>node03:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>node04:8088</value>
    </property>
    <!-- 指定zk集羣地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>node02:2181,node03:2181,node04:2181</value>
    </property>

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

5.3 修改hadoop-env.sh

在末尾加入:

export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

將以上修改文件分發到其他節點相同目錄。

5.4 啓動yarn

http://192.168.33.104:8088

6 windows本地運行調試mapreduce

  • 解壓hadoop包到D:/hadoop3.1目錄下;
  • 環境變量配置
HADOOP_HOME=C:\hadoop3.1
HADOOP_USER_NAME=root
PATH裏添加%HADOOP_HOME%\bin

  • lib整合
    下載bin目錄,將bin下的文件覆蓋到hadoop部署目錄下,再將hadoop.dll 放到 C:/windows/system32下。hadoop-3.1.1對應的bin目錄下載

    • 1、 缺少winutils.exe:
      Could not locate executable null \bin\winutils.exe in the hadoop binaries
    • 2、 缺少hadoop.dll:
      Unable to load native-hadoop library for your platform… using builtin-Java classes where applicable
  • 創建Configuration時加入如下代碼即可再eclipse或idea裏運行了,而無需打成jar包上傳到linux再通過命令執行。

Configuration conf = new Configuration();
conf.set("mapreduce.app-submission.coress-paltform", "true");
conf.set("mapreduce.framework.name", "local");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章