一、環(huán)境安裝
3臺服務(wù)器的搭建瞬逊,為了好描述我把服務(wù)器的地址分成hadoop1显歧、hadoop2、hadoop3,
實(shí)際生產(chǎn)環(huán)境可以用域名來代替确镊。
注意:配置里面盡量用域名士骤,不要用IP,因?yàn)槲以?jīng)用IP配置出現(xiàn)了主機(jī)服務(wù)器聯(lián)系不上從者服務(wù)器
集群規(guī)劃:
主機(jī)名 | hdfs主服務(wù)器蕾域,即namenode | hdfs備用主服務(wù)器拷肌,也是namenode | hdfs從服務(wù)器,即datanode | zookeeper服務(wù)器 | yarn主服務(wù)器,即resourcemanager | yarn備用主服務(wù)器巨缘,resourcemanager | yarn從服務(wù)器厢绝,即nodemanager | hbase主服務(wù)器,即hmaster | hbase備用服務(wù)器带猴,也是hmaster | hbase從服務(wù)器昔汉,即hslave |
---|---|---|---|---|---|---|---|---|---|---|
hadoop1 | 是 | 否 | 是 | 是 | 否 | 否 | 是 | 是 | 否 | 是 |
hadoop2 | 否 | 是 | 是 | 是 | 是 | 否 | 是 | 否 | 是 | 是 |
hadoop3 | 否 | 否 | 是 | 是 | 否 | 是 | 是 | 否 | 否 | 是 |
1、前提工作
1.1準(zhǔn)備好服務(wù)器
如果是線上也就是有萬網(wǎng)DNS域名解析的服務(wù)器的話忽略以下操作拴清。
本地的話靶病,自己修改本機(jī)的DNS域名解析文件,在各個(gè)linux服務(wù)器下的/etc/host文件中
vim /etc/host
追加
IP+域名
例如圖1.1(a)
1.2相關(guān)安裝包下載
jdk1.7
linux 準(zhǔn)備3臺服務(wù)器hadoop1口予、hadoop2娄周、hadoop3
hadoop-2.7.3(http://apache.fayea.com/hadoop/common/)
zookeeper-3.4.5(http://apache.fayea.com/zookeeper/)
hbase-1.2.6(http://apache.fayea.com/hbase/)
1.3SSH免密碼登錄
由于hadoop各組件分布式集群,需要主機(jī)通過SSH協(xié)議啟動從者服務(wù)器沪停,設(shè)置免密碼登錄煤辨,減少工作量
1.3.1配置hadoop1到hadoop1、hadoop2木张、hadoop3的免密碼登陸
#在hadoop1上生產(chǎn)一對鑰匙
ssh-keygen -t rsa
輸入上面的指令众辨,然后一直按enter就行了
#將公鑰拷貝到其他節(jié)點(diǎn),包括自己
ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3
1.3.2配置hadoop2到hadoop1舷礼、hadoop2鹃彻、hadoop3的免密碼登陸
#在hadoop2上生產(chǎn)一對鑰匙
ssh-keygen -t rsa
#將公鑰拷貝到其他節(jié)點(diǎn)
ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3
2.安裝配置zookeeper集群(在hadoop1服務(wù)器上)
2.1解壓zookeeper安裝包
假設(shè)在linux的/root下,那么zookeeper根目錄是/root/zookeeper-3.4.5
2.2修改配置
2.2.1修改zoo.cfg配置文件
cd /root/zookeeper-3.4.5/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改:
dataDir=/root/zookeeper-3.4.5/tmp
添加:
dataLogDir=/root/zookeeper-3.4.5/log
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
2888是zookeeper相互通信的端口妻献,3888是zookeeper與其他應(yīng)用通信的端口,
2181是zookeeper客戶端通信的端口
保存退出
2.2.2為該服務(wù)器上的zookeeper指定id
在zookeeper根目錄創(chuàng)建一個(gè)tmp文件夾
mkdir /root/zookeeper-3.4.5/tmp
再創(chuàng)建一個(gè)空文件
touch /root/zookeeper-3.4.5/tmp/myid
最后向該文件寫入ID
echo 1 > /root/zookeeper-3.4.5/tmp/myid
也就是為該服務(wù)器的zookeeper指定了id是1(其他服務(wù)器的id不能一樣)
2.2.3將配置好的zookeeper拷貝到其他節(jié)點(diǎn)
scp -r /root/zookeeper-3.4.5/ hadoop2:/root/
scp -r /root/zookeeper-3.4.5/ hadoop3:/root/
注意:修改hadoop2蛛株、hadoop3對應(yīng)/root/zookeeper-3.4.5/tmp/myid內(nèi)容
hadoop2:
echo 2 > /root/zookeeper-3.4.5/tmp/myid
hadoop3:
echo 3 > /root/zookeeper-3.4.5/tmp/myid
啟動zookeeper,看看部署成功沒育拨。
分別啟動hadoop1谨履、hadoop2、hadoop3服務(wù)器的zookeeper
/root/zookeeper-3.4.5/bin/zkServer.sh start
使用jps指令可以看到圖2.2.3(a)
啟動完畢熬丧,等待片刻笋粟,分別在hadoop1、hadoop2锹引、hadoop3服務(wù)器執(zhí)行命令
/root/zookeeper-3.4.5/bin/zkServer.sh status
查看zookeeper狀態(tài)圖2.2.3(b)與圖2.2.3(c)
會出現(xiàn)其中一臺是leader矗钟,也就是zookeeper的主服務(wù)器,而其他服務(wù)器都是follower則是從服務(wù)
器嫌变,就說明zookeeper分布式協(xié)調(diào)服務(wù)器啟動成功了,就可以進(jìn)行下一步躬它,部署hadoop集群了腾啥。
3.安裝Hadoop集群
我這里是用root權(quán)限,hadoop的目錄路徑為:
/root/hadoop
3.1配置HDFS
hadoop2.x所有的配置文件都在$HADOOP_HOME/etc/hadoop目錄下
3.1.1將hadoop添加到環(huán)境變量中
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_55 #這是我的java路徑,修改成你的java根目錄路徑就行了
export HADOOP_HOME=/root/hadoop #同樣改成自己的hadoop根目錄路徑
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
#hadoop2.x的配置文件全部在$HADOOP_HOME/etc/hadoop下
cd /root/hadoop/etc/hadoop
3.1.2修改hadoop-env.sh
vim hadoop-env.sh
找到:
export JAVA_HOME=XXX
改為:
export JAVA_HOME=/usr/java/jdk1.7.0_55
3.1.3修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop臨時(shí)目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
3.1.4修改hdfs-site.xml
3.1.4修改hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice為ns1倘待,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有兩個(gè)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>hadoop1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop2:50070</value>
</property>
<!-- 指定NameNode的元數(shù)據(jù)在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數(shù)據(jù)的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/root/hadoop/journaldata</value>
</property>
<!-- 開啟NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實(shí)現(xiàn)方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機(jī)制方法凸舵,多個(gè)機(jī)制用換行分割祖娘,即每個(gè)機(jī)制暫用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔離機(jī)制時(shí)需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機(jī)制超時(shí)時(shí)間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
3.1.5修改mapred-site.xml
<configuration>
<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.1.6修改yarn-site.xml
<configuration>
<!-- 開啟RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分別指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop3</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
3.1.6修改slaves
(slaves是指定子節(jié)點(diǎn)的位置,因?yàn)橐趆adoop1上啟動HDFS啊奄、在hadoop2啟動yarn,所以hadoop1上的slaves文件指定的是datanode的位置,hadoop2上的slaves文件指定的是nodemanager的位置)
vim slaves
在文件中追加以下內(nèi)容
hadoop1
hadoop2
hadoop3
3.1.7拷貝配置好的hadoop到其他服務(wù)器
scp -r /root/hadoop/ hadoop2:/root/
scp -r /root/hadoop/ hadoop3:/root/
3.2啟動hadoop集群
3.2.1啟動journalnode
/root/hadoop/sbin/hadoop-daemon.sh start journalnode
#運(yùn)行jps命令檢驗(yàn)浪汪,hadoop1判没、hadoop2、hadoop3上多了JournalNode進(jìn)程
這一步是為了可以格式化namenode
3.2.2格式化hdfs
#在hadoop1上執(zhí)行命令:
hdfs namenode -format
#格式化后會在根據(jù)core-site.xml中的hadoop.tmp.dir配置生成個(gè)文件庄新,這里我配置的是/root/hadoop/tmp鞠眉,然后將/root/hadoop/tmp拷貝到hadoop2的/root/hadoop/下。
scp -r /root/hadoop/tmp/ hadoop2:/root/hadoop/
#也可以這樣择诈,建議hdfs namenode -bootstrapStandby
3.2.3格式化ZKFC(在hadoop1上執(zhí)行即可)
hdfs zkfc -formatZK
3.2.4啟動HDFS(在hadoop1上執(zhí)行)
/root/hadoop/sbin/start-dfs.sh
3.2.5啟動YARN
(#####注意#####:是在hadoop2上執(zhí)行start-yarn.sh械蹋,如何可以的話把namenode和resourcemanager分開,不要放同一個(gè)服務(wù)器中羞芍,因?yàn)樗麄兌家加么罅抠Y源朝蜘,他們分開了就要分別在不同的機(jī)器上啟動)
在hadoop2上執(zhí)行
/root/hadoop/sbin/start-yarn.sh
然后在hadoop3上執(zhí)行
/root/hadoop/sbin/yarn-daemon.sh start resourcemanager
3.2.6查看是否成功
使用jps查看相關(guān)進(jìn)程(圖3.2.6(a,b,c))
hadoop1:
hadoop2:
hadoop3:
訪問http://hadoop1:50070
看到active,說明這是活躍的namenode主服務(wù)器
訪問http://hadoop2:50070
看到這個(gè)是standby涩金,說明它是備胎谱醇,hadoop1的namenode掛掉,hadoop2就會頂上
如果看到圖3.2.6(f)
說明hdfs集群成功
4.HBASE集群步做,集成到HADOOP中
這一步在hadoop1上執(zhí)行
4.1修改HBASE配置
配置hbase集群副渴,要修改3個(gè)文件(首先zk集群已經(jīng)安裝好了)
4.1.1把hadoop配置文件復(fù)制過來
我的hbase路徑是/root/hbase/
注意:要把hadoop的hdfs-site.xml和core-site.xml 拷貝到/root/hbase/conf下
4.1.2修改hbase-env.sh
找到
export JAVA_HOME=/usr/java/jdk1.7.0_55 #改成你的jdk根目錄
export HBASE_CLASSPATH=/root/hadoop/etc/hadoop #改成你的hadoop目錄下的etc/hadoop目錄
export HBASE_LOG_DIR=/root/hbase/logs #設(shè)置hbase的日志所在目錄
export HBASE_MANAGES_ZK=false #因?yàn)槟J(rèn)會使用hbase自帶的zookeeper,需要告訴hbase使用外部的zookeeper全度,也就是第一步配置好的zookeeper
4.1.3修改hbase-site.xml
該配置文件是hbase核心配置文件
vim hbase-site.xml
<configuration>
<!-- 指定hbase在HDFS上存儲的路徑 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址煮剧,多個(gè)用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
4.1.3修改regionservers
該文件決定了hbase的從節(jié)點(diǎn)
vim regionservers
追加以下內(nèi)容
hadoop1
hadoop2
hadoop3
4.1.4拷貝hbase到其他節(jié)點(diǎn)
scp -r /root/hbase/ hadoop2:/root/
scp -r /root/hbase/ hadoop3:/root/
將配置好的HBase拷貝到每一個(gè)節(jié)點(diǎn)并同步時(shí)間(hbase每個(gè)節(jié)點(diǎn)的時(shí)間不要大于30秒)。
4.2啟動hbase
注意zookeeper和hadoop必須啟動著将鸵,因?yàn)閔base依賴zookeeper進(jìn)行集群勉盅,而我們的配置文件是使用外部的zookeeper,另外hbase是以hdfs作為分布式文件系統(tǒng)
啟動hbase顶掉,在主節(jié)點(diǎn)上運(yùn)行:
/root/hbase/bin/start-hbase.sh
4.2.1為保證集群的可靠性草娜,要啟動多個(gè)HMaster(在hadoop2上執(zhí)行)
/root/hbase/bin/hbase-daemon.sh start master
4.2.1通過瀏覽器訪問hbase管理頁面
hadoop1:16010
說明hbase啟動成功,就可以使用hbase shell來當(dāng)成數(shù)據(jù)庫使用
注意:
搭建hadoop相關(guān)集群痒筒,需要把防火墻給關(guān)閉了宰闰。因?yàn)橛写罅客ㄓ嵍丝诓绻螅蚼apreduce會產(chǎn)生一些隨機(jī)端口,所以hadoop的搭建需要關(guān)閉防火墻移袍,關(guān)閉防火墻就出現(xiàn)安全性問題解藻,所以hadoop適合在內(nèi)網(wǎng)中使用!
非要啟動防火墻的話葡盗,需要開放其中大量的端口防火墻白名單