hadoop環(huán)境搭建夏伊,初始如果只有一臺可用server虛擬機可單臺搭建hdfs環(huán)境。生產環(huán)境hdfs環(huán)境大都采用基于zookeeper實現的高可用集群環(huán)境搭建肴敛。
機器環(huán)境:
10.176.2.101 master
10.176.2.103 zjx03
10.176.2.105 zjx05
hadoop集群準備工作:
主機名設置(三臺機器均修改好需要的主機名署海,根據上篇大數據平臺環(huán)境搭建準備做過的不用再做)
vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=zjx05
需要進行切換用戶生效:
su - root
也可百度下設置用戶名和密碼,另外需要將進行網絡通信的主機名與ip加入/etc/hosts 医男。這里面配置的是其它主機的ip與主機名的映射砸狞,由此才可以通過主機名進行訪問。
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.176.2.101 master
10.176.2.103 zjx03
10.176.2.105 zjx05
10.176.2.111 yjy11
10.176.2.113 yjy13
10.176.2.115 yjy15
可以使用主機名進行測試:
ssh master date
用戶名創(chuàng)建(另兩臺機器也創(chuàng)建镀梭,用戶創(chuàng)建生產環(huán)境需要創(chuàng)建刀森,此處該步驟省略,均使用root用戶)
useradd -u 8000 hadoop
echo '123456' | passwd --stdin hadoop
給hadoop用戶增加sudo權限报账,增加內容(另外兩臺主機上都得配置)
vim /etc/sudoers
hadoop ALL=(ALL) ALL
主機互信(集群環(huán)境必備)
如果之前沒有生成過私鑰與秘鑰研底,使用下一個步驟生成私鑰與密鑰,生成文件在家目錄下透罢,此處在目錄/root/.ssh下
ssh-keygen -t rsa
cd /root/.ssh
ls
ls看到會有公鑰與私鑰文件:
id_rsa id_rsa.pub (其中id_rsa是私鑰榜晦,id_rsa.pub是公鑰)
cp id_rsa.pub authorized_keys (拷貝一個文件,注意此處是公鑰id_rsa.pub文件)
上述在另兩臺機器上同樣進行生成生成authorized_keys羽圃。
ssh 10.176.2.101 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh 10.176.2.103 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh 10.176.2.105 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
該操作類似于使用ssh-copy-id root命令操作
出于安全性考慮乾胶,將這個授權key文件賦予600權限:
chmod 600 ~/.ssh/authorized_keys
將這個包含了所有互信機器認證key的認證文件,分發(fā)到各個機器中去
scp ~/.ssh/authorized_keys 10.176.2.103:~/.ssh/
scp ~/.ssh/authorized_keys 10.176.2.105:~/.ssh/
驗證互信朽寞,各節(jié)點執(zhí)行下面命令识窿,能不輸入密碼顯示時間,配置成功
ssh 10.176.2.101 date;ssh 10.176.2.103 date;ssh 10.176.2.105 date;
檢測成功脑融,上述將authorized_keys分發(fā)復制到其它機器上也可以使用腳本(后續(xù)多臺集群可以參考喻频,此處可暫不用)
vi bulkcp.sh
#! /bin/bash
for((i=101;i<=105;i=i+2))
do
scp -r $1 10.176.2.$i:$2
echo scp -r $1 10.176.2.$i:$2
done
./bulkcp.sh ~/.ssh ~/.ssh
可參考:
https://www.cnblogs.com/jyzhao/p/3781072.html
關閉防火墻
service iptables stop(關閉)
chkconfig iptables off (永久關閉,使用永久關閉,三臺機器均操作)
service iptables status
可參考:
https://www.cnblogs.com/maybo/p/5250668.html
重啟網絡服務
service network restart
jdk安裝
考慮安裝hadoop(2.7版本),此處使用jdk8肘迎,經測兼容
下載jdk1.8oracle官網,1.8.191版本,將tar.gz包jdk1.8.0_191.tar.gz上傳至/usr/lib/java/目錄下甥温,此處目錄任意,為了方便管理上傳至此目錄妓布。
解壓
tar -zxvf jdk1.8.0_191.tar.gz
配置環(huán)境變量(環(huán)境變量配置窿侈,配置環(huán)境很常用,建議記住)
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_191
export PATH=$PATH:$JAVA_HOME/bin
刷新環(huán)境變量(記住該命令刷新環(huán)境變量)
source /etc/profile
將其拷貝至其它機器:
scp -r /usr/lib/java/jdk1.8.0_191 zjx03:/usr/lib/java/
scp -r /usr/lib/java/jdk1.8.0_191 zjx05:/usr/lib/java/
拷貝至另兩臺機器后也要類似配置環(huán)境變量然后source /etc/profile
hadoop相關下載地址:
zookeeper下載
http://archive.apache.org/dist/hadoop/zookeeper/
cdh版本下載
http://archive-primary.cloudera.com/cdh5/cdh/5/
apache hadoop版本:
https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
hadoop版本下載:
http://central.maven.org/maven2/org/apache/hadoop/
可以配置源下載安裝更便捷
hadoop安裝配置
mkdir -p /opt/softwares (用于后續(xù)存放zookeeper秋茫、hadoop等包)
下載好的zookeepertar.gz包上傳至該目錄(上傳至此目錄不放家目錄是由于開始本人linux虛擬機家目錄下分區(qū)只有2g):
zookeeper版本:zookeeper-3.4.5-cdh5.12.2
tar -zxvf zookeeper-3.4.5-cdh5.12.2.tar.gz
hadoop版本:hadoop-2.7.7
tar -zxvf hadoop-2.7.7.tar.gz
rm -rf zookeeper-3.4.5-cdh5.12.2.tar.gz
rm -rf hadoop-2.7.7.tar.gz (刪除tar.gz包節(jié)約空間)
cd /opt/softwares/hadoop-2.7.7
cd share/
rm -rf doc/ (刪除不必要的文件 一般是windows下的說明文件,節(jié)省空間)
cd ..
cd etc/
cd hadoop/
rm -rf *.cmd
1.單機版hadoop環(huán)境搭建
單機版搭建參考如下鏈接乃秀,可以直接看第3部分基于zookeeper的hadoop環(huán)境搭建如下配置肛著,只是配置文件內容有所差異圆兵,單機版相對更容易搭建
https://www.cnblogs.com/dulixiaoqiao/p/6939818.html
2.hadoop三臺集群搭建(未使用zookeeper實現高可用集群搭建)
參考下篇,該搭建較好枢贿,也主要是配置文件差異殉农,三者主要是對Secondary的高可用實現機制差異,推薦看第三種基于zookeeper的hadoop集群環(huán)境搭建(完整安裝):
https://www.cnblogs.com/winter1519/p/10201142.html
3.基于zookeeper的hadoop集群環(huán)境搭建
安裝配置zookeeper
cd /opt/softwares/zookeeper-3.4.5-cdh5.12.2/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
# dataDir=/tmp/zookeeper
#下述新增在注釋的dataDir后面
dataDir=/opt/softwares/zookeeper-3.4.5-cdh5.12.2/zkData
# 下述server配置放在該文件最末
server.1=master:2888:3888
server.2=zjx03:2888:3888
server.3=zjx05:2888:3888
dataDir=/opt/softwares/zookeeper-3.4.5-cdh5.12.2/zkData 這個下面是myid文件,必須這樣寫局荚,最后的添加2888端口是leader和flower之間通信的端口超凳,3888端口是flower之間選舉的端口。
mkdir /opt/softwares/zookeeper-3.4.5-cdh5.12.2/zkData
touch /opt/softwares/zookeeper-3.4.5-cdh5.12.2/zkData/myid
echo 1 > /opt/softwares/zookeeper-3.4.5-cdh5.12.2/zkData/myid
myid中的值和server.1,server.2,server.3中的對應應分別按照機器寫入1耀态,2轮傍,3),創(chuàng)建的文件夾zkData存儲zookeeper產生的數據(類似后續(xù)hadoop配置中創(chuàng)建的tmp文件夾衩匣,此處也可以創(chuàng)建為tmp)
將配置好的zookeeper拷貝到其它節(jié)點
scp -r /opt/softwares/zookeeper-3.4.5-cdh5.12.2 zjx03:/opt/softwares/
scp -r /opt/softwares/zookeeper-3.4.5-cdh5.12.2 zjx05:/opt/softwares/
修改zjx03田炭、zjx05機器節(jié)點上對應的myid
zjx03:
echo 2 > /opt/softwares/zookeeper-3.4.5-cdh5.12.2/zkData/myid
zjx05:
echo 3 > /opt/softwares/zookeeper-3.4.5-cdh5.12.2/zkData/myid
啟動zookeeper
cd /opt/softwares/zookeeper-3.4.5-cdh5.12.2/bin
./zkServer.sh start
./zkServer.sh status
后續(xù)停止zookeeper為./zkServer.sh stop
由于安裝于本機測試使用觅廓,每次需要停止集群(生產環(huán)境一般不會停止集群,只會對單個宕機的節(jié)點進行啟動修復)驰吓,此處將zookpeer配置環(huán)境變量,方便啟動系奉,同樣對另兩臺進行同樣配置
vim /etc/profile
export ZOOKEEPER_HOME=/opt/softwares/zookeeper-3.4.5-cdh5.12.2
export PATH=$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile
啟動zookeeper
zkServer.sh start
查看zookeeper狀態(tài)
zkServer.sh status
停止zookeeper
zkServer.sh stop
安裝配置hadoop
配置hdfs(hadoop2.x所有的配置文件都在HADOOP_HOME/etc/hadoop目錄下)
配置環(huán)境變量
vim /etc/profile
export HADOOP_HOME=/opt/softwares/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
安裝配置
cd /opt/softwares/hadoop-2.7.7/etc/hadoop
vim hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_191
vim core-site.xml
<configuration>
<!--單節(jié)點部署如下配置 -->
<!--
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
-->
<!--指定hdfs的nameservice為ns1-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!--指定hadoop臨時目錄-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/softwares/hadoop-2.7.7/data/tmp</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,zjx03:2181,zjx05:2181</value>
</property>
</configuration>
vim hdfs-site.xml
<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>master:9000</value>
</property>
<!-- nn1的http通信地址,有個管理界面用于下載文件 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>zjx03:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>zjx03:50070</value>
</property>
<!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;zjx03:8485;zjx05:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/softwares/hadoop-2.7.7/journal</value>
</property>
<!-- 開啟NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式,通過ConfiguredFailoverProxyProvider這個類實現自動切換 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制方法翁涤,多個機制用換行分割,即每個機制暫用一行瞬内,隔離機制sshfence的意思是:當一個namenode壞了迷雪,但還沒有宕機,這樣的話還處于active狀態(tài)虫蝶,為讓另一個namenode正常成為active,另外一個namenode會向壞掉的 namenode發(fā)一個命令把它殺掉章咧。shell(/bin/true)的意思是:如果active節(jié)點,完全宕機能真,那zkfc就不能匯報信息了赁严,這樣,standby很長時間收不到消息粉铐,當收不到消息時疼约,standby就啟動一個腳本,如果這個腳本返回true蝙泼,就會變成active-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間(active壞了之后程剥,standby如果沒有在30秒之內未連接上,那么standby將變成active) -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<!--下述兩個配置為單機版hadoop配置-->
<!--
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
-->
</configuration>
vim mapred-site.xml
<configuration>
<!-- 告訴hadoop以后MR運行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
vim yarn-env.xml
export JAVA_HOME=/usr/lib/java/jdk1.8.0_191
vim yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!--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>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>zjx03</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,zjx03:2181,zjx05:2181</value>
</property>
<!--reduce獲取數據時通過shuffle方式-->
<!--
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
-->
<!-- NodeManager獲取數據的方式是shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的老大(resourcemanager)的地址 -->
<!--
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
-->
</configuration>
vim slaves (用于指定集群在網絡中的主機節(jié)點有那些)
master
zjx03
zjx05
將配置好的hadoop拷貝到其他節(jié)點
scp -r /opt/softwares/hadoop-2.7.7 zjx03:/opt/softwares/
scp -r /opt/softwares/hadoop-2.7.7 zjx05:/opt/softwares/
配置完成汤踏,啟動织鲸,先啟動zookeeper(三臺機器均啟動zookeeper舔腾,此時查看zookeeper狀態(tài)會有l(wèi)eader與flower節(jié)點),再啟動hdfs
zkServer.sh start (三臺均啟動)
啟動驗證效果
hadoop-daemons.sh start journalnode (三臺均啟)
格式化hdfs(只需要格式化一次搂擦,后續(xù)啟動集群不用再格式化稳诚,不要格式化多次,多次格式化會造成namenodeId不一致瀑踢,需要刪除/opt/softwares/hadoop-2.7.7/data/tmp/下所有文件重新格式化才不報錯)
hdfs namenode -format
首次格式化后/opt/softwares/hadoop-2.7.7/data/tmp下的文件復制到另外兩個節(jié)點對應目錄下
scp -r /opt/softwares/hadoop-2.7.7/data/tmp zjx03:/opt/softwares/hadoop-2.7.7/data/
scp -r /opt/softwares/hadoop-2.7.7/data/tmp zjx05:/opt/softwares/hadoop-2.7.7/data/
格式化ZK(在master上執(zhí)行,若不能啟動結點再在其他機器上執(zhí)行扳还,作用是協(xié)助namenode進行高可靠,向zookeeper匯報)
hdfs zkfc -formatZK (同樣只需要格式化一次)
啟動zk
hadoop-daemon.sh start zkfc
啟動HDFS(master上執(zhí)行)
start-dfs.sh
啟動YARN(zjx03上執(zhí)行start-yarn.sh橱夭,把namenode和resourcemanager分開是因為性能問題氨距,因為他們都要占用大量資源,所以把他們分開了徘钥,分開了就要分別在不同的機器上啟動)
start-yarn.sh
啟動后效果如下:
jps查看集群進程如下
[root@master ~]# jps
2080 JournalNode
2417 DataNode
2982 Jps
2153 DFSZKFailoverController
2841 NodeManager
2313 NameNode
1994 QuorumPeerMain
[root@zjx03 ~]# jps
2289 ResourceManager
2145 DFSZKFailoverController
1826 JournalNode
1909 NameNode
1978 DataNode
2556 Jps
2397 NodeManager
1774 QuorumPeerMain
[root@zjx05 ~]# jps
1985 NodeManager
1747 JournalNode
1637 QuorumPeerMain
1829 DataNode
2118 Jps
頁面監(jiān)測:
http://10.176.2.101:50070
http://10.176.2.103:50070
hadoop 總有警告解決辦法:
vim /opt/softwares/hadoop-2.7.7/etc/hadoop/hadoop-env.sh
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/native"
hdfs與mapreduce測試
[root@master tmp]# hadoop fs -mkdir -p /tmp/zhoujixiang
[root@master tmp]# hadoop fs -ls /tmp/
[root@master tmp]# hdfs dfs -ls /tmp/
[root@master tmp]# cd /opt/softwares/hadoop-2.7.7/data/tmp
[root@master tmp]# touch test.txt
[root@master tmp]# vim test.txt
[root@master tmp]# hadoop fs -put ./test.txt /tmp/zhoujixiang/
19/01/19 11:56:56 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[root@master tmp]# hadoop fs -ls /tmp/zhoujixiang
19/01/19 11:57:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r-- 3 root supergroup 78 2019-01-19 11:56 /tmp/zhoujixiang/test.txt
[root@master tmp]# hadoop fs -cat /tmp/zhoujixiang/*
hello hadoop
hello hdfs
hello zookeeper
hello mapreduce
hello hdfs mapreduce
[root@master mapreduce]# hadoop fs -mkdir -p /tmp/zhoujixiang/input
[root@master mapreduce]# hadoop fs -mv /tmp/zhoujixiang/test.txt /tmp/zhoujixiang/input/
[root@master mapreduce]# hadoop fs -ls /tmp/zhoujixiang/input/
[root@master mapreduce]# hadoop jar /opt/softwares/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /tmp/zhoujixiang/input/test.txt /tmp/zhoujixiang/output/
[root@master mapreduce]# hadoop fs -cat /tmp/zhoujixiang/output/*
hadoop 1
hdfs 2
hello 5
mapreduce 2
zookeeper 1
[root@master mapreduce]# yarn application -list
至此已經安裝配置okay衔蹲,且做了簡單練習,各位老板看到這里辛苦了呈础!
經過安裝練習舆驶,結合hadoop架構,從而更好了解其整個架構體系而钞,包括從2.x的secondNameNode交給zookeeper集群管理沙廉,zookeeper的管理架構(zkfc、quoru)臼节。
后續(xù)啟動hdfs集群順序如下:
zkServer.sh start (三臺均啟)
hadoop-daemons.sh start journalnode (三臺均啟)
hadoop-daemon.sh start zkfc (master上啟動即可)
start-dfs.sh (master上啟動即可)
start-yarn.sh (zjx03節(jié)點啟動撬陵,非主節(jié)點啟動)
后續(xù)停止集群停止順序與啟動順序相反:
stop-yarn.sh (zjx03節(jié)點停止,在啟動節(jié)點上停止)
stop-dfs.sh (master節(jié)點停止网缝,在啟動節(jié)點上停止巨税,停止后其它server均停,除過zkServer)
zkServer.sh stop(三臺均停)
參考鏈接:
https://blog.csdn.net/a1275302036/article/details/75268862
https://blog.csdn.net/qq_30003943/article/details/83788377