我的 Hadoop 3.2.2 之旅 【收藏夾吃灰系列】
點(diǎn)擊藍(lán)色“有關(guān)SQL”關(guān)注我喲
加個(gè)“星標(biāo)”,天天與10000人一起快樂(lè)成長(zhǎng)

圖 | Lenis
清明小假期結(jié)束了。
以往經(jīng)驗(yàn)告訴我,三天不練手,代碼倒著走!
這樣的心情,大學(xué)時(shí)代更有體會(huì)。每次假期回家,總要帶回一大包書(shū),告訴自己要奮斗,要看書(shū),結(jié)果回校前一夜,發(fā)現(xiàn)包里的書(shū),安靜如初。如果不趕緊翻出來(lái)品上一兩頁(yè),緩解下心焦,那可恥的厭惡感,總揮之不去。
不知道什么時(shí)候起,我養(yǎng)成了習(xí)慣,假期中,即使拿不出10個(gè)小時(shí)來(lái)讀書(shū)和寫(xiě)代碼,每天也總得練上 2-3 小時(shí),讓自己不空著。
這次也不例外,離上次搭建 Hadoop,過(guò)去有段時(shí)間了。趁著這個(gè)假期,我從頭到尾,把 Hadoop 3.2.2 給搭了起來(lái)。以下是實(shí)況記錄,如果能幫到各位,那也算是沒(méi)白糟蹋這段好時(shí)光!

首先,說(shuō)下文章的結(jié)構(gòu)圖。

本次實(shí)驗(yàn),完成的事情全部包括在這張 xmind 圖中了。
環(huán)境搭建篇

1 CentOS 的虛擬化安裝
成功安裝 Hadoop,第一要?jiǎng)?wù)是正確安裝 Linux 操作系統(tǒng)。
本次安裝,選擇 CentOS. CentOS 有很多版本,選擇哪個(gè),需根據(jù) Hadoop 版本來(lái)判定。
我在寫(xiě)這篇文章時(shí),查詢過(guò) Hadoop 官方文檔,當(dāng)前它最新版本是 Hadoop 3.2.2. 安裝指南中,著重閱讀 Prerequisites(預(yù)備) 部分,發(fā)現(xiàn)它并未對(duì) CentOS 的版本提出要求,而僅要求 CentOS 安裝 Java 即可。所以,本次安裝選用最新的 CentOS 8.
Hadoop 官網(wǎng): https://hadoop.apache.org/docs/stable/
CentOS 的下載非???,需要時(shí)從官網(wǎng)下載最新版本,而不一定非得存儲(chǔ)起來(lái)。如今的網(wǎng)絡(luò)環(huán)境,給我可憐的 SSD 存儲(chǔ)系統(tǒng)減輕了不少經(jīng)濟(jì)壓力。但需說(shuō)明一點(diǎn),官方宣布,CentOS 8 支持服務(wù)將于 2021 年底失效,而 CentOS 7 則到 2024 年才退役。所以,生產(chǎn)環(huán)境使用 CentOS 7 還是 8 ,需要提前考慮好!
CentOS 官網(wǎng):https://www.centos.org/

本次實(shí)驗(yàn)用途搭建的 Hadoop 環(huán)境,我采取三臺(tái)獨(dú)立虛擬機(jī)做法。
D:\vm\HadoopCluster
- Yarn
- NodeA
- NodeB
D:\vm\HadoopCluster 是總目錄,分目錄 Yarn, NodeA, NodeB 分別存放主從服務(wù)器虛擬機(jī)。如果你有充足預(yù)算,當(dāng)然可以用三臺(tái)物理機(jī)來(lái)模擬。作為極客,配置個(gè) 5,6 臺(tái)主機(jī),很重要。如果沒(méi)有,單機(jī)配置足夠強(qiáng)大,勉強(qiáng)也湊合。
所有 CentOS 虛擬機(jī)的密碼都是 : SparkAdmin
虛擬機(jī)軟件用 Vmware. 預(yù)配置8G 內(nèi)存,4核,和50GB 硬盤(pán).
2 創(chuàng)建專屬Hadoop軟件的用戶
為每臺(tái)服務(wù)器,創(chuàng)建如下的賬戶:
用戶名:HadoopAdmin 密碼: SparkAdmin
一個(gè)小鋪墊:其實(shí) Hadoop 是基礎(chǔ),是開(kāi)胃菜,從 SparkAdmin 就不難猜到,之后還將有 Hive 和 Spark.小伙伴們,趕緊收藏加關(guān)注!
為了和其他應(yīng)用隔離開(kāi)來(lái),有必要為 Hadoop 單獨(dú)建立一個(gè)應(yīng)用目錄。
配置軟件安裝目錄:/opt/Hadoop. 用戶 HadoopAdmin 對(duì) /opt/Hadoop 具有無(wú)限訪問(wèn)權(quán)限 當(dāng)使用 HadoopAdmin 登錄時(shí),沒(méi)有權(quán)限建立目錄,所以要先登錄 root 賬戶:
$su
--輸入 HadoopAdmin密碼
#cd /opt
#mkdir Hadoop
#chown hadoopadmin Hadoop
#exit
3 主從服務(wù)器之間的無(wú)密登錄
主機(jī)名與網(wǎng)絡(luò)映射
新建三臺(tái)虛擬機(jī)時(shí),采用了“建一復(fù)二”的策略,說(shuō)人話,就是新建一臺(tái),復(fù)制兩臺(tái)。
這三臺(tái)都使用了相同的主機(jī)名,所以需要修改他們,分別為:namenode, nodea, nodeb
為了防止修改錯(cuò)誤,先把 /etc/hosts 備份起來(lái):
$ su
# cp /etc/hosts /etc/hosts.backup
# exit
修改 /etc/hosts 文件:
# 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 namenode namenode.hadoop
注釋掉第一行,加上 namenode
事實(shí)上,修改 hosts 文件,并不解決問(wèn)題,而是要修改 /etc/hostname 文件。注釋掉第一行,加入 namenode.hadoop
-- /etc/hostname 文件
# localhost.localdomain
namenode.hadoop
--再切回 bash 控制臺(tái),# 就變成如下的提示:
[root@namenode hadoopadmin]#
接下來(lái),添加主機(jī)識(shí)別地址。在 CentOS 中,主機(jī)與 ip 之間的映射,通過(guò) /etc/hosts 可以很容易建立。
已知,三臺(tái)節(jié)點(diǎn)名稱分別是 namenode, nodea, nodeb. 將他們加入 hadoop 這個(gè)集群,分別擔(dān)任 Master 和 Worker 節(jié)點(diǎn)。所以修改 /etc/hosts 如下:
192.168.31.10 namenode namenode.hadoop
192.168.31.11 nodea nodea.hadoop
192.168.31.12 nodeb nodeb.hadoop
將以上三個(gè)映射,分別添加到每臺(tái)機(jī)器上。
需要說(shuō)明下,vmware 提供了橋接,NAT 和僅主機(jī)的網(wǎng)絡(luò)模式,這個(gè)設(shè)置一定要選擇橋接模式(Bridge). 我不知道另外兩種模式下能不能搭建成功,有成功經(jīng)驗(yàn)的朋友,可以留言證實(shí)下。
SSH 無(wú)密登錄原理
無(wú)密登錄是通過(guò) ssh 實(shí)現(xiàn)的,大概步驟如下:
在客戶端(經(jīng)常使用其來(lái)登錄遠(yuǎn)程服務(wù)器)生成一對(duì)密鑰對(duì) 將公鑰放入遠(yuǎn)程服務(wù)器賬戶下
生成密鑰對(duì)的命令工具是:
ssh-keygen [-t rsa|dsa ]
如果沒(méi)有指定特定的加密算法,默認(rèn)是用 rsa 來(lái)加密。
將 /home/hadoopadmin/.ssh/id_rsa.pub 添加到遠(yuǎn)程服務(wù)器 nodea 的授權(quán)認(rèn)證文件下,那么從 namenode 訪問(wèn) nodea 時(shí),無(wú)需輸入密碼就可直接登錄。
配置 SSH 無(wú)密登錄
首先,通過(guò) scp 將公鑰文件上傳到遠(yuǎn)程服務(wù)器的用戶 hadoopadmin 的默認(rèn)工作目錄下:
scp id_rsa.pub hadoopadmin@nodea:~
在遠(yuǎn)程服務(wù)器 nodea 上,將公鑰加入本賬戶下的 ~/.ssh/authorized_keys 文件中去。
cat id_rsa.pub >>.ssh/authorized_keys
chmod 644 authorized_keys
如此反復(fù),直到所有服務(wù)器,都能兩兩通過(guò) SSH 登錄。
4 Java 環(huán)境搭建
安裝 Hadoop 時(shí),唯一對(duì) CentOS 有要求的是,安裝正確的 Java.
為調(diào)試方便,盡量安裝 JDK. Jre 缺少了 JPS 工具,而 JPS 在后續(xù)檢測(cè)環(huán)境時(shí),極為方便!
截止本文寫(xiě)作時(shí),Hadoop 選用的是 3.2.2,它對(duì) Java 運(yùn)行時(shí)環(huán)境的要求是 Java8/Java11
Java 與 Hadoop 的版本對(duì)應(yīng):
| Hadoop 版本 | Java 版本 | 備注 |
|---|---|---|
| Hadoop 3.3 及以上 | Java 8; Java 11 | Java 11 不支持編譯 Hadoop |
| Hadoop 3.0.x - 3.2.x | Java 8 | |
| Hadoop 2.7.x - 2.10.x | Java 7; Java 8 |
步驟:
下載 JDK 8
安裝包有兩種,tar.gz 的壓縮包 和 rpm 管理的安裝包。為了普適性,選擇 tar.gz 的壓縮包,這樣在任何 Linux 平臺(tái)上,都可以參考它來(lái)安裝。
下載地址:https://www.java.com/zh-CN/download/manual.jsp
解壓到 /opt/java
/opt/java 是與 /opt/Hadoop 齊平的目錄,為了體現(xiàn) Hadoop 生態(tài)的完整性安裝,Java 安裝目錄就放在這里。同樣,需要配置 HadoopAdmin 用戶對(duì)這個(gè)目錄的權(quán)限。假如 HadoopAdmin 擁有對(duì) /opt 的 Owner 權(quán)限,那么這里 /opt/java 自然繼承了這個(gè)權(quán)限。
給 HadoopAdmin 附上 /opt/Java 的 owner 權(quán)限:
-- 先切換到 root 賬戶
$ su
-- 輸入密碼
# cd /opt
# mkdir java
# chown hadoopadmin java
設(shè)置環(huán)境變量 JAVA_HOME=/opt/java/jdk8
回到 HadoopAdmin 用戶的工作目錄(先退出 root 賬戶) :
# exit
$ cd ~
打開(kāi) .bashrc 編輯:
vi .bashrc
加入 JAVA_HOME 變量,編輯 PATH 變量,使其指向新建的 Java bin 目錄:
JAVA_HOME=/opt/java/jdk8
PATH=$PATH:$JAVA_HOME
export JAVA_HOME
export PATH
驗(yàn)證 Java 安裝正確性:
-- Java -version
[hadoopadmin@localhost ~]$ java -version
java version "1.8.0_281"
Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode)
Hadoop軟件安裝配置

1 下載與安裝
再次聲明,本次實(shí)驗(yàn)使用的 Hadoop 版本是 3.2.2.
下載地址:http://www.apache.org/dyn/closer.cgi/hadoop/common/我在上海,通過(guò)訪問(wèn)這個(gè)網(wǎng)址可直達(dá):https://mirrors.bfsu.edu.cn/apache/hadoop/common/hadoop-3.2.2/

目錄中會(huì)有幾個(gè)文件,比較繞。除了安裝文件,還有源代碼文件包,組件包,說(shuō)明文件等等。如果你只是要安裝使用 Hadoop, 那下載紅圈部分即可。
下載速度非???,不到1分鐘就可全部下載完畢。所以不用在本地保存。
若上述地址無(wú)法訪問(wèn),可通過(guò)官網(wǎng)尋找:
Hadoop 官方地址:https://hadoop.apache.org/docs/stable/
2 配置文件
在設(shè)定 Hadoop 的配置文件前,先要簡(jiǎn)單了解下 Hadoop 的基本原理:
如果僅對(duì)配置文件具體內(nèi)容感興趣,可略過(guò)這部分原理解釋,直接看《可用的一套 Hadoop Cluster 配置》

Hadoop 是由 HDFS 和 YARN 構(gòu)成的分布式存儲(chǔ)和分布式計(jì)算的集群。
HDFS 用作分布式存儲(chǔ),主體部分由 Name Node 和 Data Node 組成。Name Node 節(jié)點(diǎn)記錄所有 Data Node 的地址和文件信息。
YARN 是分布式計(jì)算框架,主體部分由 Resource Manager 和 Node Manager 組成。Resource Manager 可看做大腦管理中心,Node Manager 就是四肢與軀干和神經(jīng)細(xì)胞。
由于 Name Node 和 Resource Manager 都帶有管理性質(zhì),所以可放在同一臺(tái)服務(wù)器上,方便完成個(gè)人搭建的測(cè)試。在生產(chǎn)環(huán)境中,分開(kāi)來(lái)創(chuàng)建,肯定是利大于弊。
有了上面的基本概念,則可以修改配置文件:
Core-Site:配置 Name Node 與 Data Node HDFS-Site: 配置分布式存儲(chǔ)的資源范圍 YARN-Site: 配置 YARN 的資源范圍 Map-Reduce Site: 配置 MapReduce 1的資源范圍 env-site: 配置 Hadoop 所在的環(huán)境變量,比如 Hadoop 安裝目錄,Java 安裝目錄
Hadoop 的配置,采用分層控制策略。
總策略配置,設(shè)置了不可寫(xiě),這類配置文件放在頂級(jí)目錄里:
core-default.xml, hdfs-default.xml, yarn-default.xml, mapred-default.xml.
自定義配置的文件,用戶可讀可寫(xiě),放在特定的目錄里:
etc/hadoop/core-site.xml, etc/hadoop/hdfs-site.xml, etc/hadoop/yarn-site.xml , etc/hadoop/mapred-site.xml.
并且,還配置了影響 Hadoop 進(jìn)程執(zhí)行的環(huán)境變量控制文件:
etc/hadoop/hadoop-env.sh , etc/hadoop/yarn-env.sh.
前兩層的配置,主要是針對(duì) Hadoop 集群的配置,而最后一組控制文件,是針對(duì) Hadoop 單個(gè)組件的進(jìn)程做配置,控制的粒度更細(xì),更偏單臺(tái)服務(wù)器。
配置同一個(gè) Hadoop 集群時(shí),采用的策略是所有配置文件都用同一套。即配置一套,然后同步到 Master 和 Workder 節(jié)點(diǎn)。
下面就一一說(shuō)明,配置文件中坑會(huì)遇到的細(xì)節(jié)和默認(rèn)值,以便很好的配置 Hadoop 集群及其所在服務(wù)器環(huán)境。
節(jié)點(diǎn)服務(wù)器的環(huán)境控制:
這層的控制,主要通過(guò) HADOOP_HOME/etc/hadoop/yarn-env.sh 來(lái)控制。那么這兩個(gè)文件到底可以控制哪些環(huán)境變量呢?
| Daemon | Environment Variable |
|---|---|
| NameNode | HDFS_NAMENODE_OPTS |
| DataNode | HDFS_DATANODE_OPTS |
| Secondary NameNode | HDFS_SECONDARYNAMENODE_OPTS |
| ResourceManager | YARN_RESOURCEMANAGER_OPTS |
| NodeManager | YARN_NODEMANAGER_OPTS |
| WebAppProxy | YARN_PROXYSERVER_OPTS |
| Map Reduce Job History Server | MAPRED_HISTORYSERVER_OPTS |
$HADOOP_HOME 是 Hadoop 安裝的本機(jī)地址
這地方要注意 2個(gè)問(wèn)題:
同一個(gè)Hadoop集群,共用同一份配置文件,通過(guò) scp 就可以擴(kuò)散到整個(gè)集群中
這很好理解。將同一份文件,傳播給其他節(jié)點(diǎn),或?qū)⑺泄?jié)點(diǎn)上的進(jìn)程,使用同一個(gè)命令來(lái)運(yùn)行,正是分布式存儲(chǔ)和計(jì)算要解決的問(wèn)題。比如 YARN, 在分發(fā)計(jì)算包的時(shí)候,調(diào)用同樣一個(gè)進(jìn)程,來(lái)運(yùn)算不同的數(shù)據(jù)集
環(huán)境參數(shù)到底在控制什么
比如 HDFS_NAMENODE_OPTS,指定了使用 ParallevlGC ,并啟動(dòng) 4G Java 堆。
export HDFS_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx4g"
最后,節(jié)點(diǎn)服務(wù)器的環(huán)境配置,包含兩個(gè)重要參數(shù),HADOOP_HOME & JAVA_HOME.
HADOOP_HOME 是 Hadoop 安裝的路徑,省去每次執(zhí)行 Hadoop 命令時(shí),需要輸入 Hadoop 所在的全路徑名。相比 /opt/hadoop/bin/HDFS, 僅敲入 HDFS 簡(jiǎn)潔得多。
JAVA_HOME, 則可以在 Hadoop 服務(wù)賬戶的環(huán)境變量中配置,也可以在 hadoop-env.sh 中指定特定的 Java 版本。
節(jié)點(diǎn)服務(wù)器配置
再次說(shuō)明,配置文件部署策略,是一組配置文件全局復(fù)用,而不用每個(gè)角色節(jié)點(diǎn)各自配置。
開(kāi)頭的那張架構(gòu)圖,一個(gè)完整的 Hadoop 集群,有四種組件存在于 Hadoop 集群中,NameNode, DataNode, Resource Manager, 和 Node Manager. 這四種各自有配置參數(shù),互不影響。
真正核心的配置文件,也正是這四個(gè):
core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml
下面具體說(shuō)細(xì)節(jié)。
$HADOOP_HOME/etc/hadoop/core-site.xml
| Parameter | Value | Notes |
|---|---|---|
| fs.defaultFS | NameNode URI | hdfs://host:port/ |
| io.file.buffer.size | 131072 | Size of read/write buffer used in SequenceFiles. |
這里的 core-site 其實(shí)可以把 "-site" 去掉,配置的是集群的基本設(shè)定,全局唯一。比如 fs.defaultFS,指向的是 NameNode 所在的節(jié)點(diǎn)和端口位置,用來(lái)配置工作節(jié)點(diǎn)與主節(jié)點(diǎn)之間的通信;io.file.buffer.size 控制的是緩存單位,比如131072 是128K,寫(xiě)入時(shí),數(shù)據(jù)滿 128K 就會(huì)從內(nèi)存寫(xiě)到磁盤(pán)上。
更詳細(xì)的配置參數(shù),看這里:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/core-default.xml
etc/hadoop/hdfs-site.xml
這個(gè)文件就需要分類來(lái)配置。hdfs 代表的是 Hadoop File System, 即 Hadoop 文件系統(tǒng)。HDFS 有兩類節(jié)點(diǎn), NameNode 與 DataNode. 這兩類節(jié)點(diǎn)上的 Hadoop 進(jìn)程,用到的參數(shù)是不一樣的。
針對(duì) NameNode 可用的配置參數(shù)有:
| Parameter | Value | Notes |
|---|---|---|
| dfs.namenode.name.dir | Path on the local filesystem where the NameNode stores the namespace and transactions logs persistently. | If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. |
針對(duì) DataNode 可用的配置參數(shù)有:
| Parameter | Value | Notes |
|---|---|---|
| dfs.datanode.data.dir | Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks. | If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. |
其他 HDFS 服務(wù)器 參考配置:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
分布式計(jì)算配置 YARN-site.xml
稍比 HDFS-site.xml 配置復(fù)雜一些。有三層配置:Resource Manager, Node Manager 共通的配置;Resource Manager 獨(dú)有配置;Node Manager 獨(dú)有配置。
共通的配置:
| Parameter | Value | Notes |
|---|---|---|
| yarn.acl.enable | true / false | Enable ACLs? Defaults to false. |
Resource Manager 配置:
| Parameter | Value | Notes |
|---|---|---|
| yarn.resourcemanager.address | ResourceManager host:port for clients to submit jobs. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
| yarn.resourcemanager.hostname | ResourceManager host. | host Single hostname that can be set in place of setting all yarn.resourcemanager*address resources. Results in default ports for ResourceManager components. |
Node Manager 配置:
| arameter | Value | Notes |
|---|---|---|
| yarn.nodemanager.log-dirs | Comma-separated list of paths on the local filesystem where logs are written. | Multiple paths help spread disk i/o. |
| yarn.nodemanager.remote-app-log-dir-suffix | logs | Suffix appended to the remote log dir. Logs will be aggregated to {user}/${thisParam} Only applicable if log-aggregation is enabled. |
| yarn.nodemanager.aux-services | mapreduce_shuffle | Shuffle service that needs to be set for Map Reduce applications. |
更詳細(xì)的配置參數(shù),戳這里:https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
可用的一套 Hadoop Cluster 配置:
上面說(shuō)的是泛泛的配置原理,這里提供一套,親測(cè)可用的配置文件組合。
這將是一套完整的配置文件組合:Hadoop 環(huán)境配置 + Hadoop Core/HDFS/YARN 配置
強(qiáng)烈建議:安裝 visual studio code 用作文本編輯器
請(qǐng)根據(jù)自己需要,配置相關(guān)目錄
--.bashrc
JAVA_HOME=/opt/java/jdk8
PATH=$PATH:$JAVA_HOME/bin
VSCODE_HOME=/opt/java/VSCode-linux-x64/bin
HADOOP_HOME=/opt/Hadoop/hadoop-3.2.2
PATH=$PATH:$VSCODE_HOME:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_HOME
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export HADOOP_YARN_HOME=${HADOOP_HOME}
export VSCODE_HOME
export JAVA_HOME
export PATH
--$HADOOP_HOME/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/opt/java/jdk8
export HADOOP_HOME=/opt/Hadoop/hadoop-3.2.2
-- $HADOOP_HOME/bin/hadoop
export HADOOP_HOME=/opt/Hadoop/hadoop-3.2.2
-- $HADOOP_HOME/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://namenode:9000</value>
<description>the default name node address</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/Hadoop/tmp</value>
</property>
</configuration>
-- $HADOOP_HOME/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/Hadoop/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/Hadoop/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
-- $HADOOP_HOME/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_NAME</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_NAME</value>
</property>
</configuration>
-- $HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.acl.enable</name>
<value>0</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.31.10</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>/opt/Hadoop/hadoop-3.2.2/etc/hadoop:/opt/Hadoop/hadoop-3.2.2/share/hadoop/common/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/common/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/*</value>
</property>
</configuration>
-- $HADOOP_HOME/etc/hadoop/workers
nodea
nodeb
復(fù)制所有的 HADOOP_HOME/etc/hadoop 下。即可完成子節(jié)點(diǎn)的配置。
當(dāng)然也要考慮整個(gè)用戶級(jí)別的環(huán)境變量同步,即 ~/.bashrc 或者~/.bash_profile 同步, 或者其他設(shè)置環(huán)境變量文件的同步。
3 啟動(dòng)集群
整個(gè) Hadoop 集群是由兩部組成的, 分布式存儲(chǔ)(HDFS)和分布式計(jì)算(YARN)。HDFS 是 YARN 得以施展魔法的前提存在,所以在 YARN 啟動(dòng)之前, HDFS 必定首先要存在。
就跟我們使用電腦是一模一樣的,必須先把硬盤(pán)架起來(lái),進(jìn)行格式化,然后才是安裝操作系統(tǒng)。此時(shí),Hadoop 就像是剛配好的電腦,第一步首先要進(jìn)行硬盤(pán)格式化,也就是 HDFS 的 namenode format:
hdfs namenode -format
然后打開(kāi) hadoop hdfs ,歡迎 YARN 服務(wù)的降臨:
start-dfs.sh
試著給 HDFS 加一個(gè)自定義目錄,用來(lái)操作測(cè)試文件:
HDFS dfs -mkdir -p /user/hadoop
HDFS dfs -ls
通過(guò)訪問(wèn) http://namenode:9870 以網(wǎng)頁(yè)形式監(jiān)控 hdfs 的運(yùn)行情況
如果上面的 HDFS 測(cè)試沒(méi)有問(wèn)題,接下來(lái)就可以開(kāi)始做 YARN 的啟動(dòng):
start-yarn.sh
4 關(guān)閉集群
有兩種方法,可以關(guān)閉一個(gè) Hadoop 集群
第一種方法,依次關(guān)閉 YARN 和 HDFS:
stop-yarn.sh
stop-dfs.sh
第二種方法,執(zhí)行一個(gè)腳本,關(guān)閉 YARN 和 HDFS:
stop-all.sh
5 遇到的問(wèn)題
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
這是 SSH 配置問(wèn)題。實(shí)際上,每臺(tái)服務(wù)器之間,都需要 SSH 無(wú)密登錄,不僅僅是 master node 到 worker node 之間,任意一臺(tái) worker node 與 worker node 之間 worker node 與 master node 之間都需要配置。
除此之外,還需要設(shè)置 /etc/ssh/sshd_config:
PermisRootLogin no
PubkeyAuthentication yes
# GSSAPIAuthentication yes
# GSSAPICleanupCredentials no
UsePAM yes
每個(gè)節(jié)點(diǎn)都需要修改,這樣 SSH 才能保證起作用。之后重新啟動(dòng) ssh 服務(wù):
systemctl restart sshd
并且修改 ~/.ssh/authorized_keys 的權(quán)限,
chmod 0600 ~/.ssh/authorized_keys
即便這樣設(shè)置了,在啟動(dòng) start-dfs.sh 時(shí)還會(huì)遇到同樣的問(wèn)題,看過(guò)這份 shell 腳本才知道,還需要把本機(jī)的 public key 加入到 authorized_keys 里面去:
cat ~/.ssh/id_rsa_namenode.pub >>authorized_Keys
/* +++++++++++++++++
id_rsa_namenode.pub 是在本次實(shí)驗(yàn)中,
充當(dāng) namenode 和 resource manager 的服務(wù)器上,
使用ssh-keygen 生成的公鑰(public key)
+++++++++++++++++++*/
沒(méi)有 datanode, 即使start-dfs.sh/start-all.sh 已經(jīng)完全成功運(yùn)行
2021-04-03 03:09:45,554 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to server: namenode/192.168.31.10:9000 2021-04-03 03:09:49,551 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool ID needed, but service not yet registered with NN, trace: java.lang.Exception at org.apache.hadoop.hdfs.server.datanode.BPOfferService.getBlockPoolId(BPOfferService.java:214) at (此處省卻Log信息)
搜索了無(wú)數(shù)的帖子,最后發(fā)現(xiàn)其實(shí)只要把 /etc/hosts 中的 127.0.0.1 去掉,就可以。
沒(méi)有找到可用的 nodemanager, 其實(shí)被防火墻給擋住,nodemanager 無(wú)法與 resource manager 通信 YarnChild class 沒(méi)有找到,那是 因?yàn)?yarn-site.xml 沒(méi)有配置 hadoop classpath 命令返回的路徑
我在本次實(shí)驗(yàn)中,需要將如下的這些目錄,賦值給 hadoop classpath:
/opt/Hadoop/hadoop-3.2.2/etc/hadoop: /opt/Hadoop/hadoop-3.2.2/share/hadoop/common/lib/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/common/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs: /opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/lib/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/lib/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn: /opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/lib/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/
其中, /opt/Hadoop/hadoop-3.2.2 就是本次實(shí)驗(yàn)安裝的 hadoop 目錄所在。
-- yarn-site.xml
<property>
<name>yarn.application.classpath</name>
<value>/opt/Hadoop/hadoop-3.2.2/etc/hadoop:/opt/Hadoop/hadoop-3.2.2/share/hadoop/common/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/common/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/*</value>
</property>
wordcount 入門(mén)實(shí)例

WordCount 是大數(shù)據(jù)編程領(lǐng)域的 Hello World 實(shí)例,也是用來(lái)測(cè)試 Hadoop 有效性的實(shí)例之一。
它被封裝在 Jar 包,通過(guò)“吃進(jìn)”文本文件,“吐出”單詞的總計(jì)數(shù)。所以做這個(gè)實(shí)驗(yàn),需要準(zhǔn)備文本文件, 在 HDFS 上創(chuàng)建存放這些文本文件的目錄,同時(shí)還需創(chuàng)建 wordcount 的結(jié)果輸出目錄。
獲取文本文件
從 gutenberg 下載文本文件,分別保存為 franklin.txt, herbert.txt, maria.txt. 要注意,這些文件是存在當(dāng)前活動(dòng)目錄下。
wget -O franklin.txt http://www.gutenberg.org/files/13482/13482.txt
wget -O herbert.txt http://www.gutenberg.org/files/20220/20220.txt
wget -O maria.txt http://www.gutenberg.org/files/29635/29635.txt
創(chuàng)建HDFS相關(guān)目錄
wordcount 會(huì)讀取指定目錄下所有文件,所以使用的輸入輸出兩個(gè)目錄,一定要分開(kāi)創(chuàng)建。
hdfs dfs -mkdir -p /user/hadoop/wordcounter/input
hdfs dfs -mkdir -p /user/hadoop/wordcounter/output
上傳文本文件到HDFS
一次性上傳所有文本文件
hdfs dfs -put franklin.txt herbert.txt maria.txt /user/hadoop/wordcounter/input
檢查文件是否上傳到位:
[hadoopadmin@namenode ~]$ hdfs dfs -ls /user/hadoop/wordcounter/input
Found 3 items
-rw-r--r-- 2 hadoopadmin supergroup 143220 2021-04-04 04:28 /user/hadoop/wordcounter/input/franklin.txt
-rw-r--r-- 2 hadoopadmin supergroup 561609 2021-04-04 04:28 /user/hadoop/wordcounter/input/herbert.txt
-rw-r--r-- 2 hadoopadmin supergroup 172797 2021-04-04 04:28 /user/hadoop/wordcounter/input/maria.txt
運(yùn)行 wordcount 實(shí)例
使用 Yarn 來(lái)執(zhí)行 wordcount 這里要注意,/user/hadoop/wordcounter/output/wordcountresult.txt 會(huì)被 wordcount 當(dāng)做一個(gè)輸出目錄。這是我一開(kāi)始疏忽的地方。由于 MapReduce 會(huì)產(chǎn)生大量的數(shù)據(jù),單個(gè)文件在理論上不能存下,所以輸出結(jié)果只能以目錄為目標(biāo),目錄下可以生成多個(gè)小文件,用來(lái)存放這些結(jié)果數(shù)據(jù)。
[hadoopadmin@namenode ~]$ yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /user/hadoop/wordcounter/input/*.* /user/hadoop/wordcounter/output/wordcountresult.txt
2021-04-04 23:02:54,101 INFO client.RMProxy: Connecting to ResourceManager at namenode/192.168.31.10:8032
2021-04-04 23:02:55,042 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/hadoopadmin/.staging/job_1617530419259_0003
2021-04-04 23:02:55,263 INFO input.FileInputFormat: Total input files to process : 3
2021-04-04 23:02:55,367 INFO mapreduce.JobSubmitter: number of splits:3
2021-04-04 23:02:55,779 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1617530419259_0003
2021-04-04 23:02:55,780 INFO mapreduce.JobSubmitter: Executing with tokens: []
2021-04-04 23:02:56,511 INFO conf.Configuration: resource-types.xml not found
2021-04-04 23:02:56,511 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2021-04-04 23:02:56,950 INFO impl.YarnClientImpl: Submitted application application_1617530419259_0003
2021-04-04 23:02:57,027 INFO mapreduce.Job: The url to track the job: http://namenode:8088/proxy/application_1617530419259_0003/
2021-04-04 23:02:57,028 INFO mapreduce.Job: Running job: job_1617530419259_0003
2021-04-04 23:03:04,166 INFO mapreduce.Job: Job job_1617530419259_0003 running in uber mode : false
2021-04-04 23:03:04,167 INFO mapreduce.Job: map 0% reduce 0%
Total time spent by all maps in occupied slots (ms)=46766
Total time spent by all reduces in occupied slots (ms)=2713
……(省去多余l(xiāng)og信息)
Peak Reduce Virtual memory (bytes)=2612924416
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=877626
File Output Format Counters
Bytes Written=203817
[hadoopadmin@namenode ~]$
檢查 wordcount 運(yùn)行結(jié)果
[hadoopadmin@namenode ~]$ hdfs dfs -cat /user/hadoop/wordcounter/output/wordcountresult.txt/part-r-00000
...
end-organ 5
end-organ; 1
end-organs 12
end-organs, 3
end-organs. 2
end-organs: 1
end-organs_. 1
...
這里截取一段結(jié)果作為展示。
應(yīng)用監(jiān)控

Hadoop 主要分兩類監(jiān)控:HDFS 和 Yarn.
HDFS
它的訪問(wèn)地址是 http://namenode:9870namenode 是 HDFS 主控節(jié)點(diǎn) name node(與 data node區(qū)分開(kāi)來(lái))機(jī)器名。

YARN
它的訪問(wèn)地址是 http://namenode:8088/cluster/namenode其實(shí)是 Resource Manager 所在的機(jī)器。
通過(guò)訪問(wèn) Finished 頁(yè)面,查看剛才運(yùn)行的 wordcount 實(shí)例應(yīng)用
小結(jié)

太長(zhǎng)的技術(shù)文,直擊了公眾號(hào)的軟肋。用線性的書(shū)寫(xiě),表達(dá)網(wǎng)狀的思維,挑戰(zhàn)太大了。僅僅把文章搬到公眾號(hào)上,就花了差不多近半小時(shí)。但對(duì)個(gè)人來(lái)講,公眾號(hào)又確實(shí)是發(fā)布個(gè)人觀點(diǎn)的優(yōu)秀窗口,值得花這個(gè)時(shí)間。
良好的閱讀體驗(yàn),能增加個(gè)人閱讀興趣。為此,我購(gòu)買(mǎi)過(guò)一系列產(chǎn)品,kindle, mind pad, ipad pro 12, 硬件配置是上去了,但內(nèi)容,卻始終得不到很好得表現(xiàn)。比如我喜歡楷體,黃背景光,但幾乎所有的閱讀器,除了微信讀書(shū) ipad 版能令我滿意,其他都缺點(diǎn)意思。
為了給大家更好的內(nèi)容閱讀體驗(yàn),我把這份文章放在語(yǔ)雀上,地址如下:
https://www.yuque.com/books/share/4ab0cdd2-927d-491d-bd97-622b0d7c047a?# 《數(shù)據(jù)科學(xué)實(shí)踐》
閱讀風(fēng)格是這樣的

隨機(jī)打開(kāi)一個(gè)主題,可在右邊側(cè)欄,看到閱讀的子標(biāo)題

這樣一來(lái),閱讀體驗(yàn)爆棚,還有另外的 3 個(gè)好處:
一,增加閱讀的立體感;
二,方便以后局部更新;
三,你可以導(dǎo)出任何你喜歡的格式
希望各位看官喜歡!
往期精彩:
我在面試數(shù)據(jù)庫(kù)工程師候選人時(shí),常問(wèn)的一些題
零基礎(chǔ) SQL 數(shù)據(jù)庫(kù)小白,從入門(mén)到精通的學(xué)習(xí)路線與書(shū)單
