hadoop集群規划
目標:創建2個NameNode,做高可用,一個NameNode掛掉,另一個能夠啟動;一個運行Yarn,3台DataNode,3台Zookeeper集群,做高可用。
在hadoop2中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。
這里還配置了一個zookeeper集群,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode為standby狀態
安裝我都把hadoop和Zookeeper放到了/soft/下面;
0、系統環境安裝
操作系統CentOS6.5,64位操作系統,采用最小化安裝,為了能夠實現目標,采用VMware 虛擬機來搭建6台服務器,所以建議服務器至少有8G內存;vmware使用的是VMware® Workstation
11.0.0 build-2305329;
網絡配置如下:



虛擬機配置如下:
1、同步機器時間
yum install -y ntp #安裝時間服務
ntpdate us.pool.ntp.org #同步時間
2、設置主機IP
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
IPADDR=192.168.8.101
NETMASK=255.255.255.0
GATEWAY=192.168.8.2
HWADDR=00:0C:29:56:63:A1
TYPE=Ethernet
UUID=ecb7f947-8a93-488c-a118-ffb011421cac
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
然后重啟網絡服務
service network restart
查看ip配置
ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:6C:20:2B
inet addr:192.168.8.101 Bcast:192.168.8.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe6c:202b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:777 errors:0 dropped:0 overruns:0 frame:0
TX packets:316 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:70611 (68.9 KiB) TX bytes:49955 (48.7 KiB)
這就說明我們配置的IP地址是成功的
注意:
使用vmware克隆了5台虛擬機,配置網卡的時候出現報錯:”Bring up interface eth0:Device eth0 does not seem to be present,delaying initialization”
解決步驟:
第一步
刪除文件70-persistent-net.rules
rm -f /etc/udev/rules.d/70-persistent-net.rule
第二步
修改ifcfg-eth0
vim /etc/sysconfig/network-scripts/ifcfg-eth0
刪除或者注釋MAC地址的配置
第三步:重啟服務器
reboot
這樣就可以設置新的ip地址了
3、設置主機名
把一台主機的名稱改為:hadoop01
vi /etc/sysconfig/network
修改hostname就可以了:
NETWORKING=yes
HOSTNAME=hadoop01
NETWORKING_IPV6=no
要修改hosts
vi /etc/hosts
127.0.0.1 localhost
192.168.8.101 hadoop01 192.168.8.102 hadoop02 192.168.8.103 hadoop03 192.168.8.104 hadoop04 192.168.8.105 hadoop05 192.168.8.106 hadoop06
關閉ipv6
1、查看系統是否開啟ipv6
a)通過網卡屬性查看
命令:ifconfig
注釋:有 “inet6 addr:。。。。。。。“ 的表示開啟了ipv6功能
b)通過內核模塊加載信息查看
命令:lsmod | grep ipv6
2、ipv6關閉方法
在/etc/modprobe.d/dist.conf結尾添加
alias net-pf-10 off
alias ipv6 off
可用vi等編輯器,也可以通過命令:
cat <<EOF>>/etc/modprobe.d/dist.conf
alias net-pf-10 off
alias ipv6 off
EOF
關閉防火牆
chkconfig iptables stop
chkconfig iptables off
改好后重啟服務器:
reboot
hadoop02-hadoop06都需要設置
4、安裝JDK
將壓縮包解壓到指定目錄,然后編輯環境變量
vi /etc/proflie
在文件后面追加環境變量
export JAVA_HOME=/soft/jdk1.7.0_80/
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
刷新
source /etc/profile
可以用java -version測試安裝是否正確
5、SSH免密碼登錄
對於需要遠程管理其它機器,一般使用遠程桌面或者telnet。linux一般只能是telnet。但是telnet的缺點是通信不加密,存在不安全因素,只適合內網訪問。為
解決這個問題,推出了通信加密通信協議,即SSH(Secure Shell)。使用非對稱加密方式,傳輸內容使用rsa或者dsa加密,可以避免網絡竊聽。
hadoop的進程之間同信使用ssh方式,需要每次都要輸入密碼。為了實現自動化操作,需要配置ssh免密碼登陸方式。
hadoop01\hadoop02做為NameNode,要訪問到其他的節點,我們要在hadoop01可以訪問到hadoop01-hadoop06(記住hadoop01也需要免登陸自己),hadoop02可以訪問到hadoop01,hadoop03是yarn服務,要可以訪問到datanode,所以hadoop03要免登陸到hadoop04-hadoop06;
首先要在hadoop01上生成ssh私鑰和公鑰
cd /root/.ssh
ssh-keygen -t rsa #4個回車
上面的命令會在.ssh目錄生成一個私鑰和一個公鑰
id_rsa id_rsa.pub
然后將hadoop01的公鑰復制到hadoop02-hadoop06,用以下命令執行
ssh-copy-id -i hadoop01
ssh-copy-id -i hadoop02
ssh-copy-id -i hadoop03
ssh-copy-id -i hadoop04
ssh-copy-id -i hadoop05
ssh-copy-id -i hadoop06
上面的命令一行一行執行,先輸入yes,再輸入機器的密碼就可以了;
現在我們來檢驗以一下hadoop01到hadoop05的免登陸
我們在hadoop01中無密碼登錄hadoop05輸入:
[root@hadoop01 .ssh]# ssh hadoop05
Last login: Tue Nov 10 17:43:41 2015 from 192.168.8.1
[root@hadoop05 ~]#
可以看到已經可以從hadoop01到hadoop05免登陸了;輸入exit退出
接下來設置hadoop02到hadoop01的免登陸
在hadoop02的/root/.ssh中執行
ssh-keygen -t rsa #4個回車
ssh-copy-id -i hadoop01
如果出現以上信息就表示配置成功了。用exit退出;
那現在就很方便了,不用打開多個ssh,用一個就全搞定了;也可以配置一個hadoop用戶,我現在都是使用root用戶。
同里也要配置hadoop03到hadoop04-hadoop06的免登陸,這里就不列出了。
6、安裝zookeeper
要將zookeeper集群部署到hadoop04、hadoop05、hadoop06上,先來設置hadoop04,操作如下
解壓zookeeper到指定目錄
tar -zxvf zookeeper-3.4.6.tar.gz -C /root/soft
切換到zookeeper目錄的conf目錄,修改zoo.sample.cfg為zoo.cfg
mv zoo.sample.cfg zoo.cfg
配置zoo.cfg
vi zoo.cfg
[root@hadoop04 conf]# vi zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/soft/zookeeper-3.4.6/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=192.168.8.104:2888:3888
server.2=192.168.8.105:2888:3888
server.3=192.168.8.106:2888:3888
保存zoo.cfg
server
.
1
=
192.168
.
8.104
:
2888
:
3888
2888是通信端口,3888是zookeeper選舉端口,這里用ip也可以,用主機名也可以。
注意配置文件中的datadir
dataDir=/soft/zookeeper-3.4.6/data
這個目錄要真實存在才可以;
接下來要在
/
soft/zookeeper-3.4.6/data目錄中增加一個文件"myid"
vi myid
文件里面寫入1,然后保存,這表示是server.1;
好了,這樣就配置好了,將配置好的拷貝到hadoop05、hadoop06,注意要修改data目錄中myid的內容為響應的2和3
啟動hadoop04、hadoop05、hadoop06的zookeeper服務
zookeeper
-
3.4
.
6目錄執行以下命令
bin/zkServer.sh start #啟動
bin/zkServer.sh status #查看狀態
hadoop04的結果:
[root@hadoop04 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
hadoop05的結果:
[root@hadoop05 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
hadoop06的結果:
[root@hadoop06 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
接下來測試以下zookeeper集群,在hadoop04上關閉zookeeper
bin/zkServer.sh stop
hadoop04的結果:
[root@hadoop04 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
[root@hadoop04 zookeeper-3.4.6]#
hadoop05的結果:
[root@hadoop05 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
hadoop06的結果:
[root@hadoop06 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
從上面結果可以看出,zookeeper集群是沒有問題的,hadoop04掛掉,hadoop06就變成了leader,這說明zookeeper集群已經部署好了。
7、hadoop安裝
現在hadoop01上面配置好,然后再拷貝到其他機器上;
先解壓hadoop-2.7.1.tar.gz到soft,查看hadoop目錄文件如下:
[root@hadoop01 hadoop-2.7.1]# ls
bin etc include journal lib libexec LICENSE.txt logs NOTICE.txt README.txt sbin share
所有的配置文件都存放在etc/hadoop/文件夾里面
7.1、添加hadoop目錄到環境變量
在/etc/profile文件中增加HADOOP_HOME,如下所示
export JAVA_HOME=/soft/jdk1.7.0_80/
export HADOOP_HOME=/soft/hadoop-2.7.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
應用環境變量
source /etc/profile
可以用方法測試是否正確
[root@hadoop01 hadoop-2.7.1]# which hadoop
/soft/hadoop-2.7.1/bin/hadoop
7.2、配置hadoop-env.sh
vim hadoop-env.sh
修改一個地方就可以,找到JAVA_HOME,改成第4章中jdk的路徑就可以了
export JAVA_HOME=/soft/jdk1.7.0_80/
保存即可。
7.3、配置core-site.xml
這一步是配置nameservice,hadoop 文件存儲位置和Zookeeper集群來確保多個namenode之間的切換,修改后內容如下:
<configuration>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/soft/hadoop-2.7.1/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop04:2181,hadoop05:2181,hadoop06:2181</value>
</property>
</configuration>
7.4、配置hdfs-site.xml
hdfs-site.xml主要配置namenode的高可用;
內容如下:
<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>hadoop01:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop02:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop02:50070</value>
</property>
<!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop04:8485;hadoop05:8485;hadoop06:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/soft/hadoop-2.7.1/journal</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</value>
</property>
<!-- 使用隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
</configuration>
保存即可。
7.4、配置datanode的配置文件slaves
vi slaves
修改datanode節點如下:
hadoop04
hadoop05
hadoop06
保存即可。
7.5、配置mapreduce文件mapred-site.xml
默認是沒有mapred-site.xml文件的,里面有一個mapred-site.xml.example,重命名為mapred-site.xml
mv mapred-site.xml.example mapred-site.xml
配置內容如下,這里就是指明mapreduce是用在YARN之上來執行的。
<configuration>
<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
7.6、配置yarn-site.xml
做規划的時候就是配置hadoop03來運行yarn,配置如下:
<configuration>
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
</property>
<!-- 指定nodemanager啟動時加載server的方式為shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
到目前為止就已經配置好hadoop01了,要將配置好的hadoop文件拷貝到hadoop02-hadoop06上,cd到soft目錄
scp -r hadoop2.7.1 hadoop02:/soft/
scp -r hadoop2.7.1 hadoop03:/soft/
scp -r hadoop2.7.1 hadoop04:/soft/
scp -r hadoop2.7.1 hadoop05:/soft/
scp -r hadoop2.7.1 hadoop06:/soft/
7.7、啟動Zookeeper服務
在hadoop04、hadoop05、hadoop06上啟動Zookeeper,下面以hadoop04為例
[root@hadoop04 zookeeper-3.4.6]# bin/zkServer.sh start
JMX enabled by default
Using config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
確保這三台服務器上有一個leader,兩個follower
7.8、在hadoop01上啟動journalnode
[root@hadoop01 hadoop-2.7.1]# sbin/hadoop-daemons.sh start journalnode
在7.4中配置了journalnode的節點是hadoop04、hadoop05、hadoop06,這三台機器上會出現
JournalNode,以下是hadoop04上的進程
[root@hadoop04 zookeeper-3.4.6]# jps
1532 JournalNode
1796 Jps
1470 QuorumPeerMain
7.9、在hadoop01上格式化hadoop
hadoop namenode -format
格式化后會在根據7.3中core-site.xml中的hadoop.tmp.dir配置生成個文件,在hadoop01中會出現一個tmp文件夾,/soft/hadoop-2.7.1/tmp,
現在規划的是hadoop01和hadoop02是NameNode,
然后將/soft/hadoop-2.7.1/tmp拷貝到hadoop02:/soft/hadoop-2.7.1/下,這樣hadoop02就不用格式化了。
scp -r tmp/ hadoop02:/soft/hadoop-2.7.1/
7.10、在hadoop01上格式化ZK
hdfs zkfc -formatZK
7.11、在hadoop01上 啟動HDFS
sbin/start-dfs.sh
7.12 在hadoop01上啟動YARN
sbin/start-yarn.sh
如果沒有出錯,hadoop的高可用就配置完成了;
8、使用hadoop集群測試
在本機中配置hosts文件(不是VMware虛擬機)
文件路徑:C:\Windows\System32\drivers\etc\hosts
內容如下:
192.168.8.101 hadoop01
192.168.8.102 hadoop02
192.168.8.103 hadoop03
192.168.8.104 hadoop04
192.168.8.105 hadoop05
192.168.8.106 hadoop06
在瀏覽器中輸入:
http://hadoop01:50070/,就可以看到如下界面
查看hadoop02:
http://hadoop02:50070/
上面可以看到hadoop01是處於active狀態,hadoop02是初一standby,接下來測試以下namenode的高可用,當hadoop01掛掉時hadoop02是否能夠自動切換;
在hadoop01中kill掉NameNode進程
[root@hadoop01 hadoop-2.7.1]# jps
1614 NameNode
2500 Jps
1929 DFSZKFailoverController
[root@hadoop01 hadoop-2.7.1]# kill -9 1614
刷新
http://hadoop01:50070/,無法訪問,
這是hadoop02已經處於active狀態了,這說明我們的切換是沒有問題的,現在已經完成了hadoop集群的高可用的搭建;