前言:Hadoop主要有兩種安裝方式播聪,即傳統(tǒng)解壓包方式和Linux標(biāo)準(zhǔn)方式椒振。相對來說昭伸,標(biāo)準(zhǔn)Linux部署方式簡單易用,而傳統(tǒng)部署方式則繁瑣易錯澎迎;標(biāo)準(zhǔn)部署方式隱藏了很多細(xì)節(jié)庐杨,而傳統(tǒng)解壓包方式有助于讀者深入理解Hadoop原理选调。建議先學(xué)習(xí)傳統(tǒng)部署方式再來學(xué)習(xí)這個標(biāo)準(zhǔn)部署方式。
實驗環(huán)境:
虛擬機: VMware Workstation Pro灵份,
Linux版本: CentOS 8仁堪,? ?
JDK版本:1.8.0,
hadoop版本: hadoop-2.10.0(先在虛擬機里下載好)填渠,
虛擬機安裝時弦聂,如果本身物理機內(nèi)存條和硬盤容量都不大,建議內(nèi)存2G氛什,硬盤5G莺葫,就夠了。否則運行起來會非城姑迹卡捺檬。甚至常常黑屏無法啟動。
集群環(huán)境設(shè)計:
Hadoop各結(jié)點設(shè)計:
小技巧:執(zhí)行命令需要管理員權(quán)限時瑰谜,可直接在前加上sudo欺冀,這樣就可以管理員身份執(zhí)行了树绩;如果編輯部分系統(tǒng)文件時萨脑,無法用“:wq!”更改保存,可以先:q退出,用sudo vi 來編輯文件饺饭。
0.修改機器名hostname
首先我們安裝完VM渤早,安裝完CentOS8之后,打開linux瘫俊,進入命令行終端進行配置鹊杖,
修改機器名
sudo hostnamectl set-hostname cMaster
顯示機器信息:
hostnamectl
1. jdk安裝
一步安裝及配置jdk (僅適用于CentOS),在linux命令行端口扛芽,輸入
sudo yum install java-1.8.0-openjdk* -y
?然后輸入root用戶密碼即可安裝(安裝VM時設(shè)置的root密碼)
接著往下輸入
java -version
會顯示版本信息時即為成功骂蓖,
??而此時yum 安裝的jdk位置為 /usr/lib/jvm/java-1.8.0,我們再進行jdk環(huán)境變量配置川尖,輸入
vi /etc/profile
在文件底端添加以下信息(JAVA_HOME=安裝路徑登下,如果不同需要根據(jù)自己的實際安裝路徑更改)
?#set java environment ?
?export JAVA_HOME=/usr/lib/jvm/java
?export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
?export PATH=$PATH:$JAVA_HOME/bin
(輸入:wq!)保存并退出之后,再輸入
source /etc/profile
使得配置的更改生效
此時叮喳,當(dāng)輸入
echo $JAVA_HOME
顯示路徑/usr/lib/jvm/java-1.8.0的時候被芳,配置已經(jīng)成功。
2.集群環(huán)境的共性配置
2.1修改虛擬子網(wǎng)ip
2.2修改網(wǎng)絡(luò)配置文件ens33
(如果你的機器網(wǎng)絡(luò)服務(wù)名稱不是ens33的畔濒,可以輸入ifconfig,第一個英文就是對應(yīng)的了)
vi /etc/sysconfig/network-scripts/ifcfg-ens33
更新網(wǎng)絡(luò)配置 查看結(jié)果
sudo nmcli c reload
sudo nmcli c down ens33
sudo nmcli c up ens33
2.3虛擬機克隆
2.3.1克隆機器
2.3.2 重新生成MAC機器地址
在兩臺hadoop2嗤攻,hadoop3克隆虛擬機上重新生成MAC地址
2.3.3 修改新機器的網(wǎng)絡(luò)配置?
在兩臺虛擬機上,都要進行修改機器名hostname和修改網(wǎng)絡(luò)配置文件ens33的步驟诽俯,機器名和ipaddr分別如文章開頭的集群設(shè)計表所示妇菱。如hadoop2上,
sudo hostnamectl set-hostname cSlave0
vi /etc/sysconfig/network-scripts/ifcfg-ens33? #ipaddr是192.168.58.130
sudo nmcli c reload
sudo nmcli c down ens33
sudo nmcli c up ens33
再在三臺機器上暴区,設(shè)置hosts映射表
vi /etc/hosts
之后可以在三臺機器上執(zhí)行ping命令闯团,檢驗是否互通了。如在(hadoop1)cMaster上執(zhí)行(Ctrl + C 可停止ping操作)
ping cSlave0
3. 設(shè)置免密碼登陸(三臺機器都需要進行分別設(shè)置)
3.1 創(chuàng)建hadoop用戶?
創(chuàng)建?hadoop?用戶(需要root權(quán)限仙粱,我設(shè)置的密碼是簡單的一個空格“space”)
sudo useradd hadoop
sudo passwd hadoop
3.2修改用戶?hadoop?的權(quán)限
(用戶權(quán)限的修改需要在 /etc/sudoers 下配置, 將 hadoop 的權(quán)限修改最高ALL)
sudo vi /etc/sudoers
hadoop? ? ALL=(ALL)? ? NoPASSWD:ALL
3.3 切換到 hadoop用戶
su hadoop
3.4免密碼登陸設(shè)置
生成公鑰(要求輸入設(shè)置密碼時直接回車就是無密碼登錄了)
ssh-keygen -t rsa
將公鑰拷貝到其他兩臺機器(期間要求輸入的密碼是hadoop的用戶密碼)
ssh-copy-id hadoop@cSlave0
ssh-copy-id hadoop@cSlave1
3.5 ssh登錄測試(登錄其他兩臺機器,再回來本機)
ssh hadoop@cSlave0
ssh hadoop@cSlave1
ssh hadoop@cMaster
4. hadoop安裝與配置
4.1 安裝hadoop
????4.1.1 新建hadoop的安裝目錄伐割,設(shè)置hadoop用戶對 /usr/local/src和?/usr/local/hadoop 的權(quán)限, -R 表示級聯(lián)設(shè)置
cd /usr/local
sudo chown -R hadoop:hadoop /usr/local/src
sudo mkdir hadoop
sudo chown -R hadoop:hadoop hadoop
ll
????4.1.2 將hadoop壓縮文件設(shè)置為 可執(zhí)行文件
(這里的壓縮包在克隆以前已經(jīng)下載到了/home/hadoop/下載目錄下)
sudo chmod +x hadoop-2.7.5.tar.gz
????4.1.3 解壓hadoop配置包
????4.1.4 配置環(huán)境變量
vi /etc/profile
export HADOOP_HOME="/usr/local/hadoop/hadoop-2.10.0"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
source /etc/profile
????4.1.5 查看結(jié)果:
echo $HADOOP_HOME
4.2 配置cMaster的hadoop
(下面的操作為:先配置其中一臺機器(如cMaster的)文件,然后直接復(fù)制到其他兩臺機器再修改隔心,否則每臺機器都要敲的話白群,容易敲錯)
????4.2.1? 編輯hadoop-env.sh?
vi ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
這個地方 JAVA_HOME為你安裝jdk的時候的 JAVA_HOME
"/usr/lib/jvm/java-1.8.0"
????4.2.2 編輯core-site.xml
vi ${HADOOP_HOME}/etc/hadoop/core-site.xml
<property>
? ? ? ? <name>fs.defaultFS</name>
? ? ? ? <value>hdfs://cMaster:8020</value>
</property>
<property>
? ? ? ? <name>hadoop.tmp.dir</name>
? ? ? ? <value>/opt/data/tmp</value>
</property>
<property>
? ? ? ? <name>dfs.namenode.name.dir</name>
? ? ? ? <value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
<property>
? ? ? ? <name>dfs.datanode.data.dir</name>
? ? ? ? <value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
????4.2.3 創(chuàng)建tmp帜慢、NameNode和DataNode目錄,并且給hadoop用戶設(shè)置權(quán)限
sudo mkdir -p /opt/data/tmp
sudo mkdir -p /opt/data/tmp/dfs/name
sudo mkdir -p /opt/data/tmp/dfs/data
sudo chown -R hadoop:hadoop /opt/data/tmp
sudo chown -R hadoop:hadoop /opt/data/tmp/dfs/name
sudo chown -R hadoop:hadoop /opt/data/tmp/dfs/data
????4.2.4 編輯hdfs-site.xml,將cSlave1設(shè)置為secondary name node唯卖。
vi ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
<property>
? <name>dfs.namenode.secondary.http-address</name>
? <value>cSlave1:50090</value>
</property>
????4.2.5 編輯slaves粱玲,設(shè)置三臺機器為datanode
vi ${HADOOP_HOME}/etc/hadoop/slaves
cMaster
cSlave0
cSlave1
????4.2.6 編輯yarn-site.xml,將cSlave0設(shè)置為resource manager
vi ${HADOOP_HOME}/etc/hadoop/yarn-site.xml
<property>
? ? ? ? <name>yarn.nodemanager.aux-services</name>
? ? ? ? <value>mapreduce_shuffle</value>
</property>
<property>
? ? ? ? <name>yarn.log-aggregation-enable</name>
? ? ? ? <value>true</value>
</property>
<property>
? ? ? ? <name>yarn.resourcemanager.hostname</name>
? ? ? ? <value>cSlave0</value>
</property>
<property>
? ? ? ? <name>yarn.log-aggregation.retain-seconds</name>
? ? ? ? <value>106800</value>
</property>
<property>
? ? ? ? <description>The http address of th RM web application.</description>
? ? ? ? <name>yarn.resourcemanager.webapp.address</name>
? ? ? ? <value>cSlave0:8088</value>
</property>
????4.2.7 編輯mapred-site.xml,將cSlave1設(shè)置為job history server
cd ${HADOOP_HOME}
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
vi ${HADOOP_HOME}/etc/hadoop/mapred-site.xml
<property>
? ? ? ? ? ? ? ? <name>mapreduce.framework.name</name>
? ? ? ? ? ? ? ? <value>yarn</value>
? ? ? ? </property>
? ? ? ? <property>
? ? ? ? ? ? ? ? <name>mapreduce.jobhistory.address</name>
? ? ? ? ? ? ? ? <value>cSlave1:10020</value>
? ? ? ? </property>
? ? ? ? <property>
? ? ? ? ? ? ? ? <name>mapreduce.jobhistory.webapp.address</name>
? ? ? ? ? ? ? ? <value>cSlave1:19888</value>
? ? ? ? </property>
4.3 給cSlave0拜轨、cSlave1分發(fā)Hadoop配置
????4.3.1 分別在cSlave0抽减、cSlave1創(chuàng)建hadoop、tmp橄碾、nanmenode和datanode目錄卵沉。
sudo mkdir hadoop?
sudo mkdir -p /opt/data/tmp
sudo mkdir -p /opt/data/tmp/dfs/name
sudo mkdir -p /opt/data/tmp/dfs/data
sudo chown -R hadoop:hadoop hadoop?
sudo chown -R hadoop:hadoop /opt/data/tmp
sudo chown -R hadoop:hadoop /opt/data/tmp/dfs/name
sudo chown -R hadoop:hadoop /opt/data/tmp/dfs/data
4.3.2 將cMaster的hadoop安裝目錄下的文件拷貝到cSlave0、cSlave1
該步驟需要較長時間(20min左右)堪嫂,請耐心等待
scp -r ${HADOOP_HOME}/ cSlave0:/usr/local/hadoop
scp -r ${HADOOP_HOME}/ cSlave1:/usr/local/hadoop
4.3.3 在cMaster上格式化namenode(不要二次格式化偎箫,執(zhí)行一次即可,否則datanode自行查貼解決)
cd ${HADOOP_HOME}
./bin/hdfs namenode -format
4.4 啟動hadoop
????4.4.1 關(guān)閉三臺機器的防火墻.
sudo systemctl stop firewalld.service
????4.4.2 在cMaster上啟動 dfs
cd ${HADOOP_HOME}/sbin
?./start-dfs.sh
????4.4.3 在cSlave0上 啟動 yarn
cd ${HADOOP_HOME}/sbin
?./start-yarn.sh
????4.4.4 在cSlave1 啟動 history server
cd ${HADOOP_HOME}/sbin
mr-jobhistory-daemon.sh start historyserver
5 .Hadoop部署結(jié)果驗證
5.1 查看HDFS頁面:
http://cMaster:50070
5.2 查看YARN Web 頁面
http://cSlave0:8088/cluster
5.3 測試job
運行MapReduce程序 wordCount皆串,編輯測試文件,隨便寫幾個單詞或者一句英文
sudo vi /opt/data/wc.input
Future astronauts could travel with emotional support robots.
在HDFS上創(chuàng)建目錄并上傳wc.input
cd ${HADOOP_HOME}/bin
./hdfs dfs -mkdir /input
./hdfs dfs -put /opt/data/wc.input /input/wc.input
運行wordcount
? ./yarn jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.0.jar wordcount /input/wc.input /output
結(jié)果查看:????
./hdfs dfs -ls /output
./hdfs dfs -cat /output/part-r-00000
部署成功(撒花)
參考文章:
1.Hadoop 環(huán)境搭建 全集 超詳細(xì), 新手必看
4.《云計算(第三版)劉鵬 主編》電子工業(yè)出版社
5.關(guān)于虛擬機VMware Workstation Pro繁忙的解決方法
7.關(guān)于Hadoop進行namenode格式化時ERROR conf.Configuration: error parsing conf xxx.xml錯誤的問題
8.
(補充)部分問題:
1.網(wǎng)絡(luò)不可用淹办,檢查靜態(tài)ip設(shè)置無問題,但是ping不通恶复,網(wǎng)頁打不開
有可能是NATService被關(guān)閉了
2.啟動dfs的時候怜森,密碼還沒輸入就彈出了信息
等待的過程中速挑,啟動消息遲遲不打印,可以按一個回車
3.jps查看到datanode沒有啟動
原因可能是datanode二次格式化導(dǎo)致的版本id不一樣副硅,需要統(tǒng)一id才能夠同時啟動姥宝。
hadoop的升級功能需要datanode在它的版本文件里存儲一個永久性的clusterID,當(dāng)datanode啟動時會檢查并匹配namenode的版本文件里的clusterID恐疲,如果兩者不匹配腊满,就會出現(xiàn)"Incompatible clusterIDs"的異常。
每次格式化namenode都會生成一個新的clusterID, 如果只格式化了namenode培己,沒有格式化此datanode碳蛋, 就會出現(xiàn)”java.io.IOException: Incompatible namespaceIDs“異常。
所以現(xiàn)在修改統(tǒng)一clusterID省咨,
cd /opt/data/tmp/dfs/data/current
vi VERSION
然后再查看再啟動一次datanode
start-dfs.sh