1.目錄規划
|
Master1/192.168.1.101 |
Master2/192.168.1.102 |
Slave1/192.168.1103 |
Slave2/192.168.1.17104 |
Slave3/192.168.1.17105 |
namenode |
是 |
是 |
否 |
否 |
否 |
datanode |
否 |
否 |
是 |
是 |
是 |
resourcemanager |
是 |
是 |
否 |
否 |
否 |
journalnode |
是 |
是 |
是 |
是 |
是 |
zookeeper |
是 |
是 |
是 |
是 |
是 |
Journalnode和ZooKeeper保持奇數個,這點大家要有個概念,最少不少於 3 個節點
2.軟件規划
軟件 |
版本 |
位數 |
說明 |
jdk |
jdk1.7 |
64位 |
最新穩定版本 |
centos |
centos6.5 |
64位 |
|
zookeeper |
Apache zookeeper3.4.6 |
|
穩定版本 |
hadoop |
Apache hadoop2.6.0 |
|
穩定版本 |
3.用戶規划
節點名稱 |
用戶組 |
用戶 |
|
Master1 |
hadoop |
hadoop |
|
Master2 |
hadoop |
hadoop |
|
Slave1 |
hadoop |
hadoop |
|
Slave2 |
hadoop |
hadoop |
|
Slave3 |
hadoop |
hadoop |
|
4.目錄規划
所有軟件目錄 |
/home/hadoop/app/ |
所有數據和日志目錄 |
/home/hadoop/data/ |
5.時鍾同步
所有節點的系統時間要與當前時間保持一致。
查看當前系統時間
date
Tue Nov 3 06:06:04 CST 2015
如果系統時間與當前時間不一致,進行以下操作。
[root@Master1 ~]# cd /usr/share/zoneinfo/
[root@Maseter1 zoneinfo]# ls //找到Asia
[root@Master1 zoneinfo]# cd Asia/ //進入Asia目錄
[root@Maseter1 Asia]# ls //找到Shanghai
[root@Maseter1 Asia]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime //當前時區替換為上海
我們可以同步當前系統時間和日期與NTP(網絡時間協議)一致。
[root@Maseter1 Asia]# yum install ntp //如果ntp命令不存在,在線安裝ntp
[root@Maseter1 Asia]# ntpdate pool.ntp.org //執行此命令同步日期時間
[root@Maseter1 Asia]# date //查看當前系統時間
6.hosts文件檢查
hosts文件檢查
所有節點的hosts文件都要配置靜態ip與hostname之間的對應關系。
[root@djt11 Asia]# vi /etc/hosts
192.168.1.101 Master1
192.168.1.102 Master2
192.168.1.103 Slave1
192.168.1.104 Slave2
192.168.1.105 Slave3
禁用防火牆
所有節點的防火牆都要關閉。
查看防火牆狀態
[root@Master1 Asia]# service iptables status
iptables: Firewall is not running.
如果不是上面的關閉狀態,則需要關閉防火牆。
[root@Master1 Asia]# chkconfig iptables off //永久關閉防火牆
[root@Master1 Asia]# service iptables stop /
創建hadoop用戶
- [root@Master1 ~]# groupadd hadoop //創建用戶組
- [root@Master1 ~]# useradd -g hadoop hadoop //新建hadoop用戶並增加到hadoop工作組
- [root@Master1 ~]# passwd hadoop //設置密碼
配置SSH免密碼通信
[root@Master1~]# su hadoop //切換到hadoop用戶下
[hadoop@Master1root]$ cd //切換到hadoop用戶目錄
[hadoop@Master1~]$ mkdir .ssh
[hadoop@Master1~]$ ssh-keygen -t rsa //執行命令一路回車,生成秘鑰
[hadoop@Master1~]$cd .ssh
[hadoop@Master1.ssh]$ ls
id_rsa id_rsa.pub
[hadoop@Master1.ssh]$ cat id_ras.pub >> authorized_keys //將公鑰保存到authorized_keys認證文件中
[hadoop@Master1.ssh]$ ls
authorized_keys id_rsa id_rsa.pub
[hadoop@Master1.ssh]$ cd ..
[hadoop@Master1~]$ chmod 700 .ssh
[hadoop@Master1~]$ chmod 600 .ssh/*
[hadoop@Master1~]$ ssh Master1 //第一次執行需要輸入yes
[hadoop@Master1~]$ ssh Master1
每個節點都同樣的操作
將所有節點中的共鑰id_ras.pub拷貝到Master1中的authorized_keys文件中。
cat ~/.ssh/id_rsa.pub | ssh hadoop@Master1 'cat >> ~/.ssh/authorized_keys 所有節點都需要執行這條命令
然后將Master1中的authorized_keys文件分發到所有節點上面。
scp -r authorized_keys hadoop@Master2:~/.ssh/
scp -r authorized_keys hadoop@Slave1:~/.ssh/
scp -r authorized_keys hadoop@Slave2:~/.ssh/
scp -r authorized_keys hadoop@Slave3:~/.ssh/
大家通過ssh 相互訪問,如果都能無密碼訪問,代表ssh配置成功
腳本工具的使用
在Master1節點上創建/home/hadoop/tools目錄。
[hadoop@Master1 ~]$ mkdir /home/hadoop/tools
cd /home/hadoop/tools
將本地腳本文件上傳至/home/hadoop/tools目錄下。這些腳本大家如果能看懂也可以自己寫, 如果看不懂直接使用就可以,后面慢慢補補Linux相關的知識。
[hadoop@Master1tools]$ rz deploy.conf
[hadoop@Master1tools]$ rz deploy.sh
[hadoop@Master1tools]$ rz runRemoteCmd.sh
[hadoop@Master1tools]$ ls
deploy.conf deploy.sh runRemoteCmd.sh
查看一下deploy.conf配置文件內容。
[hadoop@Master1tools]$ cat deploy.conf
Master1,all,namenode,zookeeper,resourcemanager,
Master1,all,slave,namenode,zookeeper,resourcemanager,
Slave1,all,slave,datanode,zookeeper,
Slave2,all,slave,datanode,zookeeper,
Slave3,all,slave,datanode,zookeeper,
查看一下deploy.sh遠程復制文件腳本內容。
[hadoop@Master1 tools]$ cat deploy.sh
#!/bin/bash
#set -x
if [ $# -lt 3 ]
then
echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag"
echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile"
exit
fi
src=$1
dest=$2
tag=$3
if [ 'a'$4'a' == 'aa' ]
then
confFile=/home/hadoop/tools/deploy.conf
else
confFile=$4
fi
if [ -f $confFile ]
then
if [ -f $src ]
then
for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
do
scp $src $server":"${dest}
done
elif [ -d $src ]
then
for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
do
scp -r $src $server":"${dest}
done
else
echo "Error: No source file exist"
fi
else
echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi
查看一下runRemoteCmd.sh遠程執行命令腳本內容。
[hadoop@Master1 tools]$ cat runRemoteCmd.sh
#!/bin/bash
#set -x
if [ $# -lt 2 ]
then
echo "Usage: ./runRemoteCmd.sh Command MachineTag"
echo "Usage: ./runRemoteCmd.sh Command MachineTag confFile"
exit
fi
cmd=$1
tag=$2
if [ 'a'$3'a' == 'aa' ]
then
confFile=/home/hadoop/tools/deploy.conf
else
confFile=$3
fi
if [ -f $confFile ]
then
for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
do
echo "*******************$server***************************"
ssh $server "source /etc/profile; $cmd"
done
else
echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi
以上三個文件,方便我們搭建hadoop分布式集群。具體如何使用看后面如何操作。
如果我們想直接使用腳本,還需要給腳本添加執行權限。
[hadoop@Master1 tools]$ chmod u+x deploy.sh
[hadoop@Master1 tools]$ chmod u+x runRemoteCmd.sh
同時我們需要將/home/hadoop/tools目錄配置到PATH路徑中。
[hadoop@Master1 tools]$ su root
Password:
[root@Master1 tools]# vi /etc/profile
PATH=/home/hadoop/tools:$PATH
export PATH
用腳本runRemoteCmd.sh “/home/hadoop/app”all
在所有節點上創建軟件目錄
jdk安裝
將本地下載好的jdk1.7,上傳至djt11節點下的/home/hadoop/app目錄。
[root@Master1 tools]# su hadoop
[hadoop@Master1 tools]$ cd /home/hadoop/app/
[hadoop@Master1 app]$ rz //選擇本地的下載好的jdk-7u79-linux-x64.tar.gz
[hadoop@Master1 app]$ ls
jdk-7u79-linux-x64.tar.gz
[hadoop@Master1 app]$ tar zxvf jdk-7u79-linux-x64.tar.gz //解壓
[hadoop@Master1 app]$ ls
jdk1.7.0_79 jdk-7u79-linux-x64.tar.gz
[hadoop@Master1 app]$ rm jdk-7u79-linux-x64.tar.gz //刪除安裝包
添加jdk環境變量。
[hadoop@Master1 app]$ su root
Password:
[root@Master1 app]# vi /etc/profile
JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
[root@djt11 app]# source /etc/profile //使配置文件生效
查看jdk是否安裝成功。
[root@Master1 app]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
出現以上結果就說明Master1 節點上的jdk安裝成功。
然后將Master1 下的jdk安裝包復制到其他節點上。
[hadoop@Master1 app]$ deploy.sh jdk1.7.0_79 /home/hadoop/app/ slave
Master1,Master2,Master3,Master4節點重復Master1節點上的jdk配置環境變量即可
Zookeeper安裝
將本地下載好的zookeeper-3.4.6.tar.gz安裝包,上傳至Master1節點下的/home/hadoop/app目錄下。
[hadoop@Master1 app]$ rz //選擇本地下載好的zookeeper-3.4.6.tar.gz
[hadoop@Master1 app]$ ls
jdk1.7.0_79 zookeeper-3.4.6.tar.gz
[hadoop@Master1 app]$ tar zxvf zookeeper-3.4.6.tar.gz //解壓
[hadoop@Master1 app]$ ls
jdk1.7.0_79 zookeeper-3.4.6.tar.gz zookeeper-3.4.6
[hadoop@Master1 app]$ rm zookeeper-3.4.6.tar.gz //刪除zookeeper-3.4.6.tar.gz安裝包
[hadoop@Master1 app]$ mv zookeeper-3.4.6 zookeeper //重命名
修改Zookeeper中的配置文件。
[hadoop@Master1 app]$ cd /home/hadoop/app/zookeeper/conf/
[hadoop@Master1 conf]$ ls
configuration.xsl log4j.properties zoo_sample.cfg
[hadoop@Master1 conf]$ cp zoo_sample.cfg zoo.cfg //復制一個zoo.cfg文件
[hadoop@Master1 conf]$ vi zoo.cfg
dataDir=/home/hadoop/data/zookeeper/zkdata //數據文件目錄
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog //日志目錄
# the port at which the clients will connect
clientPort=2181 //默認端口號
#server.服務編號=主機名稱:Zookeeper不同節點之間同步和通信的端口:選舉端口(選舉leader)
server.1=Master1:2888:3888
server.2=Master2:2888:3888
server.3=Slave1:2888:3888
server.4=Slave2:2888:3888
server.5=Slave3:2888:3888
通過遠程命令deploy.sh將Zookeeper安裝目錄拷貝到其他節點上面。
[hadoop@Master1 app]$ deploy.sh zookeeer /home/hadoop/app slave
通過遠程命令runRemoteCmd.sh在所有的節點上面創建目錄:
[hadoop@Master1 app]$ runRemoteCmd.sh "mkdir -p /home/hadoop/data/zookeeper/zkdata" all //創建數據目錄
[hadoop@Master1 app]$ runRemoteCmd.sh "mkdir -p /home/hadoop/data/zookeeper/zkdatalog" all //創建日志目錄
然后分別在Master1、Master2、Slave1、Slave2、Slave3上面,進入zkdata目錄下,創建文件myid,里面的內容分別填充為:1、2、3、4、5, 這里我們以Master1為例。
[hadoop@Master1 app]$ cd /home/hadoop/data/zookeeper/zkdata
[hadoop@Master1 zkdata]$ vi myid
1 //輸入數字1
配置Zookeeper環境變量。
[hadoop@Master1 zkdata]$ su root
Password:
[root@Master1 zkdata]# vi /etc/profile
JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
ZOOKEEPER_HOME=/home/hadoop/app/zookeeper
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH ZOOKEEPER_HOME
[root@Master1 zkdata]# source /etc/profile //使配置文件生效
runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" zookeeper
runRemoteCmd.sh “jps” all 查看是否安裝成功
runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh stop" zookeeper
hadoop集群環境搭建
將下載好的apache hadoop-2.6.0.tar.gz安裝包,上傳至Master1 節點下的/home/hadoop/app目錄下。
[hadoop@Master1 app]$ rz //將本地的hadoop-2.6.0.tar.gz安裝包上傳至當前目錄
[hadoop@Master1 app]$ ls
hadoop-2.6.0.tar.gz jdk1.7.0_79 zookeeper
[hadoop@Master1 app]$ tar zxvf hadoop-2.6.0.tar.gz //解壓
[hadoop@Master1 app]$ ls
hadoop-2.6.0 hadoop-2.6.0.tar.gz jdk1.7.0_79 zookeeper
[hadoop@Master1 app]$ rm hadoop-2.6.0.tar.gz //刪除安裝包
[hadoop@Master1 app]$ mv hadoop-2.6.0 hadoop //重命名
切換到/home/hadoop/app/hadoop/etc/hadoop/目錄下,修改配置文件。
[hadoop@Master1 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/
配置HDFS
配置hadoop-env.sh
[hadoop@Master1 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
配置core-site.xml
[hadoop@Master1 hadoop]$ vi core-site.xml<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
</property>
< 這里的值指的是默認的HDFS路徑 ,取名為cluster1>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/tmp</value>
</property>
< hadoop的臨時目錄,如果需要配置多個目錄,需要逗號隔開,data目錄需要我們自己創建>
<property>
<name>ha.zookeeper.quorum</name>
<value>master1:2181,Master2:2181,Slave1:2181,Slave2:2181, Slave3:2181</value>
</property>
< 配置Zookeeper 管理HDFS>
</configuration>
配置hdfs-site.xml
[hadoop@Master1hadoop]$ vi hdfs-site.xml<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
< 數據塊副本數為3>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
< 權限默認配置為false>
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
< 命名空間,它的值與fs.defaultFS的值要對應,namenode高可用之后有兩個namenode,cluster1是對外提供的統一入口>
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>Master1,Master2</value>
</property>
< 指定 nameService 是 cluster1 時的nameNode有哪些,這里的值也是邏輯名稱,名字隨便起,相互不重復即可>
<property>
<name>dfs.namenode.rpc-address.cluster1.Master1</name>
<value>Master2:9000</value>
</property>
< djt11 rpc地址>
<property>
<name>dfs.namenode.http-address.cluster1.Master1</name>
<value>Master2:50070</value>
</property>
< djt11 http地址>
<property>
<name>dfs.namenode.rpc-address.cluster1.Master2</name>
<value>Master2:9000</value>
</property>
< djt12 rpc地址>
<property>
<name>dfs.namenode.http-address.cluster1.Master2</name>
<value>Master2:50070</value>
</property>
< djt12 http地址>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
< 啟動故障自動恢復>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://Master1:8485;Master2:8485;Slave1:8485;Slave2:8485;Slave3:8485/cluster1</value>
</property>
< 指定journal>
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
< 指定 cluster1 出故障時,哪個實現類負責執行故障切換>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journaldata/jn</value>
</property>
< 指定JournalNode集群在對nameNode的目錄進行共享時,自己存儲數據的磁盤路徑 >
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
</property>
< 腦裂默認配置>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property></configuration>
配置 slave
[hadoop@Master1 hadoop]$ vi slaves
Slave1
Slave2
Slave3
YARN安裝配置
配置mapred-site.xml
[hadoop@Master hadoop]$ vi mapred-site.xml<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<指定運行mapreduce的環境是Yarn,與hadoop1不同的地方></configuration>
配置yarn-site.xml
[hadoop@Master1 hadoop]$ vi yarn-site.xml<configuration><property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>2000</value></property>< 超時的周期><property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value></property>< 打開高可用><property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value></property><啟動故障自動恢復><property>
<name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
<value>true</value></property>
<failover使用內部的選舉算法 style="box-sizing: border-box; margin: 0px; padding: 0px;"><property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-rm-cluster</value></property><給yarn cluster 取個名字yarn-rm-cluster><property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value></property><給ResourceManager 取個名字 rm1,rm2><property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>Master1</value></property><配置ResourceManager rm1 hostname><property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>Master2</value></property><配置ResourceManager rm2 hostname><property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value></property><啟用resourcemanager 自動恢復><property>
<name>yarn.resourcemanager.zk.state-store.address</name>
<value>Master1:2181,Master2:2181,Slave1:2181,Slave2:2181,Slave3:2181</value></property><配置Zookeeper地址><property>
<name>yarn.resourcemanager.zk-address</name>
<value>Master1:2181,Master2:2181,Slave1:2181,Slave2:2181,Slave3:2181</value></property><配置Zookeeper地址><property>
<name>yarn.resourcemanager.address.rm1</name>
<value>Master1:8032</value></property>< rm1端口號><property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>Master1:8034</value></property>< rm1調度器的端口號><property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>Master1:8088</value></property>< rm1 webapp端口號><property>
<name>yarn.resourcemanager.address.rm2</name>
<value>Master2:8032</value></property>< rm2端口號><property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>Master2:8034</value></property>< rm2調度器的端口號><property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>Master2:8088</value></property>< rm2 webapp端口號><property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value></property><property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value></property><執行MapReduce需要配置的shuffle過程></configuration>
向所有節點分發hadoop安裝包。
[hadoop@Master1 app]$ deploy.sh hadoop /home/hadoop/app/ slave
1、啟動所有Zookeeper
[hadoop@Master1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" zookeeper
2、每個節點分別啟動journalnode
[hadoop@Master1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode" all
3、主節點執行格式化
[hadoop@Master1 hadoop]$ bin/hdfs namenode -format / /namenode 格式化
[hadoop@Master1 hadoop]$ bin/hdfs zkfc -formatZK //格式化高可用
[hadoop@Master1 hadoop]$bin/hdfs namenode //啟動namenode
4、備節點執行
[hadoop@Master1 hadoop]$ bin/hdfs namenode -bootstrapStandby //同步主節點和備節點之間的元數據
5、停掉hadoop,在Master1按下ctrl+c結束namenode
[hadoop@Master1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh stop journalnode" all //然后停掉各節點的journalnode
6、一鍵啟動hdfs相關進程
[hadoop@Master1 hadoop]$ sbin/start-dfs.sh
7、在Master1節點上執行。
[hadoop@Master2 hadoop]$ sbin/start-yarn.sh
8、在Master2節點上面執行。
[hadoop@Master2 hadoop]$ sbin/yarn-daemon.sh start resourcemanager
9、驗證namenode:
http://Master1:50070
http://Master2:50070
10、驗證yarn:
http://Master1:8088
http://Master2:8088