宿主機配置:
宿主機:小黑 T450
CPU :I5
內存 :16G
系統 :Windows 10 家庭版 64位
虛擬機:
Oracle VM VirtualBox:
VirtualBox-5.1.30.18389-Win.exe
系統準備:
CentOS-7-x86_64-Minimal-1708.iso
CentOS-7-x86_64-DVD-1708.isonode
Linux系統安裝:linux
CentOS-7-x86_64-Minimal-1708.iso #最簡化安裝,爲了節省系統資源shell
下載DVD版本,目的是從當yum的軟件源,對於須要的如:vim ssh net-tools 軟件,須要掛在本地源,安裝apache
CentOS-7-x86_64-DVD-1708.isovim
一 :安裝hadoop前系統環境配置:安全
1>掛載yum軟件源:服務器
第一步:光驅加載ISO文件:CentOS-7-x86_64-DVD-1708.iso網絡
操做以下
app
第二步:CentOS系統掛載框架
linux外部存儲通常都掛載在/mnt目錄下,這裏我先建一個容納此光驅的文件夾 cdrom:
-->cd /mnt -->mkdir cdrome
而後把此光驅掛載到此文件夾下:
-->mount /dev/cdrom /mnt/cdrom #/dev/cdrom是光驅的默認路徑
第三步:配置yum軟件包源(使用上一步咱們掛載的本地源)
/etc/yum.repos.d/目錄下
刪除
CentOS-Base.repo
CentOS-Debuginfo.repo
-->cd /etc/yum.repos.d -->rm -f CentOS-Base.repo -->rm -f CentOS-Debuginfo.repo
編輯CentOS-Media.repo,把源路徑指定爲掛載源路徑,並開啓使用
-->vi CentOS-Media.repo -->baseurl:file:///mnt/cdrom/ #指定本地資源掛載路徑 enabled=1 #開啓
2>安裝如下軟件
vim #功能強大的本文編輯器
net-tools #查看網絡狀態軟件,例如查看ifconfig命令等
ssh #遠程安全登陸或文件上傳下載
提示:若是不知道哪一個命令是哪一個軟件包提供的,能夠這樣查看:
-->yum provides ifconfig(具體命令) 或者 -->yum whatprovides ifconfig(具體命令)
------------------------------------------------------------
-->yum -y install vim -->yum -y install net-tools -->yum -y install openssh* #表示安裝源裏openssh開頭的軟件所有安裝
3>修改Linux系統主機名稱:
-->vim /etc/hostname -->hadoop-ha-01
4>配置Linux系統主機上網
(1)網卡設置爲橋連
(2)設置網卡參數
-->cd /etc/sysconfig/network-scripts/ -->ls #查找ifcfg-eth* -->vim ifcfg-eth3 #打開文件編輯 -->onboot=yes #啓用該網卡
(3)修改網關
-->vim /etc/sysconfig/network NETWORKING=yes HOSTNAME=hadoop-ha-01 #配置永久主機名 GATEWAY=192.168.1.21 #這裏設置網關,也就是那個虛擬網卡的ip
(4)修改DNS
-->vim /etc/resolv.conf nameserver 192.168.1.1 #增長一個域名服務器
(5)配置防火牆 #這裏先直接關閉
-->systemctl stop firewalld.service #中止firewall -->systemctl disable firewalld.service #禁止firewall開機啓動
(6)網絡配置好後,重啓網絡
-->service network restart 而後重啓Linux系統 -->reboot
--------------------------------------------------------------------------------
二:以上準備好後,咱們開始這手搭建集羣
hadoop-ha集羣規劃圖
主機名稱 | IP | 軟件 | 運行進程 |
hadoop-ha-01 | 192.168.1.21 | JDK、HADOOP | NameNode、DFSZKFailoverController(zkfc) |
hadoop-ha-02 | 192.168.1.22 | JDK、HADOOP | NameNode、DFSZKFailoverController(zkfc) |
hadoop-ha-03 | 192.168.1.23 | JDK、HADOOP | ResourceManager |
hadoop-ha-04 | 192.168.1.24 | JDK、HADOOP | ResourceManager |
hadoop-ha-05 | 192.168.1.25 | JDK、HADOOP、Zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
hadoop-ha-06 | 192.168.1.26 | JDK、HADOOP、Zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
hadoop-ha-07 | 192.168.1.27 | JDK、HADOOP、Zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
說明:
hdfs 文件高可用配置 主從NameNode 主機 hadoop-ha-0一、hadoop-ha-02
yarn管理系統高可用配置 主從ResourceManager 主機 hadoop-ha-0三、hadoop-ha-04
由於yarn管理系統NodeManager節點管理器自己就是管理 MR程序在hdfs文件系統的DataNode上執行的,因此把他們配置到一塊兒配置在剩下三臺機器上
根據集羣設計圖,須要7臺系統,因此根據hadoop-ha-01鏡像,在虛擬機下搭建7個系統
注意:每一個系統搭建好後須要修改下主機名稱和IP如設計圖
1>我這裏用hadoop-ha-01來管理集羣,因此這裏我配置01能夠免密訪問集羣中全部機器
(1)配置ssh免密登錄
-->ssh-keygen #生成密鑰 -->ls /root/.ssh #查看生成密鑰文件 結果: id_rsa #私鑰 id_rsa.pub #公鑰 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.21 #把公鑰拷貝到遠端服務器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.22 #把公鑰拷貝到遠端服務器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.23 #把公鑰拷貝到遠端服務器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.24 #把公鑰拷貝到遠端服務器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.25 #把公鑰拷貝到遠端服務器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.26 #把公鑰拷貝到遠端服務器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.27 #把公鑰拷貝到遠端服務器
2>以上所有用ip訪問特別難記也難寫,這裏我在hosts文件裏配置下,ip與主機名的關聯關係
--vim /etc/hosts 192.168.1.21 hadoop-ha-01 192.168.1.22 hadoop-ha-02 192.168.1.23 hadoop-ha-03 192.168.1.24 hadoop-ha-04 192.168.1.25 hadoop-ha-05 192.168.1.26 hadoop-ha-06 192.168.1.27 hadoop-ha-07 而後發送到集羣每一個機器上 scp /etc/hosts root@192.168.1.22:/etc/host scp /etc/hosts root@192.168.1.23:/etc/host scp /etc/hosts root@192.168.1.24:/etc/host scp /etc/hosts root@192.168.1.25:/etc/host scp /etc/hosts root@192.168.1.26:/etc/host scp /etc/hosts root@192.168.1.27:/etc/host
2>安裝集羣用到軟件包
jdk-8u162-linux-x64.tar.gz
hadoop-2.6.5.tar.gz
zookeeper-3.3.6.tar.gz
以上包我都在宿主機下載好了,怎麼發送到虛擬機上呢?我使用了FileZilla工具來作這件事
我準備把軟件所有安裝到/usr/app目錄下,因此集羣裏全部機器所有新建app目錄(這個能夠提早搞)
-->mkdir /usr/app
3>解壓jdk 而且發送的集羣全部機器上
-->tar -zxvf jdk-8u162-linux-x64.tar.gz
4>在hadoop-ha-05上解壓 zookeeper-3.3.6.tar.gz
-->tar -zxvf zookeeper-3.3.6.tar.gz
配置zookeeper:
-->cd /root/app/zookeeper-3.3.6/conf/ -->cp zoo_sample.cfg zoo.cfg -->vim zoo.cfg dataDir=/root/app/zookeeper-3.3.6/tmp #在最後添加: server.1=hadoop-ha-05:2888:3888 server.2=hadoop-ha-06:2888:3888 server.3=hadoop-ha-07:2888:3888 #保存退出
而後建立一個tmp文件夾
-->mkdir /root/app/zookeeper-3.3.6/tmp
#根據zzo.cfg配置文件server.* 在集羣上建myid文件
-->echo 1 > /root/app/zookeeper-3.3.6/tmp/myid #這個文件名必須事myid
將配置好的zookeeper拷貝到其餘節點
-->scp -r /root/app/zookeeper-3.3.6/ hadoop-ha-06:/root/app/ -->scp -r /root/app/zookeeper-3.3.6/ hadoop-ha-07:/root/app/ 注意:修改hdp-ha-0六、hdp-ha-07對應/hadoop-ha-/zookeeper-3.3.6/tmp/myid內容 hdp-ha-06: echo 2 > /root/app/zookeeper-3.3.6/tmp/myid hdp-ha-07: echo 3 > /root/app/zookeeper-3.3.6/tmp/myid
5>安裝hadoop #先在hadoop-ha-01上
解壓: -->tar -zxvf hadoop-2.6.5.tar.gz
#hadoop配置 hadoo-env.sh
export JAVA_HOME=/usr/app/jdk1.8.0_162
#hadoop配置 core-site.xml
<configuration> <!-- 指定hdfs的nameservice爲ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1/</value> </property> <!-- 指定hadoop臨時目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/app/hadoop-2.6.5/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>hadoop-ha-05:2181,hadoop-ha-06:2181,hadoop-ha-07:2181</value> </property> </configuration>
#hadoop配置 hdfs-site.xml
<configuration> <!--指定hdfs的nameservice爲ns1,須要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- ns1下面有兩個NameNode,分別是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>hadoop-ha-01:9000</value> </property> <!-- nn1的http通訊地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>hadoop-ha-01:50070</value> </property> <!-- nn2的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>hadoop-ha-02:9000</value> </property> <!-- nn2的http通訊地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>hadoop-ha-02:50070</value> </property> <!-- 指定NameNode的元數據在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop-ha-05:8485;hadoop-ha-06:8485;hadoop-ha-07:8485/ns1</value> </property> <!-- 指定JournalNode在本地磁盤存放數據的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/app/hadoop-2.6.5/journaldata</value> </property> <!-- 開啓NameNode失敗自動切換 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失敗自動切換實現方式 --> <property> <name>dfs.client.failover.proxy.provider.ns1</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>/root/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔離機制超時時間 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration>
#hadoop配置 mapred-site.xml
<configuration> <!-- 指定mr框架爲yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
#hadoop配置 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>hadoop-ha-03</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop-ha-04</value> </property> <!-- 指定zk集羣地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop-ha-05:2181,hadoop-ha-06:2181,hadoop-ha-07:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
#hadoop配置 slaves
修改slaves(slaves是指定子節點的位置,由於要在hadoop-ha-01上啓動HDFS、在hadoop-ha-03啓動yarn,因此hadoop-ha-01上的slaves文件指定的是datanode的位置,hadoop-ha-03上的slaves文件指定的是nodemanager的位置)
hadoop-ha-05 hadoop-ha-06 hadoop-ha-07
最後把hadoop安裝目錄拷貝到集羣每一個機器上
slaves理論上事須要修改的!及
hadoop-ha-01上啓動hdfs,因此須要知道datanode的位置,因此把啓動datanode的節點放入hadoop-ha-01機器的slaves文件裏
hadoop-ha-03上啓動yarn,因此須要知道nodemanager的位置,因此把啓動nodemanager的節點讓如hadoop-ha-03機器的slaves文件裏
-----------------------------------------------------------------
三:配置環境變量:
-->vim /etc/profile #jdk的集羣全部機器都須要配 export JAVA_HOME=/usr/app/jdk1.8.0_162 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH #hadoop的集羣全部機器都須要配 export HADOOP_HOME=/usr/app/hadoop-2.6.5 export PATH=$JAVA_HOME/bin:$JRE_HOME/bin$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH #在jdk基礎上改 #zookeeper只在05/06/07上配置 export ZOOKEEPER_HOME=/usr/app/zookeeper-3.3.6 export PATH=$JAVA_HOME/bin:$JRE_HOME/bin$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$PATH #在jdk基礎上改
四:搭建完成後,開始啓動 #須要注意啓動順序
#啓動zookeeper集羣(分別在hadoop-ha-0五、hadoop-ha-0六、hadoop-ha-上啓動zk) zkServer.sh start #查看狀態:一個leader,兩個follower zkServer.sh status #啓動journalnode(分別在在hadoop-ha-0五、hadoop-ha-0六、hadoop-ha-07上執行) hadoop-daemon.sh start journalnode #運行jps命令檢驗,hdp-ha-0五、hdp-ha-0六、hdp-ha-07上多了JournalNode進程 #格式化HDFS #在hadoop-ha-01上執行命令: hdfs namenode -format #格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這裏我配置的是/usr/app/hadoop-2.6.5/tmp,而後將/usr/app/hadoop-2.6.5/tmp拷貝到hadoop-ha-02的/usr/app/hadoop-2.6.5/下。 scp -r tmp/ hadoop-ha-02:/root/app/hadoop-2.6.5/ #格式化ZKFC(在hdp-ha-01上執行便可) hdfs zkfc -formatZK #啓動HDFS(在hdp-ha-01上執行) start-dfs.sh #啓動YARN #(是在hdp-ha-03上執行start-yarn.sh,把namenode和resourcemanager分開是由於性能問題,由於他們都要佔用大量資源,因此把他們分開了,他們分開了就要分別在不一樣的機器上啓動) start-yarn.sh