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=eth0IPADDR=192.168.8.101NETMASK=255.255.255.0GATEWAY=192.168.8.2HWADDR=00:0C:29:56:63:A1TYPE=EthernetUUID=ecb7f947-8a93-488c-a118-ffb011421cacONBOOT=yesNM_CONTROLLED=yesBOOTPROTO=none
然后重啟網絡服務
service network restart
查看ip配置
ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:6C:20:2Binet addr:192.168.8.101 Bcast:192.168.8.255 Mask:255.255.255.0inet6 addr: fe80::20c:29ff:fe6c:202b/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:777 errors:0 dropped:0 overruns:0 frame:0TX packets:316 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX 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=yesHOSTNAME=hadoop01NETWORKING_IPV6=no
要修改hosts
vi /etc/hosts
127.0.0.1 localhost192.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 offalias ipv6 off
可用vi等編輯器,也可以通過命令:
cat <<EOF>>/etc/modprobe.d/dist.conf
alias net-pf-10 off
alias ipv6 off
EOF
關閉防火牆
chkconfig iptables stopchkconfig 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/.sshssh-keygen -t rsa #4個回車
上面的命令會在.ssh目錄生成一個私鑰和一個公鑰
id_rsa id_rsa.pub
然后將hadoop01的公鑰復制到hadoop02-hadoop06,用以下命令執行
ssh-copy-id -i hadoop01ssh-copy-id -i hadoop02ssh-copy-id -i hadoop03ssh-copy-id -i hadoop04ssh-copy-id -i hadoop05ssh-copy-id -i hadoop06
上面的命令一行一行執行,先輸入yes,再輸入機器的密碼就可以了;
現在我們來檢驗以一下hadoop01到hadoop05的免登陸
我們在hadoop01中無密碼登錄hadoop05輸入:
[root@hadoop01 .ssh]# ssh hadoop05Last 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 ticktickTime=2000# The number of ticks that the initial# synchronization phase can takeinitLimit=10# The number of ticks that can pass between# sending a request and getting an acknowledgementsyncLimit=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 connectclientPort=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=1server.1=192.168.8.104:2888:3888server.2=192.168.8.105:2888:3888server.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 statusJMX enabled by defaultUsing config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfgMode: leader
hadoop05的結果:
[root@hadoop05 zookeeper-3.4.6]# bin/zkServer.sh statusJMX enabled by defaultUsing config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfgMode: follower
hadoop06的結果:
[root@hadoop06 zookeeper-3.4.6]# bin/zkServer.sh statusJMX enabled by defaultUsing config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfgMode: follower
接下來測試以下zookeeper集群,在hadoop04上關閉zookeeper
bin/zkServer.sh stop
hadoop04的結果:
[root@hadoop04 zookeeper-3.4.6]# bin/zkServer.sh statusJMX enabled by defaultUsing config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfgError contacting service. It is probably not running.[root@hadoop04 zookeeper-3.4.6]#
hadoop05的結果:
[root@hadoop05 zookeeper-3.4.6]# bin/zkServer.sh statusJMX enabled by defaultUsing config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfgMode: follower
hadoop06的結果:
[root@hadoop06 zookeeper-3.4.6]# bin/zkServer.sh statusJMX enabled by defaultUsing config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfgMode: leader
從上面結果可以看出,zookeeper集群是沒有問題的,hadoop04掛掉,hadoop06就變成了leader,這說明zookeeper集群已經部署好了。
7、hadoop安裝
現在hadoop01上面配置好,然后再拷貝到其他機器上;
先解壓hadoop-2.7.1.tar.gz到soft,查看hadoop目錄文件如下:
[root@hadoop01 hadoop-2.7.1]# lsbin 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.1export 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節點如下:
hadoop04hadoop05hadoop06
保存即可。
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 startJMX enabled by defaultUsing config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfgStarting 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]# jps1532 JournalNode1796 Jps1470 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 hadoop01192.168.8.102 hadoop02192.168.8.103 hadoop03192.168.8.104 hadoop04192.168.8.105 hadoop05192.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]# jps1614 NameNode2500 Jps1929 DFSZKFailoverController[root@hadoop01 hadoop-2.7.1]# kill -9 1614
刷新
http://hadoop01:50070/,無法訪問,
這是hadoop02已經處於active狀態了,這說明我們的切換是沒有問題的,現在已經完成了hadoop集群的高可用的搭建;







