一、硬件環境
假設有4台機,IP及主機名如下:
192.168.100.105 c1 192.168.100.110 c2 192.168.100.115 c3 192.168.100.120 c4
二、軟件環境
操作系統:Ubuntu Server 18.04
JDK:1.8.0
Hadoop:3.3.0/3.3.1
* 這里的ZooKeeper、Hadoop根目錄都放在/home/目錄下
三、部署規划
1.組件規划
* 以下是較合理的規划,但由於本文的操作部分是較早之前寫好的,沒按這份規划,先湊合着搭建了測試吧,熟悉后再自行調整。
組件說明:
DataNode:儲存數據的節點,定時發送心跳包和數據塊信息給NameNode。一般是每台機部署1個。
NameNode:與DataNode交互信息進行監控和索引數據目錄。一般是部署2個節點(主、備)。
ZKFailoverController(ZKFC):主要是負責監控NameNode及選舉。每個NameNode節點都會運行ZKFC服務。
JournalNode:同步主備NameNode的數據。至少要部署3個節點,必須是奇數個(3、5、7、…),因為系統最多只能容忍 (n-1)/2 個JN節點失敗而不影響正常運行。
NodeManager:Yarn的節點狀況監控服務。每台機都要部署。
ResourceManager:Yarn管理集群資源調度的服務,與NodeManager交互信息進行調度管理。一般是部署2個節點(主、備)。
2.目錄規划
* 以下目錄必須在安裝Hadoop之前預先在每台機手動創建,否則啟動Hadoop時會報錯
四、運行環境配置
* 此步驟不能跳過,否則會出現各種報錯
https://www.cnblogs.com/live41/p/15525826.html
五、安裝和配置ZooKeeper
https://www.cnblogs.com/live41/p/15522363.html
六、下載安裝包及配置系統環境變量
* 先登錄root賬號再進行以下操作
* 以下操作在每台機都要執行一次
1.下載及解壓
https://downloads.apache.org/hadoop/common/
解壓到/home/目錄
2.創建必須的目錄
* 由於ZooKeeper的所需目錄在安裝ZooKeeper時已創建,這里只創建Hadoop目錄
cd /home/hadoop mkdir hdfs tmp cd hdfs mkdir name data journal
3.配置環境變量
vim ~/.bashrc
在末尾加入以下內容:
export HADOOP_HOME=/home/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_COMMON_HOME=/home/hadoop export HADOOP_HDFS_HOME=/home/hadoop export HADOOP_MAPRED_HOME=/home/hadoop export HADOOP_CONF_DIR=/home/hadoop/etc/hadoop export HDFS_DATANODE_USER=root export HDFS_NAMENODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_HOME=/home/hadoop export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
更新環境變量:
source ~/.bashrc
七、安裝和配置Hadoop
* 在執行以下操作之前,記得要預先創建 三、2 的目錄,否則啟動Hadoop時會報錯
* 不用在每台機操作,只需要在c1機操作,再通過scp命令同步配置文件給其它機
1.進入配置目錄
cd /home/hadoop/etc/hadoop
2.編輯hadoop-env.sh
vim hadoop-env.sh
添加以下內容(如果已有,就把路徑修改為對的):
export JAVA_HOME=/usr/bin/jdk1.8.0 export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}
* 這里的JAVA_HOME根據你安裝的路徑來修改。
3.編輯yarn-env.sh
vim yarn-env.sh
添加以下內容(如果已有,就把路徑修改為對的):
export JAVA_HOME=/usr/bin/jdk1.8.0
4.編輯core-site.xml
* 各屬性的說明見下面附1的文章
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://ns6/</value> <!--對應hdfs-site.xml的dfs.nameservices屬性--> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/tmp</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>c1:2181,c2:2181,c3:2181</value> </property> <property> <name>ha.zookeeper.session-timeout.ms</name> <value>1000</value> </property> </configuration>
5.編輯hdfs-site.xml
* 各屬性的說明見下面附1的文章
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/hadoop/hdfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///home/hadoop/hdfs/data</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <name>dfs.nameservices</name> <value>ns6</value> <!--core-site.xml的fs.defaultFS使用該屬性值--> </property> <property> <name>dfs.ha.namenodes.ns6</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.ns6.nn1</name> <value>c1:9000</value> </property> <property> <name>dfs.namenode.rpc-address.ns6.nn2</name> <value>c2:9000</value> </property> <property> <name>dfs.namenode.http-address.ns6.nn1</name> <value>c1:50070</value> </property> <property> <name>dfs.namenode.http-address.ns6.nn2</name> <value>c2:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://c1:8485;c2:8485;c3:8485/ns6</value> <description> JournalNode的配置 格式是qjournal://host1:port1;host2:port2;host3:port3/journalID 默認端口號是8485,journalID建議使用nameservice的名稱 </description> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/hdfs/journal</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> <description>HDFS的故障自動轉移服務</description> </property> <property> <name>dfs.client.failover.proxy.provider.ns6</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <description>客戶端(client)通過該類獲取active NameNode</description> </property> <property> <name>ha.failover-controller.cli-check.rpc-timeout.ms</name> <value>60000</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> <description>隔離機制(fencing),防止主備切換時同時存在2個master的情況</description> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>~/.ssh/id_rsa</value> <!--/root/.ssh/id_rsa--> <description>隔離機制(fencing)使用的遠程控制密鑰</description> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration>
6.編輯mapred-site.xml
* 各屬性的說明見下面附1的文章
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobtracker.http.address</name> <value>c1:50030</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>c1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>c1:19888</value> </property> <property> <name>mapred.job.tracker</name> <value>http://c1:9001</value> </property> </configuration>
7.編輯yarn-site.xml
* 各屬性的說明見下面附1的文章
<configuration> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yn6</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>c3</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>c4</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>c3:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>c4:8088</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>c1:2181,c2:2181,c3:2181</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> <description> ResourceManger會將應用的狀態信息保存到yarn.resourcemanager.store.class配置的存儲介質中, 重啟后會加載這些信息,並且NodeManger會將還在運行的container信息同步到ResourceManager。 </description> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <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.log-aggregation.retain-seconds</name> <value>86400</value> </property> <property> <name>yarn.application.classpath</name> <value> /home/hadoop/etc/hadoop, /home/hadoop/share/hadoop/common/*, /home/hadoop/share/hadoop/common/lib/*, /home/hadoop/share/hadoop/hdfs/*, /home/hadoop/share/hadoop/hdfs/lib/*, /home/hadoop/share/hadoop/yarn/*, /home/hadoop/share/hadoop/yarn/lib/*, /home/hadoop/share/hadoop/mapreduce/* </value> </property> </configuration>
8.配置workers
vim workers
添加以下內容:
c1
c2
c3
c4
9.同步配置文件
把上面配置好的c1機的文件,通過scp同步到其它機。
cd /home/hadoop/etc/hadoop scp * c2:/home/hadoop/etc/hadoop scp * c3:/home/hadoop/etc/hadoop scp * c4:/home/hadoop/etc/hadoop
八、啟動和停止Hadoop
* 只在c1機執行
1.啟動JournalNode
hdfs --workers --daemon start journalnode
雖然配置了只在c1、c2、c3機運行journalnode,但用該命令時會把c4機的也運行起來
這是因為在workers文件配置了在4台機都運行。不用管,繼續往下執行即可
* 另外,該命令的舊版仍能執行,只是會報警告信息,命令如下(不建議使用):
hadoop-daemons.sh start journalnode
舊版有2個相似文件:hadoop-daemon.sh和hadoop-daemons.sh,前者(無s)只執行本機的journalnode,后者(有s)執行所有機器的journalnode
2.格式化NameNode
hadoop namenode -format
格式化后同步namenode的信息文件給c2機。因為有2個NameNode節點,c1和c2
scp -r /home/hadoop/hdfs/name/current/ c2:/home/hadoop/hdfs/name/
3.格式化zkfc
hdfs zkfc -formatZK
zkfc = ZKFailoverController = ZooKeeper Failover Controller
zkfc用於監控NameNode狀態信息,並進行自動切換。
4.啟動HDFS和Yarn
start-dfs.sh start-yarn.sh
* 這步是最經常報錯的,部分錯誤及解決方法見下面附2。
一般報的是以下2個錯誤(里面包含了解決方法):
https://www.cnblogs.com/live41/p/15464028.html
https://www.cnblogs.com/live41/p/15636229.html
只有第1次部署時需要用上面的操作,后面啟動可以直接用全部啟動腳本
start-all.sh
5.檢查進程
jps
6.檢查節點狀態
hdfs haadmin -getServiceState nn1 hdfs haadmin -getServiceState nn2 yarn rmadmin -getServiceState rm1 yarn rmadmin -getServiceState rm2
7.關閉Hadoop
stop-yarn.sh stop-dfs.sh
也可以直接用全部停止腳本
stop-all.sh
九、使用Hadoop
* 只在c1機執行
1.Web頁面操作
2.命令操作
https://www.cnblogs.com/xiaojianblogs/p/14281445.html
附1:
1.官方文檔
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/core-default.xml
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
2.中文文檔
core-site.xml、hdfs-site.xml、mapred-site.xml的屬性詳解
https://blog.csdn.net/h952520296/article/details/79993934
附2:
1.使用pdsh工具連接被拒絕
錯誤提示:
pdsh@connect: Connection refused
java.net.ConnectException: Call From c1/192.168.100.105 to c2:9000 failed on connection exception:
java.net.ConnectException: Connection refused;
解決方法:
https://www.cnblogs.com/live41/p/15464028.html
2.沒有配置用root賬號啟動Hadoop
錯誤提示:
ERROR: Attempting to operate on hdfs namenode as root
ERROR: Attempting to operate on hdfs datanode as root
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: Attempting to operate on hdfs journalnode as root
ERROR: Attempting to operate on hdfs zkfc as root
解決方法:
https://www.cnblogs.com/live41/p/15636229.html
3.重新格式化后的IO錯誤
錯誤提示(會有多種不同提示,都可以用該方法解決):
Incompatible clusterIDs in /home/hadoop/hdfs/data
Failed to add storage directory [DISK]file
Directory /home/hadoop/hdfs/journal/ns6 is in an inconsistent state: Can't format the storage directory because the current directory is not empty.
解決方法:
在格式化之前,先把name、data、logs等目錄里面的文件先清除掉。注意只是刪除里面的文件,不刪除目錄
附3:
非高可用方式(沒使用ZooKeeper)的安裝步驟
https://www.cnblogs.com/live41/p/15467263.html