hadoop2集群搭建詳解------------------------天津九安醫療電子--吳偉
一、需要軟件
Jdk1.8.0_linux
Hadoop-2.2.0(Apache官網Stable版本)
Hbase-0.96.2(與Hadoop-2.2.0是配套的,不用覆蓋jar包)
Zookeepr-3.4.5
# 集群結構圖
IP地址
主機名
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
是
否
是
否
是
否
二、基礎配置
1、配置hosts文件,方便hadoop用主機名訪問
vi /etc/hosts
2、設置ssh免密碼登錄
1) 進入 ~ 根目錄下的 ?.ssh 目錄(沒有的話,創建.ssh目錄)
2) 執行ssh-keygen -t ?rsa
3) ls ?產生倆個文件(每臺都要執行 )
?
id-rsa ? ? #私鑰 ?id-rsa.pub ? #公鑰
在每臺服務器上將公鑰復制到無需登錄的服務器上,在每一臺服務器上執ssh-copy-id的命令。
例如:
在192.168.12.109上執行
? ? ?
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
。。。。。
驗證:
ssh slave1
3、關閉防火墻(centos 7)
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動
4、安裝jdk
1)設置環境變量 ?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服務器集群規模不小于3個節點(必須是奇數個),要求各服務器之間系統時間要保持一致。
2. 在節點的/usr/local目錄下,解壓縮tar -zxvf ###。
3. 設置環境變量 vi /etc/profile ?增加ZOOKEEPER_HOME=~~~
? ?立即生效
Source /etc/profile
4. 在zk/conf目錄下,重命名文件 mv zoo_sample.cfg ?zoo.cfg
? ?編輯該文件,執行vi zoo.cfg
? 修改dataDir=/usr/local/zk/data ? ------------------存放數據目錄
? 新增:zk節點=對應的hadoop節點
? ? Server.1=master1:2888:3888
(一個是通信端口,一個是選舉端口)
? ? Server.2=master2:2888:3888?
? ?Server.3=slave1:2888:3888
。。。。。。
5 創建文件夾存放數據目錄mkdir /usr/local/zk/data
6 在data目錄下,創建文件myid,值為1
7 把zk目錄復制到其他節點
8 把其他節點中相應的myid的值改為2
9 啟動:
? 在三個節點上分別執行命令(在zk/bin下執行)zkServer.sh start
?執行后bin下多了zookeeper.out(日志)
10 檢驗,在三個節點上分別執行命令zkServer.sh status (leader或者follower)
時間同步
# yum install -y ntp ?#安裝ntp服務
# ntpdate cn.pool.ntp.org ?#同步網絡時間
四、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>【這里的路徑默認是NameNode、DataNode、JournalNode等存放數據的公共目錄。用戶也可以自己單獨指定這三類節點的目錄。】?
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.nameservices</name>
? ? ? ? ? ? ? <value>mycluster</value>
? ? ? ?</property>
【NameService實際就是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集群的地址和端口。注意,數量一定是奇數,且不少于三個節點】?
</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是否啟動自動故障恢復,即當NameNode出故障時,是否自動切換到另一臺NameNode】
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.client.failover.proxy.provider.mycluster</name>
? ? ? ?<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
? ? ? ?</property>
【指定mycluster出故障時,哪個實現類負責執行故障切換】?
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.ha.fencing.methods</name>
? ? ? ? ? ? ? <value>sshfence</value>
? ? ? ?</property>
【一旦需要NameNode切換,使用ssh方式進行操作】?
? ? ? ?<property>
? ? ? ? ? ? ? <name>dfs.ha.fencing.ssh.private-key-files</name>
? ? ? ? ? ? ? <value>/root/.ssh/id_rsa</value>
? ? ? ?</property>
【如果使用ssh進行故障切換,使用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的副本數量。默認值是3個,我們現在有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>
【指定運行mapreduce的環境是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的地址,還是單點,這是隱患】
</configuration>
# 7修改slaves配置文件
master1
master2
slave1
slave2
slave3
slave4
slave5
【指定所有的DataNode節點列表,每行一個節點名稱】
五、啟動集群
1、啟動Zookeeper集群
在usr/local/zk/bin 目錄下
執行啟動命令:zkServer.sh start
# 驗證Zookeeper是否啟動成功1
查看狀態命令:zkServer.sh status?
在 master1上查看 zookeeper 的狀態發現是 leader
在其他的機器上查看 zookeeper 的狀態發現是 follower
#驗證Zookeeper是否啟動成功2
在usr/local/zk/bin 目錄下
執行進入命令行命令:
zkCli.sh
Connecting to localhost:2181
?[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1]
出現這樣的提示的話,那么 zookeeper 就啟動成功了
2、格式化ZooKeeper集群,目的是在ZooKeeper集群上建立HA的相應節點。
在usr/local/hadoop/bin 目錄下
執行命令: hdfs zkfc -formatZK
# 驗證zkfc是否格式化成功
進入客戶端 zkCli.sh?
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha?
[mycluster]?
【格式化操作的目的是在ZK集群中建立一個節點,用于保存集群c1中NameNode的狀態數據】
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的數據同步到master2中去,需要在master2上執行hadoop的命令
[root@rs227 sbin]# ../bin/hdfs namenode -bootstrapStandby
[root@rs227 sbin]# ./hadoop-daemon.sh start namenode
# 打開瀏覽器,訪問master1跟master2的50070端口
如果都能訪問到,說明你 namenode 啟動成功了,并且這兩個 namenode 都是 standby 狀態
# namenode ( master1)轉換成 active (這里不需要手動將 namenode 轉換為 active 狀態了,因為我們是交給 Zookeeper 管理,在后面會啟動 ZooKeeperFailoverController )
# 啟動所有的 datanodes(在master1上執行命令)
[root@master1sbin]# ./hadoop-daemons.sh start datanode
?[root@master1sbin]# jps
25627 Jps
24037 NameNode
25168 DataNode
23343 JournalNode
29367 QuorumPeerMain
# 實驗一下手動切換 namenode 的狀態 (這里也不需要做, Zookeeper 管理的,自動切換,下面會講到)
# yarn啟動
[root@master1sbin]# ./start-yarn.sh
starting yarn daemons
# 訪問master1的8088端口查看ResourceManager的UI界面
?
# 啟動ZooKeeperFailoverController
#在master1上執行命令
[root@master1sbin]# ./hadoop-daemon.sh start zkfc
#在master2上執行命令
[root@master2 sbin]# ./hadoop-daemon.sh start zkfc
# 打開瀏覽器,再訪問master1跟master2的50070端口
發現 master1變成 active 狀態了,而 master2還是 standby 狀態
# 驗證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
# 驗證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
…( 不重要的部分就省略了,能出這個值就是對的,虛擬機可能會卡著不動,也可能會卡死,屬于正常現象,內存消耗比較大 )
Job Finished in 25.361 seconds
valueof Pi is 3.14800000000000000000
# 驗證HA高可用性,是否自動故障轉移
在master1節點active namenode上執行 jps ,確定namenode進程,kill 將其殺掉,之后刷新頁面我們發現master2節點(原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
# 創建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 驗證 1(查看hbase的版本跟狀態)
hbase(main):003:0> list ?# 剛剛創建的表
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 驗證 2(建表插入數據獲取數據實時)
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
# 驗證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已經接管了,并且把master2作為一個備份的Hbase了,并且這里提示
waiting to become thenext active master (等待變成下一個活動的master),然后我們可以將master1上的hmaster進程給kill掉,當然,也可以使用 ./hbase-daemon.shstop master 來結束master1上的hmaster進程
只看紅色標注的地方,意思就是說當我們 kill 掉 master1上的 hmaster 的時候, Nomaster available. Notifying waiting threads . A master is now available (找不到 master,喚醒等待的 hmaster 線程(認識 96 ),然后找到了等待的 hmaster ( master2)),然后 zookeeper 就接管并且將 master2上的 hmaster 從 等待 狀態切換為 激活 狀態了,然后就 ok 了。(當然也可以多開幾個備用的 hmaster )