hadoop 僞集羣搭建完整版

集羣規劃:(安裝集羣之前,先規劃下集羣,考慮配置,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)
         
            

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