集羣規劃:(安裝集羣之前,先規劃下集羣,考慮配置,ip,內存硬盤,cpu)
主機名 | IP | 安裝的軟件 | 運行的進程 |
hadoopSpark01 | 192.168.1.25 | jdk、hadoop | NameNode、DFSZKFailoverController(zkfc),ResourceManager,JournalNode、QuorumPeerMain、DataNode,NodeManager |
hadoopSpark02 | 192.168.1.26 | jdk、hadoop | NameNode、DFSZKFailoverController(zkfc),ResourceManagerJournalNode、QuorumPeerMain、DataNode,NodeManager |
hadoopSpark03 | 192.168.1.27 | jdk、hadoop | DataNode、JournalNode、QuorumPeerMain,NodeManager |
網絡配置:
vi /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" # 設置靜態
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens32"
UUID="ce16ccac-1889-44f7-b96a-c5c65a5a77d5"
DEVICE="ens32"
ONBOOT="yes"
IPADDR="192.168.1.25" # 靜態ip
GATEWAY="192.168.1.1" #GATEWAY
DNS1="114.114.114.114" #DNS
centos7的網卡重啓方法:systemctl restart network
SELINUX關閉
sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config
配置網絡鏡像源
下載鏡像源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
清楚緩存
yum clean all && yum update && yum makecache
修改hostname,重啓三臺機器,主機名稱將永久生效
# 1 使用hostnamectl命令
hostnamectl set-hostname xxx
//刪除hostname
hostnamectl set-hostname ""
hostnamectl set-hostname 主機名
hostnamectl set-hostname hadoopSpark01
hostnamectl set-hostname hadoopSpark02
hostnamectl set-hostname hadoopSpark03
同步網絡時鐘,集羣要保證時鐘的一致性,以免集羣出現問題
yum install ntpdate
ntpdate us.pool.ntp.org
hwclock -w
顯示時區:
date -R
#安裝ntpdate工具
yum install ntpdate -y
#使用ntpdate校時(後面的是ntp服務器)
ntpdate pool.ntp.org
hwclock -w
定時任務(高可用集羣時間同步很重要)
/5 * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1
每五分鐘同步一次時間
修改主機名和IP的映射關係
######注意######如果你們公司是租用的服務器或是使用的雲主機(如華爲用主機、阿里雲主機等)
/etc/hosts裏面要配置的是內網IP地址(一定內網,因爲數據在內網傳遞)和主機名的映射關係
vim /etc/hosts
192.168.1.25 hadoopSpark01
192.168.1.26 hadoopSpark02
192.168.1.27 hadoopSpark03
關閉防火牆
#查看防火牆狀態
停止firewall
systemctl stop firewalld.service
禁止firewall開機啓動
systemctl disable firewalld.service
配置三臺機器免密登錄 ,網上有很多種方式來配置,我選擇了其中最簡單的那種。命令依次爲
生成私鑰並配置禹本紀的免密登錄:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
拷貝私鑰 ssh-copy-id 用戶名@主機名
ssh-copy-id root@hadoopSpark01
查看免祕是否成功 ssh 主機名
ssh hadoopSpark01
ssh hadoopSpark02
ssh hadoopSpark03
#同步腳本
vi /usr/bin/xcall.sh
chmod +x /usr/bin/xcall.sh
xcall.sh ls -d /root/
========================同步腳本內容===========================
#!/bin/bash
#author :lizhenjiang
#email:[email protected]
#判斷用戶是否傳參
if [ $# -lt 1 ];then
echo "請輸入參數"
exit
fi
#獲取用戶輸入的命令
cmd=$@
for (( i=1;i<=3;i++ ))
do
tput setaf 6
echo ============= hadoopSpark0${i} : $cmd ============
tput setaf 9
#遠程執行命令
ssh hadoopSpark0${i} "source /etc/profile;$cmd"
#判斷命令是否執行成功
if [ $? == 0 ];then
echo "命令執行成功"
fi
done
vi /usr/bin/xrsync.sh
chmod +x /usr/bin/xrsync.sh
=======================================
#!/bin/bash
#author :lizhenjiang
#email:[email protected]
#判斷用戶是否傳參
if [ $# -lt 1 ];then
echo "請輸入參數";
exit
fi
#獲取文件路徑
file=$@
#獲取子路徑
filename=`basename $file`
#獲取父路徑
dirpath=`dirname $file`
#獲取完整路徑
cd $dirpath
fullpath=`pwd -P`
#同步文件到DataNode
for (( i=2;i<=3;i++ ))
do
tput setaf 6
echo =========== hadoopSpark0${i} : $file ===========
tput setaf 9
#遠程執行命令
rsync -lr $filename `whoami`@hadoopSpark0${i}:$fullpath
#判斷命令是否執行成功
if [ $? == 0 ];then
echo "命令執行成功"
fi
done
# 上傳需要的軟件到 /export/softwares/並創建
mkdir -p /export/softwares/
mkdir -p /export/servers/
安裝jdk
#!/bin/bash
tar -zxvf /export/softwares/jdk-8u141-linux-x64.tar.gz -C /export/servers/
cd /export/servers/jdk1.8.0_141
home=`pwd`
echo $home
echo "export JAVA_HOME=${home}" >> /etc/profile
echo "export PATH=:\$PATH:\$JAVA_HOME/bin" >> /etc/profile
for m in 2 3
do
scp -r /export/servers/jdk1.8.0_141 hadoopSpark0$m:/export/servers/
ssh hadoopSpark0$m "echo 'export JAVA_HOME=/export/servers/jdk1.8.0_141' >> /etc/profile; echo 'export PATH=:\$PATH:\$JAVA_HOME/bin' >> /etc/profile"
done
# 刷新配置
source /etc/profile
安裝配置zooekeeper集羣
1.1解壓
tar -zxvf zookeeper-3.4.14.tar.gz -C /export/servers/
1.2修改配置
cd /export/servers/zookeeper-3.4.14/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改:dataDir=/export/servers/zookeeper-3.4.14/data
在最後添加:
server.1=hadoopSpark01:2888:3888
server.2=hadoopSpark02:2888:3888
server.3=hadoopSpark03:2888:3888
保存退出
然後創建一個tmp文件夾 存儲zookeeper產生的數據的
mkdir /export/servers/zookeeper-3.4.14/data
再創建一個空文件
touch /export/servers/zookeeper-3.4.14/data/myid
最後向該文件寫入ID
將配置好的zookeeper拷貝到其他節點
xrsync.sh zookeeper-3.4.14/
注意:修改hadoopSpark02、hadoopSpark03對應/zookeeper-3.4.14/data/myid內容
echo 1 > /export/servers/zookeeper-3.4.14/data/myid
echo 2 > /export/servers/zookeeper-3.4.14/data/myid
echo 3 > /export/servers/zookeeper-3.4.14/data/myid
xrsync.sh /etc/profile
export ZOOKEEPER_HOME=/export/servers/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin
xcall.sh "source /etc/profile"
hadoop 配置
#將hadoop添加到環境變量中
vim /etc/profile
export HADOOP_HOME=/export/servers/hadoop-2.8.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
#hadoop的配置文件全部在$HADOOP_HOME/etc/hadoop下
cd /export/servers/hadoop-2.8.5/etc/hadoop
修改hadoop-env.sh
export JAVA_HOME=/export/servers/jdk1.8.0_141
修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice爲ns1 (hadoop2.0以後,它實現了對namenode進行抽像稱之爲nameservice,一個nameservice有兩個namenode,那這兩個namenode只能有一個處於active狀態,這個協調就是靠zookeeper,zookeeper能確保nameservice下有一個活躍的namenode,一旦namenode當掉了,zookeeper就會讓另一個namenode成爲activie)之所以抽像成一個nameservice就是因爲兩個是一對,一個失敗,啓動另外一個,訪問也方便只需要訪問ns1就可以,不用連接死namenode。NameNode高可靠原理看namenode高可靠原理圖.png-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/servers/hadoop-2.8.5/data</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoopSpark01:2181,hadoopSpark02:2181,hadoopSpark03:2181</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
</configuration>
修改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>hadoopSpark01:9000</value>
</property>
<!-- nn1的http通信地址,有個管理界面用於下載文件 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoopSpark01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoopSpark02:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoopSpark02:50070</value>
</property>
<!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoopSpark01:8485;hadoopSpark02:8485;hadoopSpark03:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/export/servers/hadoop-2.8.5/journal</value>
</property>
<!-- 開啓NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式,通過ConfiguredFailoverProxyProvider這個類實現自動切換 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行,隔離機制sshfence的意思是:當一個namenode壞了,但還沒有宕機,這樣的話還處於active狀態,爲讓另一個namenode正常成爲active,另外一個namenode會向壞掉的 namenode發一個命令把它殺掉。shell(/bin/true)的意思是:如果active節點,完全宕機,那zkfc就不能彙報信息了,這樣,standby很長時間收不到消息,當收不到消息時,standby就啓動一個腳本,如果這個腳本返回true,就會變成active-->
<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隔離機制超時時間(active壞了之後,standby如果沒有在30秒之內未連接上,那麼standby將變成active) -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
修改mapred-site.xml
<configuration>
<!-- 指定mr框架爲yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--map運行時堆內存(可選)-->
<property>
<name>yarn.odemanager.resource.memory-mb</name>
<value>-Xmx8192m</value>
</property>
<!--map運行時堆內存(可選)-->
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx400m</value>
</property>
</configuration>
修改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>hadoopSpark01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoopSpark02</value>
</property>
<!-- 指定zk集羣地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoopSpark01:2181,hadoopSpark02:2181,hadoopSpark03:2181</value>
</property>
<!--reduce獲取數據時通過shuffle方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
修改slaves
hadoopSpark01
hadoopSpark02
hadoopSpark03
將配置好的hadoop拷貝到其他節點
xrsync.sh hadoop-2.8.5/
###注意:嚴格按照下面的步驟
啓動zookeeper集羣(分別在hadoopSpark01、hadoopSpark02、hadoopSpark03上啓動zk)
zkServer.sh start
#查看狀態:一個leader,兩個follower
zkServer.sh status
啓動journalnode
hadoop-daemons.sh start journalnode
#運行jps命令檢驗,hadoopSpark01,hadoopSpark02、hadoopSpark03上多了JournalNode進程
格式化HDFS
#在hadoopSpark01上執行命令:
hdfs namenode -format
#格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這裏我配置的是/export/servers/hadoop-2.8.5/data/
scp -r /export/servers/hadoop-2.8.5/data/ hadoopSpark02:/export/servers/hadoop-2.8.5/
格式化ZK(在hadoopSpark01上執行即可 在zookeeper上能找到hadoop-ha文件夾)
hdfs zkfc -formatZK
啓動HDFS(在hadoopSpark01上執行)
start-dfs.sh
啓動zk
hadoop-daemons.sh start zkfc
啓動YARN(#####注意#####:是在hadoopSpark01上執行start-yarn.sh,把namenode和resourcemanager分開是因爲性能問題,因爲他們都要佔用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啓動)
start-yarn.sh
到此,hadoop配置完畢,可以統計瀏覽器訪問:
http://192.168.1.25:50070
NameNode 'hadoopSpark01:9000' (active)
http://192.168.1.26:50070
NameNode 'hadoopSpark02:9000' (standby)