hadoop2集群搭建詳解------------------------天津九安醫(yī)療電子--吳偉
一狼速、需要軟件
Jdk1.8.0_linux
Hadoop-2.2.0(Apache官網(wǎng)Stable版本)
Hbase-0.96.2(與Hadoop-2.2.0是配套的琅锻,不用覆蓋jar包)
Zookeepr-3.4.5
# 集群結(jié)構(gòu)圖
IP地址
主機(jī)名
ZK
NN
DN
JN
HRS
HM
192.168.12.109
Master1
是
是
是
是
否
是
192.168.12.122
Master2
是
是(備)
是
是
否
是(備)
192.168.12.123
Slave1
是
否
是
是
是
否
192.168.12.126
Slave2
是
否
是
是
是
否
192.168.12.127
Slave3
是
否
是
是
是
否
192.168.12.129
Slave4
是
否
是
否
是
否
192.168.12.131
Slave5
是
否
是
否
是
否
二、基礎(chǔ)配置
1向胡、配置hosts文件恼蓬,方便hadoop用主機(jī)名訪問
vi /etc/hosts
2、設(shè)置ssh免密碼登錄
1) 進(jìn)入 ~ 根目錄下的 ?.ssh 目錄(沒有的話僵芹,創(chuàng)建.ssh目錄)
2) 執(zhí)行ssh-keygen -t ?rsa
3) ls ?產(chǎn)生倆個文件(每臺都要執(zhí)行 )
?
id-rsa ? ? #私鑰 ?id-rsa.pub ? #公鑰
在每臺服務(wù)器上將公鑰復(fù)制到無需登錄的服務(wù)器上处硬,在每一臺服務(wù)器上執(zhí)ssh-copy-id的命令。
例如:
在192.168.12.109上執(zhí)行
? ? ?
ssh-copy-id -i ?~/.ssh/id_rsa.pub root@192.168.12.122
ssh-copy-id -i ?~/.ssh/id_rsa.pub root@192.168.12.123
拇派。荷辕。。件豌。疮方。
驗(yàn)證:
ssh slave1
3、關(guān)閉防火墻(centos 7)
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機(jī)啟動
4茧彤、安裝jdk
1)設(shè)置環(huán)境變量 ?vi ?/etc/profile ?
? 增加 export JAVA_HOME=/usr/local/jdk
? ? ? ?export HBASE_HOME=/usr/local/hbase
?
export HADOOP_HOME=/usr/local/hadoop
export ZOOKEEPER_HOME=/usr/local/zk
export
PATH=$PATH:$HBASE_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME/bin:
2)立即生效 ? ?source profile
三骡显、zookeeper安裝
1. zk服務(wù)器集群規(guī)模不小于3個節(jié)點(diǎn)(必須是奇數(shù)個),要求各服務(wù)器之間系統(tǒng)時間要保持一致。
2. 在節(jié)點(diǎn)的/usr/local目錄下蟆盐,解壓縮tar -zxvf ###承边。
3. 設(shè)置環(huán)境變量 vi /etc/profile ?增加ZOOKEEPER_HOME=~~~
? ?立即生效
Source /etc/profile
4. 在zk/conf目錄下,重命名文件 mv zoo_sample.cfg ?zoo.cfg
? ?編輯該文件石挂,執(zhí)行vi zoo.cfg
? 修改dataDir=/usr/local/zk/data ? ------------------存放數(shù)據(jù)目錄
? 新增:zk節(jié)點(diǎn)=對應(yīng)的hadoop節(jié)點(diǎn)
? ? Server.1=master1:2888:3888
(一個是通信端口博助,一個是選舉端口)
? ? Server.2=master2:2888:3888?
? ?Server.3=slave1:2888:3888
。痹愚。富岳。。拯腮。窖式。
5 創(chuàng)建文件夾存放數(shù)據(jù)目錄mkdir /usr/local/zk/data
6 在data目錄下,創(chuàng)建文件myid动壤,值為1
7 把zk目錄復(fù)制到其他節(jié)點(diǎn)
8 把其他節(jié)點(diǎn)中相應(yīng)的myid的值改為2
9 啟動:
? 在三個節(jié)點(diǎn)上分別執(zhí)行命令(在zk/bin下執(zhí)行)zkServer.sh start
?執(zhí)行后bin下多了zookeeper.out(日志)
10 檢驗(yàn)萝喘,在三個節(jié)點(diǎn)上分別執(zhí)行命令zkServer.sh status (leader或者follower)
時間同步
# yum install -y ntp ?#安裝ntp服務(wù)
# ntpdate cn.pool.ntp.org ?#同步網(wǎng)絡(luò)時間
四、hadoop2.2安裝
# 修改7個配置文件
~/hadoop-2.2.0/etc/hadoop/hadoop-env.sh
~/hadoop-2.2.0/etc/hadoop/core-site.xml
~/hadoop-2.2.0/etc/hadoop/hdfs-site.xml
~/hadoop-2.2.0/etc/hadoop/mapred-site.xml
~/hadoop-2.2.0/etc/hadoop/yarn-env.sh
~/hadoop-2.2.0/etc/hadoop/yarn-site.xml
~/hadoop-2.2.0/etc/hadoop/slaves
# 1修改hadoop-env.sh配置文件(jdk 路徑)
exportJAVA_HOME=/usr/local/jdk
# 2修改core-site.xml文件修改?
<configuration>
? ? ? ?<property>
? ? ? ? ? ? ? <name>fs.defaultFS</name>
? ? ? ? ? ? ? <value> hdfs://mycluster </value>
? ? ? ?</property>
? ?<property>
? ? ? ? ? ? ? <name>hadoop.tmp.dir</name>
? ? ? ? ? ? ? <value>/usr/local/hadoop/tmp</value>
? ? ? ?</property>【這里的路徑默認(rèn)是NameNode琼懊、DataNode阁簸、JournalNode等存放數(shù)據(jù)的公共目錄。用戶也可以自己單獨(dú)指定這三類節(jié)點(diǎn)的目錄哼丈∑裘茫】?
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.nameservices</name>
? ? ? ? ? ? ? <value>mycluster</value>
? ? ? ?</property>
【NameService實(shí)際就是HDFS集群的別名。使用federation時醉旦,可使用了多個HDFS集群饶米。】?
? ? ? ?<property>
? ? ? ? ? ? ? <name>ha.zookeeper.quorum</name>
? ? ? ? ? ? ? <value>master1:2181,master2:2181,slave1:2181,slave2:2181,slave3:2181,slave4:2181,slave5:2181</value>
? ? ? ?</property>
【這里是ZooKeeper集群的地址和端口车胡。注意檬输,數(shù)量一定是奇數(shù),且不少于三個節(jié)點(diǎn)】?
</configuration>
# 3修改hdfs-site.xml配置文件
<configuration>
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.nameservices</name>
? ? ? ? ? ? ? <value> mycluster </value>
? ? ? ?</property>
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.ha.namenodes.mycluster</name>
? ? ? ? ? ? ? <value>master1,master2</value>
? ? ? ?</property>
【指定NameService是mycluster時的namenode有哪些】?
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.namenode.rpc-address.mycluster.master1</name>
? ? ? ? ? ? ? <value>master1:9000</value>
? ? ? ?</property>
【指定master1的RPC地址】
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.namenode.rpc-address.mycluster.master2</name>
? ? ? ? ? ? ? <value>master2:9000</value>
? ? ? ?</property>
【指定master2的RPC地址】
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.namenode.http-address.mycluster.master1</name>
? ? ? ? ? ? ? <value>master1:50070</value>
? ? ? ?</property>
【指定master1的http地址】
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.namenode.http-address.mycluster.master2</name>
? ? ? ? ? ? ? <value>master2:50070</value>
? ? ? ?</property>
【指定master2的http地址】
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.namenode.shared.edits.dir</name>
? ? ? ? ? ? ? <value>qjournal://master1:8485;master2:8485;slave1:8485;slave2:8485;slave3:8485/mycluster</value>
? ? ? ?</property>
【指定mycluster的兩個NameNode共享edits文件目錄時吨拍,使用的JournalNode集群信息】
? ? ? <property>
? ? ? ? ? <name>dfs.ha.automatic-failover.enabled.mycluster</name>
? ? ? ? <value>true</value>
? ? </property>
【指定mycluster是否啟動自動故障恢復(fù)褪猛,即當(dāng)NameNode出故障時,是否自動切換到另一臺NameNode】
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.client.failover.proxy.provider.mycluster</name>
? ? ? ?<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
? ? ? ?</property>
【指定mycluster出故障時羹饰,哪個實(shí)現(xiàn)類負(fù)責(zé)執(zhí)行故障切換】?
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.ha.fencing.methods</name>
? ? ? ? ? ? ? <value>sshfence</value>
? ? ? ?</property>
【一旦需要NameNode切換,使用ssh方式進(jìn)行操作】?
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.ha.fencing.ssh.private-key-files</name>
? ? ? ? ? ? ? <value>/root/.ssh/id_rsa</value>
? ? ? ?</property>
【如果使用ssh進(jìn)行故障切換碳却,使用ssh通信時用的密鑰存儲的位置】
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.journalnode.edits.dir</name>
? ? ? ? ? ? ? <value>/usr/local/hadoop/tmp/journal</value>
? ? ? ?</property>
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.replication</name>
? ? ? ? ? ? ? <value>3</value>
? ? ? ?</property>
【指定DataNode存儲block的副本數(shù)量队秩。默認(rèn)值是3個,我們現(xiàn)在有7個DataNode昼浦,該值不大于7即可馍资。】
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.webhdfs.enabled</name>
? ? ? ? ? ? ? <value>true</value>
? ? ? ?</property>
</configuration>
# 4修改 mapred?-site.xml配置文件
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
【指定運(yùn)行mapreduce的環(huán)境是yarn关噪,與hadoop1截然不同的地方】?
</configuration>
# 5修改yarn-env.sh配置文件
exportJAVA_HOME=/usr/local/jdk
【這里的JAVA_HOME的值是jdk的安裝路徑】
# 6修改yarn-site.xml配置文件?
<configuration>
? ? ? ? <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>
? ? ? ?<property>
? ? ? ? ? ? ? <name>yarn.resourcemanager.hostname</name>
? ? ? ? ? ? ? <value>master1</value>
? ? ? ?</property>
【自定ResourceManager的地址鸟蟹,還是單點(diǎn)乌妙,這是隱患】
</configuration>
# 7修改slaves配置文件
master1
master2
slave1
slave2
slave3
slave4
slave5
【指定所有的DataNode節(jié)點(diǎn)列表,每行一個節(jié)點(diǎn)名稱】
五建钥、啟動集群
1藤韵、啟動Zookeeper集群
在usr/local/zk/bin 目錄下
執(zhí)行啟動命令:zkServer.sh start
# 驗(yàn)證Zookeeper是否啟動成功1
查看狀態(tài)命令:zkServer.sh status?
在 master1上查看 zookeeper 的狀態(tài)發(fā)現(xiàn)是 leader
在其他的機(jī)器上查看 zookeeper 的狀態(tài)發(fā)現(xiàn)是 follower
#驗(yàn)證Zookeeper是否啟動成功2
在usr/local/zk/bin 目錄下
執(zhí)行進(jìn)入命令行命令:
zkCli.sh
Connecting to localhost:2181
?[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1]
出現(xiàn)這樣的提示的話,那么 zookeeper 就啟動成功了
2熊经、格式化ZooKeeper集群泽艘,目的是在ZooKeeper集群上建立HA的相應(yīng)節(jié)點(diǎn)。
在usr/local/hadoop/bin 目錄下
執(zhí)行命令: hdfs zkfc -formatZK
# 驗(yàn)證zkfc是否格式化成功
進(jìn)入客戶端 zkCli.sh?
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha?
[mycluster]?
【格式化操作的目的是在ZK集群中建立一個節(jié)點(diǎn)镐依,用于保存集群c1中NameNode的狀態(tài)數(shù)據(jù)】
3匹涮、完全分布式 啟動Hadoop(切記順序不能亂)
# 在 master1,master2,slave1,slave2,slave3上分別啟動 journalnode
[root@master1sbin]# ./hadoop-daemon.sh start journalnode
# 在master1,master2上分別格式化和啟動namenode
從 master1和 master2中任選一個即可槐壳,這里選擇的是 master1
[root@master1sbin]# ../bin/hdfs namenode –format
[root@master1sbin]# ./hadoop-daemon.sh start namenode
# 將master1上namenode的數(shù)據(jù)同步到master2中去然低,需要在master2上執(zhí)行hadoop的命令
[root@rs227 sbin]# ../bin/hdfs namenode -bootstrapStandby
[root@rs227 sbin]# ./hadoop-daemon.sh start namenode
# 打開瀏覽器,訪問master1跟master2的50070端口
如果都能訪問到务唐,說明你 namenode 啟動成功了雳攘,并且這兩個 namenode 都是 standby 狀態(tài)
# namenode ( master1)轉(zhuǎn)換成 active (這里不需要手動將 namenode 轉(zhuǎn)換為 active 狀態(tài)了,因?yàn)槲覀兪墙唤o Zookeeper 管理绍哎,在后面會啟動 ZooKeeperFailoverController )
# 啟動所有的 datanodes(在master1上執(zhí)行命令)
[root@master1sbin]# ./hadoop-daemons.sh start datanode
?[root@master1sbin]# jps
25627 Jps
24037 NameNode
25168 DataNode
23343 JournalNode
29367 QuorumPeerMain
# 實(shí)驗(yàn)一下手動切換 namenode 的狀態(tài) (這里也不需要做来农, Zookeeper 管理的,自動切換崇堰,下面會講到)
# yarn啟動
[root@master1sbin]# ./start-yarn.sh
starting yarn daemons
# 訪問master1的8088端口查看ResourceManager的UI界面
?
# 啟動ZooKeeperFailoverController
#在master1上執(zhí)行命令
[root@master1sbin]# ./hadoop-daemon.sh start zkfc
#在master2上執(zhí)行命令
[root@master2 sbin]# ./hadoop-daemon.sh start zkfc
# 打開瀏覽器沃于,再訪問master1跟master2的50070端口
發(fā)現(xiàn) master1變成 active 狀態(tài)了,而 master2還是 standby 狀態(tài)
# 驗(yàn)證HDFS是否好用
[root@master1sbin]# ../bin/hadoop fs -putyarn-daemon.sh /yting
[root@master1sbin]# ../bin/hadoop fs -ls /yting
Found 1 items
-rw-r--r-- ? 3root supergroup ? ? ? 4278 2014-06-1018:29 /yting/yarn-daemon.sh
# 驗(yàn)證YARN是否好用
[root@master1bin]# pwd
/usr/local/adsit/yting/apache/hadoop/hadoop-2.2.0/bin
[root@master1bin]# ./hadoop jar../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar pi 10 100
…( 不重要的部分就省略了海诲,能出這個值就是對的繁莹,虛擬機(jī)可能會卡著不動,也可能會卡死特幔,屬于正匙裳荩現(xiàn)象,內(nèi)存消耗比較大 )
Job Finished in 25.361 seconds
valueof Pi is 3.14800000000000000000
# 驗(yàn)證HA高可用性蚯斯,是否自動故障轉(zhuǎn)移
在master1節(jié)點(diǎn)active namenode上執(zhí)行 jps 薄风,確定namenode進(jìn)程,kill 將其殺掉拍嵌,之后刷新頁面我們發(fā)現(xiàn)master2節(jié)點(diǎn)(原standy)自動變成了 active namenode遭赂。
六、安裝hbase
?
按照上圖下載正確的hbase版本(版本問題很重要横辆,是很多錯誤的根源)
# Hbase-0.96.2-hadoop2(啟動雙HMaster的配置撇他,master1是主HMaster,master2是從HMaster)
# 解壓Hbase-0.96.2-hadoop2-bin.tar.gz
? tar -zxvfhbase-0.96.2-hadoop2-bin.tar.gz
# 修改hbase-env.sh 文件
?[root@master conf]# vi hbase-env.sh
export JAVA_HOME=/usr/local/jdk
export HBASE_MANAGES_ZK=false
# 配置hbase-site.xml 文件
<configuration>
? ? ? ?<property>
? ? ? ? ? ? ? ?<name>hbase.rootdir</name>
? ? ? ? ? ? ? ?<value>hdfs://mycluster/hbase</value> <!-- 這里必須跟 core-site.xml 中的配置一樣 -->
? ? ? ?</property>
? ? ? ?<property>
? ? ? ? ? ? ? ?<name>hbase.cluster.distributed</name>
? ? ? ? ? ? ? ?<value>true</value>
? ? ? ?</property>
? ? ? ?<property>
? ? ? ? ? ? ? ?<name>hbase.tmp.dir</name>
? ? ? ? ? ? ? ?<value>/usr/local/hbase/tmp</value>
? ? ? ?</property>
? ? ? ?<property>
? ? ? ? ? ? ? ?<name>hbase.master</name>
? ? ? ? ? ? ? ?<value>60000</value> # 這里是對的,只配置端口困肩,為了配置多個 HMaster
? ? ? ? </property>
? ? ? ?<property>
? ? ? ? ? ? ? ?<name>hbase.zookeeper.quorum</name>
? ? ? ? ? ? ? ?<value>master1,master2,slave1,slave2,slave3,slave4,slave5</value>
? ? ? ?</property>
? ? ? ?<property>
? ? ? ? ? ? ? ?<name>hbase.zookeeper.property.clientPort</name>
? ? ? ? ? ? ? ? <value>2181</value>
? ? ? ?</property>
? ? ? ?<property>
? ? ? ? ? ? ? ?<name>hbase.zookeeper.property.dataDir</name>
? ? ? ? ? ? ? ?<value>/usr/local/zookeeper/data</value>
? ? ? ?</property>
</configuration>
# 配置regionservers
[root@master1conf]# vi regionservers
slave1
slave2
slave3
slave4
slave5
# 創(chuàng)建hdfs-site.xml的軟連接
?[root@master1conf]# ln /usr/local/hadoop/etc/hadoop/hdfs-site.xml hdfs-site.xml
# 啟動hbase
[root@master1hbase-0.96.2-hadoop2]# ./bin/start-hbase.sh
?[root@master1hbase-0.96.2-hadoop2]# jps
5131 Jps
4827 HRegionServer
4661 HMaster
6395 NodeManager
6272 DataNode
29849 QuorumPeerMain
# hbase shell 驗(yàn)證 1(查看hbase的版本跟狀態(tài))
hbase(main):003:0> list ?# 剛剛創(chuàng)建的表
hbase(main):004:0> version
0.96.2-hadoop2, r1581096, Mon Mar 24 16:03:18 PDT2014
hbase(main):005:0> status
5 servers, 0 dead, 0.8000 average load
# hbase shell 驗(yàn)證 2(建表插入數(shù)據(jù)獲取數(shù)據(jù)實(shí)時)
hbase(main):006:0> create'test','id','info'
0 row(s) in 0.4706 seconds
=> Hbase::Table - test
hbase(main):007:0> put'test','1314520','info:yousmile','forever’
hbase(main):008:0> get 'test,'1314520'
hbase(main):009:0> scan 'test' ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
# 在master2上啟動HMaster
[root@master2 bin]# ./hbase-daemon.sh start master
# 驗(yàn)證HMaster自動切換
# rs227上的日志查看
2014-07-03 15:43:47,798 INFO ?[master:rs227:60000] mortbay.log: StartedSelectChannelConnector@0.0.0.0:60010
2014-07-03 15:43:47,897 INFO ?[master:rs22760000]zookeeper.RecoverableZooKeeper: Node /hbase/master already exists and this isnot a retry
2014-07-03 15:43:47,898 INFO ?[master:rs227:60000]master.ActiveMasterManager: Adding ZNode for/hbase/backup-masters/rs227,60000,1402645426368 in backup master directory
2014-07-03 15:43:47,908 INFO ?[master:master2:60000] master.ActiveMasterManager:Another master is the active master, rs229,60000,1402645371520; waiting tobecome the next active master
這里說明zookeeper已經(jīng)接管了划纽,并且把master2作為一個備份的Hbase了,并且這里提示
waiting to become thenext active master (等待變成下一個活動的master)锌畸,然后我們可以將master1上的hmaster進(jìn)程給kill掉勇劣,當(dāng)然,也可以使用 ./hbase-daemon.shstop master 來結(jié)束master1上的hmaster進(jìn)程
只看紅色標(biāo)注的地方蹋绽,意思就是說當(dāng)我們 kill 掉 master1上的 hmaster 的時候芭毙, Nomaster available. Notifying waiting threads . A master is now available (找不到 master,喚醒等待的 hmaster 線程(認(rèn)識 96 )卸耘,然后找到了等待的 hmaster ( master2))退敦,然后 zookeeper 就接管并且將 master2上的 hmaster 從 等待 狀態(tài)切換為 激活 狀態(tài)了,然后就 ok 了蚣抗。(當(dāng)然也可以多開幾個備用的 hmaster )