初識大數據(三)-----基於zookeeper的Hadoop集羣的安裝與配置

基於zookeeper的Hadoop集羣

集羣規劃

hadoop1(master) hadoop2 hadoop3
NameNode
DataNode
ResourceManager
zookeeper

準備工作

1、確保服務器安裝了JDK

Hadoop需要java環境支持

輸入該命令

 java -version

確認是否有jdk,如沒有請先安裝jdk

2、關閉防火牆

#centos7啓動firewall
systemctl start firewalld.service

#centos7重啓firewall
systemctl restart firewalld.service

#centos7停止firewall
systemctl stop firewalld.service 

#centos7禁止firewall開機啓動
systemctl disable firewalld.service 

#centos7查看防火牆狀態
firewall-cmd --state

3、關閉selinux

Hadoop主節點管理子節點是通過SSH實現的, SELinux不關閉的情況下無法實現,會限制ssh免密碼登錄

vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected. 
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

將 SELINUX=enforcing 改爲 SELINUX=disabled

保存, 執行以下命令使selinux 修改立即生效

setenforce 0

4、修改主機名與IP映射

vi /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=hadoop1

hostname填寫當前主機的名字

vi /etc/hosts

192.168.37.251 hadoop1
192.168.37.252 hadoop2
192.168.37.253 hadoop3

在hosts中填寫各個主機IP和主機名

5、創建hadoop用戶

hadoop集羣的用戶名要一樣

用root權限創建hadoop用戶和hadoop用戶組

groupadd hadoop 
useradd -g hadoop hadoop 
#修改用戶密碼
passwd hadoop

6、SSH免密登錄

爲了Hadoop主節點方便管理多個的從節點,配置SSH免密登錄

切換到hadoop用戶操作,輸入該命令生成非對稱公鑰和私鑰,這個在集羣中所有節點機器都必須執行

ssh-keygen -t rsa

回車後不管提示什麼,不要輸入任何東西,一直按回車,按三次即可完成

cd /home/hadoop/.ssh/

首先將Master節點的公鑰添加到authorized_keys

cat id_rsa.pub>>authorized_keys 

其次將從節點的公鑰添加到authorized_keys,這裏我是在Hadoop1機器上操作的

ssh [email protected] cat /home/hadoop/.ssh/id_rsa.pub>> authorized_keys
ssh [email protected] cat /home/hadoop/.ssh/id_rsa.pub>> authorized_keys

設置修改/home/hadoop/.ssh/authorized_keys權限

chmod 700 /home/hadoop/.ssh
chmod 600 /home/hadoop/.ssh/authorized_keys

將Master節點的authorized_keys分發到其他slaves節點

scp -r /home/hadoop/.ssh/authorized_keys [email protected]:/home/hadoop/.ssh/ 
scp -r /home/hadoop/.ssh/authorized_keys [email protected]:/home/hadoop/.ssh/ 

用該命令驗證下ssh免密登錄是否成功

ssh hadoop@hadoop2

安裝zookeeper

1、下載zookeeper

官網下載地址:http://mirror.bit.edu.cn/apache/zookeeper/

2、解壓

tar -zxvf zookeeper-3.3.6.tar.gz

3、修改配置文件 zoo.cfg

將zookeeper壓縮文件解壓後,我們進入到 conf 目錄

將 zoo_sample.cfg 文件複製並重命名爲 zoo.cfg 文件

cp zoo_sample.cfg zoo.cfg

然後通過 vim zoo.cfg 命令對該文件進行修改

在這裏插入圖片描述

我們需要修改的第一個是 dataDir ,在指定的位置處創建好目錄,這是zookeeper數據存放位置

第二個紅框按如上格式填寫,只需要修改對應的IP,IP可以改爲對應的主機名

4、創建myid文件

在 上一步 dataDir 指定的目錄下,創建 myid 文件

在這裏插入圖片描述

然後在該文件添加上一步 server. 的對應數字

比如我們上面的配置:

server.0=192.168.146.200:2888:3888
server.1=192.168.146.201:2888:3888
server.2=192.168.146.202:2888:3888

那麼就必須在 192.168.146.200 機器的的 /usr/local/software/zookeeper-3.3.6/data 目錄下創建 myid 文件,然後在該文件中寫上 0 即可

在這裏插入圖片描述

後面的機器依次在相應目錄創建myid文件,寫上相應配置數字

5、配置環境變量

vi /etc/profile ,添加相應的配置信息:

#set zookeeper environment
export ZK_HOME=/usr/local/software/zookeeper-3.3.6
export PATH=$PATH:$ZK_HOME/bin

然後通過如下命令使得環境變量生效:

source /etc/profle

6、啓動zookeeper

啓動命令:

zkServer.sh start

停止命令:

zkServer.sh stop

重啓命令:

zkServer.sh restart

查看集羣節點狀態:

zkServer.sh status

我們分別對集羣三臺機器執行啓動命令。執行完畢後,分別查看集羣節點狀態:

出現如下即是集羣搭建成功:

在這裏插入圖片描述

安裝hadoop

1、下載hadoop

從官網或是鏡像站下載

http://hadoop.apache.org/

http://mirrors.hust.edu.cn/apache/

2、解壓縮

下載hadoop-2.7.5.tar.gz放置於/home/hadoop下並解壓,這裏我在hadoop1操作

tar –zxvf hadoop-2.7.5.tar.gz

3、修改配置文件

配置文件目錄:/home/hadoop/hadoop-2.7.5/etc/hadoop

修改 hadoop-env.sh文件,填寫jdk路徑

vi hadoop-env.sh

在這裏插入圖片描述

修改core-site.xml

vi core-site.xml
<configuration>
    <!-- 指定hdfs的nameservice爲myha01 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://myha01/</value>
    </property>

    <!-- 指定hadoop臨時目錄 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/data/hadoopdata/</value>
    </property>

    <!-- 指定zookeeper地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
    </property>

    <!-- hadoop鏈接zookeeper的超時時長設置 -->
    <property>
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>1000</value>
        <description>ms</description>
    </property>
</configuration>

zookeeper地址填寫 主機名:端口號,zookeeper的端口默認是2181

修改hdfs-site.xml

vi hdfs-site.xml 
<configuration>

    <!-- 指定副本數 -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>

    <!-- 配置namenode和datanode的工作目錄-數據存儲目錄 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop/data/hadoopdata/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/data/hadoopdata/dfs/data</value>
    </property>

    <!-- 啓用webhdfs -->
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>

    <!--指定hdfs的nameservice爲myha01,需要和core-site.xml中的保持一致 
                 dfs.ha.namenodes.[nameservice id]爲在nameservice中的每一個NameNode設置唯一標示符。 
        配置一個逗號分隔的NameNode ID列表。這將是被DataNode識別爲所有的NameNode。 
        例如,如果使用"myha01"作爲nameservice ID,並且使用"nn1"和"nn2"作爲NameNodes標示符 
    -->
    <property>
        <name>dfs.nameservices</name>
        <value>myha01</value>
    </property>

    <!-- myha01下面有兩個NameNode,分別是nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.myha01</name>
        <value>nn1,nn2</value>
    </property>

    <!-- nn1的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.myha01.nn1</name>
        <value>hadoop1:9000</value>
    </property>

    <!-- nn1的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.myha01.nn1</name>
        <value>hadoop1:50070</value>
    </property>

    <!-- nn2的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.myha01.nn2</name>
        <value>hadoop2:9000</value>
    </property>

    <!-- nn2的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.myha01.nn2</name>
        <value>hadoop2:50070</value>
    </property>

    <!-- 指定NameNode的edits元數據的共享存儲位置。也就是JournalNode列表 
                 該url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId 
        journalId推薦使用nameservice,默認端口號是:8485 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/myha01</value>
    </property>

    <!-- 指定JournalNode在本地磁盤存放數據的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop/data/journaldata</value>
    </property>

    <!-- 開啓NameNode失敗自動切換 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>

    <!-- 配置失敗自動切換實現方式 -->
    <property>
        <name>dfs.client.failover.proxy.provider.myha01</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行 -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </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>ha.failover-controller.cli-check.rpc-timeout.ms</name>
        <value>60000</value>
    </property>
</configuration>

修改mapred-site.xml

vi mapred-site.xml
<configuration>
    <!-- 指定mr框架爲yarn方式 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    
    <!-- 指定mapreduce jobhistory地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop1:10020</value>
    </property>
    
    <!-- 任務歷史服務器的web地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop1:19888</value>
    </property>
</configuration>

修改yarn-site.xml

vi 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>hadoop1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop2</value>
    </property>

    <!-- 指定zk集羣地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
    </property>

    <property>
        <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>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>

    <!-- 制定resourcemanager的狀態信息存儲在zookeeper集羣上 -->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
</configuration>

修改slaves

vi slaves
hadoop1
hadoop2
hadoop3

4、將hadoop安裝包分發到其他集羣節點

每臺服務器中的hadoop安裝包的目錄必須一致, 配置還必須保持一致

scp -r /home/hadoop/hadoop-2.7.5 hadoop@hadoop2:/home/hadoop/
scp -r /home/hadoop/hadoop-2.7.5 hadoop@hadoop3:/home/hadoop/

5、配置Hadoop環境變量

如果使用hadoop用戶安裝,就修改用戶變量 vi /etc/profile

如果使用root用戶安裝,就修改系統變量 vi ~/.bashrc

export HADOOP_HOME=/home/hadoop/apps/hadoop-2.7.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:

root用戶使環境變量生效

source /etc/profile

hadoop用戶使環境變量生效

source ~/.bashrc

6、查看hadoop版本

hadoop version

在這裏插入圖片描述

hadoop集羣的初始化

1、確保你的zookeeper集羣已經正常啓動

查看zookeeper狀態

zkServer.sh status

2、在你配置的各個journalnode節點啓動該進程

按照之前的規劃,我的是在hadoop1、hadoop2、hadoop3上進行啓動,啓動命令如下

在sbin目錄下執行該命令

hadoop-daemon.sh start journalnode

3、格式化namenode

選取一個namenode(hadoop1)節點進行格式化

hadoop namenode -format

在這裏插入圖片描述

4、格式化zkfc

注意只能在nameonde節點進行

hdfs zkfc -formatZK

在這裏插入圖片描述

初次啓動hadoop集羣

1、啓動namenode

#啓動namenode
#hadoop1
/home/hadoop/hadoop-2.7.5/sbin/hadoop-daemon.sh start namenode 

#同步備用namenode、啓動備用namenode
#hadoop2
/home/hadoop/hadoop-2.7.5/bin/hdfs namenode -bootstrapStandby 
/home/hadoop/hadoop-2.7.5/sbin/hadoop-daemon.sh start namenode

2、啓動ZKFC

#hadoop1
/home/hadoop/hadoop-2.7.5/sbin/hadoop-daemon.sh start zkfc 

#hadoop2
/home/hadoop/hadoop-2.7.5/sbin/hadoop-daemon.sh start zkfc

3、啓動datanode

#這一步會啓動所有的datanode
#hadoop1
/home/hadoop/hadoop-2.7.5/sbin/hadoop-daemons.sh start datanode

4、啓動yarn

#在hadoop1上啓動resouremanager
#hadoop1
/home/hadoop/hadoop-2.7.5/sbin/start-yarn.sh 
#在hadoop2上啓動備用resouremanager
ssh hadoop2
/home/hadoop/hadoop-2.7.5/sbin/yarn-daemon.sh start resourcemanager

至此,Hadoop 基於zookeeper的高可用集羣就安裝成功,並且啓動了

5、啓動任務歷史服務器

#hadoop1
/home/hadoop/hadoop-2.7.5/sbin/mr-jobhistory-daemon.sh start historyserver

6、查看狀態

HDFS

hadoop@hadoop1 ~]$ hdfs haadmin -getServiceState nn1
standby
[hadoop@hadoop1 ~]$ hdfs haadmin -getServiceState nn2
active

在這裏插入圖片描述

YARN

[hadoop@hadoop1 ~]$ yarn rmadmin -getServiceState rm1
standby
[hadoop@hadoop1 ~]$ yarn rmadmin -getServiceState rm2
active

在這裏插入圖片描述

6、WEB界面進行查看

HDFS

hadoop1

在這裏插入圖片描述

hadoop2

在這裏插入圖片描述

YARN

standby節點會自動跳到avtive節點

在這裏插入圖片描述

任務歷史服務器web界面

jobhistory

在這裏插入圖片描述

重啓hadoop集羣

停止集羣

/home/hadoop/hadoop-2.7.5/sbin/stop-all.sh
#停止所有hadoop進程
/home/hadoop/hadoop-2.7.5/sbin/start-all.sh
#啓動所有hadoop進程

單獨停止或啓動某個進程

sbin/hadoop-daemons.sh start namenode 單獨啓動NameNode守護進程

sbin/hadoop-daemons.sh stop namenode 單獨停止NameNode守護進程

sbin/hadoop-daemons.sh start datanode 單獨啓動DataNode守護進程

sbin/hadoop-daemons.sh stop datanode 單獨停止DataNode守護進程

sbin/yarn-daemon.sh start resourcemanager 單獨啓動ResourceManager

sbin/yarn-daemon.sh stop resourcemanager 單獨停止ResourceManager

sbin/yarn-daemons.sh start nodemanager  單獨啓動NodeManager

sbin/yarn-daemons.sh stopnodemanager  單獨停止NodeManager

sbin/mr-jobhistory-daemon.sh start historyserver 手動啓動jobhistory

sbin/mr-jobhistory-daemon.sh stop historyserver 手動停止jobhistory

我遇到過的問題

整理以下我遇到的問題及解決辦法以供參考

1、hadoop集羣無法啓動

請先查看報錯和日誌信息,日誌在/home/hadoop/hadoop-2.7.5/logs/下

我遇到的問題是hadoop 9000端口拒絕訪問。

請先查看9000端口監聽情況。

netstat -nlp |grep 9000

監聽的的如果不是本機ip:9000而是127.0.0.1:9000

解決:修改/etc/hosts 文件

vi /etc/hosts

若發現127.0.0.1 與機器名存在映射關係,需要刪除映射關係(如下圖紅色框所示),否則hadoop 會把機器名映射到127.0.0.1 上去。

在這裏插入圖片描述

2、hadoop集羣重啓後不正常

我的hadoop集羣爲3個節點,hadoop集羣重啓後,在資源管理的web界面出現了4個甚至7個Active Nodes,以及Unhealthy Nodes。

然後我再次使用stop-all.sh命令停止集羣,結果發現hadoop2的yarn web界面依然可以訪問。

可能停止集羣后,有些進程依然存在。

解決:先嚐試stop-all.sh命令停止集羣。

使用jps命令查看是否還有hadoop的相關進程。(jps命令用於查看java進程,必須安裝jdk才能使用)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ACF1cdca-1588842771684)(新建文件夾/15.png)]

如還有hadoop相關進程存在,使用命令單獨停止該進程。

然後我按照上文初次啓動hadoop集羣的方法,再次啓動集羣,集羣成功的正常啓動了。

3、datanode沒有正常啓動

hadoop集羣啓動後,使用jps命令查看,發現沒有datanode。

可能的原因:namenode和datanode的數據不匹配。

hdfs-site.xml

<!-- namenode和datanode的工作目錄-數據存儲目錄 -->
	<property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop/data/hadoopdata/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/data/hadoopdata/dfs/data</value>
    </property>

格式化namenode後,會在我們配置的/dfs/name/下生成數據,而它和/dfs/data/下的數據不匹配,導致datanode沒有正常啓動

界面出現了4個甚至7個Active Nodes,以及Unhealthy Nodes。

然後我再次使用stop-all.sh命令停止集羣,結果發現hadoop2的yarn web界面依然可以訪問。

可能停止集羣后,有些進程依然存在。

解決:先嚐試stop-all.sh命令停止集羣。

使用jps命令查看是否還有hadoop的相關進程。(jps命令用於查看java進程,必須安裝jdk才能使用)

在這裏插入圖片描述

如還有hadoop相關進程存在,使用命令單獨停止該進程。

然後我按照上文初次啓動hadoop集羣的方法,再次啓動集羣,集羣成功的正常啓動了。

3、datanode沒有正常啓動

hadoop集羣啓動後,使用jps命令查看,發現沒有datanode。

可能的原因:namenode和datanode的數據不匹配。

hdfs-site.xml

<!-- namenode和datanode的工作目錄-數據存儲目錄 -->
	<property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop/data/hadoopdata/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/data/hadoopdata/dfs/data</value>
    </property>

格式化namenode後,會在我們配置的/dfs/name/下生成數據,而它和/dfs/data/下的數據不匹配,導致datanode沒有正常啓動

解決:刪除/dfs/data/下的所有文件,再次啓動datanode

安裝過程中如遇到什麼問題,請掃關注公衆號:架構師Plus
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章