Hadoop的安裝與部署(分布式+高可用)


一、硬件環境

假設有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頁面操作

http://192.168.100.105:50070/

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM