境搭建實(shí)戰(zhàn):從Linux虛擬機(jī)到WordCount跑通)
簡介面向大數(shù)據(jù)初學(xué)者與高校實(shí)驗(yàn)課程使用者這份實(shí)驗(yàn)指導(dǎo)文檔系統(tǒng)梳理了“熟悉常用的Linux操作和Hadoop操作”的完整流程。內(nèi)容先交代實(shí)驗(yàn)?zāi)康呐c平臺(tái)選型再分模塊講解虛擬機(jī)安裝、常用命令操作、偽分布式部署和基礎(chǔ)文件管理。命令部分涉及目錄切換、文件查看、權(quán)限修改、壓縮打包、字符串查找等常見場(chǎng)景并配有清晰的執(zhí)行示例與結(jié)果說明Hadoop部分重點(diǎn)演示了單機(jī)偽分布式環(huán)境的搭建方法以及運(yùn)行自帶實(shí)例驗(yàn)證是否成功。文檔按實(shí)驗(yàn)步驟逐條展開每個(gè)操作都給出輸入命令與預(yù)期輸出便于自主練習(xí)和排查問題末尾還補(bǔ)充了環(huán)境變量配置與HDFS常用操作能有效降低入門門檻。資源包僅含一個(gè)Word文檔壓縮后大小約289KB內(nèi)容結(jié)構(gòu)緊湊可直接打印作為實(shí)驗(yàn)手冊(cè)。目前已有九百七十七人學(xué)習(xí)下載適合作為大數(shù)據(jù)課程第一次實(shí)驗(yàn)的課前預(yù)習(xí)、課上對(duì)照和課后復(fù)習(xí)材料也可供教師布置與檢查作業(yè)時(shí)參考。1. Hadoop 大數(shù)據(jù)實(shí)驗(yàn)的開端先把 Linux 虛擬機(jī)這關(guān)過了第一次做大數(shù)據(jù)的同學(xué)多半是卡在“裝環(huán)境”這一步Windows 上裝 Hadoop要么 shell 腳本跑不起來要么路徑分隔符和權(quán)限問題滿天飛最后發(fā)現(xiàn) Hadoop 在 Linux 上運(yùn)行才能發(fā)揮最佳性能。于是實(shí)驗(yàn)一的核心就落到了三件事上裝一個(gè) Linux 虛擬機(jī)、熟悉常用 Linux 命令、在單機(jī)上把 Hadoop 偽分布式環(huán)境搭起來跑通。這篇文章按我實(shí)際搭環(huán)境的順序?qū)憦?VirtualBox 6.1.4 裝 Ubuntu 18.04到 Hadoop 3.1.3 的四份配置文件再到最經(jīng)典的 DataNode 起不來問題每一步都給出可復(fù)現(xiàn)的命令和參數(shù)說明照著走能省掉大半天的折騰時(shí)間。2. 版本選型VirtualBox 6.1.4、Ubuntu 18.04、Hadoop 3.1.3 怎么組合最穩(wěn)2.1 為什么推薦 Ubuntu 18.04 而不是更新版本Hadoop 偽分布式環(huán)境對(duì)操作系統(tǒng)沒有硬性限制但在實(shí)驗(yàn)場(chǎng)景里Ubuntu 18.04 搭配 Hadoop 3.1.3 是踩坑最少的組合。18.04 的 glibc 版本和 JDK 8 配合得很好apt 源里直接能裝 openjdk-8-jdk不用折騰 PPA。相對(duì)地20.04 和 22.04 默認(rèn)的 OpenSSH 配置和 Python 版本會(huì)讓 start-dfs.sh 的免密登錄環(huán)節(jié)多出一些意外比如 ssh-keygen 生成的密鑰格式不被舊版本接受或者 sshd 默認(rèn)禁止了空密碼密鑰登錄。Ubuntu 16.04 也能做實(shí)驗(yàn)但系統(tǒng)已經(jīng)進(jìn)入 EOL 狀態(tài)apt 源默認(rèn)指向的 archive 地址失效安裝前需要手動(dòng)把源改成 old-releases對(duì)新手來說又多了一道工序。因此建議直接下載 18.04 的桌面版鏡像安裝時(shí)選擇“清除整個(gè)磁盤并安裝 Ubuntu”虛擬機(jī)里不需要雙系統(tǒng)后面所有操作都在虛擬機(jī)內(nèi)完成。若你已經(jīng)裝好了 VMware 加 CentOS 7 的環(huán)境也可以繼續(xù)用只是配置文件路徑和 JDK 安裝方式和本文有差異。Hadoop 3.1.3 在 CentOS 7 上同樣能跑第 5 章的 DataNode 排查部分我會(huì)把這個(gè)差異單獨(dú)講。2.2 VirtualBox 安裝與虛擬機(jī)創(chuàng)建參數(shù)VirtualBox 6.1.4 的 Windows 安裝包從官方倉庫下載約 100MB安裝過程一路默認(rèn)即可不需要額外勾選擴(kuò)展包。創(chuàng)建虛擬機(jī)時(shí)有幾個(gè)參數(shù)會(huì)影響后面的實(shí)驗(yàn)列一張表說明參數(shù)項(xiàng)推薦值說明內(nèi)存4096 MBHadoop 偽分布式啟動(dòng)多個(gè) Java 進(jìn)程2048 MB 會(huì)比較緊張磁盤20 GB 動(dòng)態(tài)分配Hadoop 安裝包加日志數(shù)據(jù)約 5 GB20 GB 留出編譯和快照空間顯存16 MBUbuntu 桌面版顯示足夠網(wǎng)絡(luò)NAT Host-OnlyNAT 用于虛擬機(jī)上網(wǎng)Host-Only 用于宿主機(jī) SSH 連接CPU 核數(shù)2啟動(dòng)編譯或跑 MapReduce 時(shí)更快磁盤格式選 VDI動(dòng)態(tài)分配實(shí)際占用會(huì)隨著數(shù)據(jù)增長變大不用一開始就分滿。網(wǎng)絡(luò)部分如果只做實(shí)驗(yàn)NAT 模式默認(rèn)就能訪問外網(wǎng)虛擬機(jī)內(nèi)部使用 22 端口 SSH 不受影響但如果計(jì)劃從 Windows 宿主機(jī)直接訪問 Hadoop 的 9870 管理頁面就需要配置端口轉(zhuǎn)發(fā)規(guī)則這一條在第 5 章踩坑部分會(huì)展開。2.3 裝完 Ubuntu 后先補(bǔ)三件套SSH、JDK、apt 源Ubuntu 18.04 安裝完成后我習(xí)慣先把系統(tǒng)源和基礎(chǔ)軟件搞定。VM 里打開終端執(zhí)行以下命令sudo apt update sudo apt upgrade -y sudo apt install -y openssh-server openjdk-8-jdk net-tools這一步同時(shí)完成三件事更新軟件源、安裝 SSH 服務(wù)端、安裝 OpenJDK 8。Hadoop 偽分布式啟動(dòng)腳本會(huì)通過 SSH 連接 localhost 拉起進(jìn)程SSH 是必須的。OpenJDK 8 是 Hadoop 3.1.3 最兼容的 Java 版本JDK 11 也能運(yùn)行但某些老教程里的配置會(huì)不匹配。裝完 JDK 后確認(rèn)一下路徑后面配置 JAVA_HOME 要用readlink -f $(which java)常見輸出為 /usr/lib/jvm/java-8-openjdk-amd64/bin/java去掉末尾的 bin/java 就是 JDK 的主目錄。這個(gè)路徑在配置 ~/.bashrc 和 hadoop-env.sh 時(shí)都會(huì)用到記不住也沒關(guān)系用命令查出來的最準(zhǔn)。3. Linux 命令實(shí)操18 個(gè)高頻命令和它們的易錯(cuò)參數(shù)3.1 目錄切換與查看cd、ls、mkdir、rmdir實(shí)驗(yàn)從 cd /usr/local 開始。切換目錄這個(gè)操作看著基礎(chǔ)但要注意 cd 和 pwd 的區(qū)別cd 是改變當(dāng)前目錄pwd 才是查看當(dāng)前位置。cd .. 回到上一級(jí)cd ~ 回到當(dāng)前用戶的主文件夾也就是 /home/用戶名 這個(gè)位置。這三個(gè)操作在后續(xù)所有實(shí)驗(yàn)里都會(huì)反復(fù)用到尤其是 cd ~因?yàn)?.bashrc 文件就在主文件夾下。ls /usr 查看 /usr 目錄下的所有文件和目錄不帶 -a 參數(shù)時(shí)不會(huì)顯示隱藏文件。ls -l 可以看權(quán)限和所有者后面 chown 命令的驗(yàn)證環(huán)節(jié)會(huì)用到。mkdir 命令有一個(gè)很關(guān)鍵的參數(shù) -p創(chuàng)建多級(jí)目錄時(shí)不加它就會(huì)報(bào)錯(cuò)cd /tmp mkdir a mkdir -p a1/a2/a3/a4第一條 mkdir a 在 /tmp 下創(chuàng)建單層目錄沒有問題。第二條 mkdir a1/a2/a3/a4 要求父目錄 a1、a2、a3 都不存在沒有 -p 時(shí)系統(tǒng)直接提示 No such file or directory。加了 -p 后命令會(huì)遞歸創(chuàng)建整條路徑。這個(gè)參數(shù)在寫部署腳本時(shí)幾乎是標(biāo)配比如創(chuàng)建日志目錄 mkdir -p /var/log/app/today。rmdir 刪除空目錄的限制是很多人的第一個(gè)絆腳石。rmdir /tmp/a 可以刪除空目錄 a但要?jiǎng)h除 a1/a2/a3/a4 這條鏈直接執(zhí)行 rmdir a1/a2/a3/a4 只會(huì)把最內(nèi)層的 a4 刪掉因?yàn)閯h除 a4 后 a3 變成空目錄但 a1、a2 仍非空。我一般會(huì)直接 rmdir -p a1/a2/a3/a4它會(huì)遞歸刪除路徑上所有變?yōu)榭盏母改夸浺徊降轿弧?.2 文件復(fù)制、移動(dòng)與刪除cp、mv、rm 的細(xì)節(jié)差別cp 命令最容易翻車的是漏掉 -r 參數(shù)。復(fù)制單文件到新位置并改名cp ~/.bashrc /usr/bashrc1這條命令成功的前提是目標(biāo)位置 /usr 存在且當(dāng)前用戶有寫權(quán)限實(shí)際操作中可能遇到 Permission denied因?yàn)?/usr 屬于 root普通用戶沒有寫入權(quán)限需要 sudo 執(zhí)行。實(shí)驗(yàn)環(huán)境里如果用 hadoop 用戶操作建議先 sudo chown -R hadoop:hadoop /usr 或改用 sudo cp。復(fù)制目錄時(shí)必須加 -rmkdir /tmp/test cp -r /tmp/test /usr/testcp -r 表示遞歸復(fù)制整個(gè)目錄樹不加 -r 時(shí)系統(tǒng)會(huì)提示 omitting directory這是 Linux 命令里出現(xiàn)頻率最高的報(bào)錯(cuò)信息之一。mv 命令同時(shí)承擔(dān)移動(dòng)和更名兩個(gè)職責(zé)mv /usr/bashrc1 /usr/test/bashrc1 mv /usr/test /usr/test2mv 把 bashrc1 從 /usr 移動(dòng)到 /usr/test 目錄下文件內(nèi)容不變把 /usr/test 重命名為 /usr/test2原地改名。理解 mv 的規(guī)則就是目標(biāo)路徑是目錄就移動(dòng)進(jìn)去目標(biāo)路徑不存在或目標(biāo)路徑帶新名字就是更名。rm 命令的坑主要在目錄刪除上rm /usr/test2/bashrc1 rm -r /usr/test2rm 刪文件不需要參數(shù)rm 刪目錄必須加 -r。很多新手在這一步只輸入 rm /usr/test2系統(tǒng)報(bào)錯(cuò) Is a directory 后不知所措解決辦法就是加 -r。至于 rm -rf 這個(gè)組合實(shí)驗(yàn)里可以用但要養(yǎng)成好習(xí)慣敲之前確認(rèn)路徑變量非空否則一條 rm -rf /usr/local/${DIR}/ 在變量為空時(shí)會(huì)變成刪根目錄這是運(yùn)維工程師的血淚教訓(xùn)。3.3 文件內(nèi)容查看cat、tac、more、head、tail 全家桶cat ~/.bashrc tac ~/.bashrc more ~/.bashrc head -n 20 ~/.bashrc tail -n 20 ~/.bashrc head -n -50 ~/.bashrc tail -n 50 ~/.bashrccat 正序輸出全文tac 倒序輸出全文兩個(gè)命令的拼寫恰好相反。more 適合長文件分頁查看按空格翻頁、按 q 退出它在 bash 腳本里的用處更大。head -n 20 取前 20 行tail -n 20 取最后 20 行這兩個(gè)參數(shù)最直觀。head -n -50 表示從文件開頭顯示到倒數(shù)第 50 行之前也就是不顯示最后 50 行tail -n 50 表示從第 50 行開始顯示到文件末尾。這兩個(gè)帶正負(fù)號(hào)的參數(shù)容易記反我的記憶方式是head 管開頭負(fù)數(shù)代表去掉尾部tail 管末尾正數(shù)代表從第幾行開始。實(shí)驗(yàn)里要求“后面 50 行不顯示”用 head -n -50“只列出 50 行以后的數(shù)據(jù)”用 tail -n 50兩個(gè)場(chǎng)景剛好互補(bǔ)。3.4 屬性修改、文件查找與壓縮touch、chown、find、tar、greptouch /tmp/hello touch -d 5 days ago /tmp/hello chown root:root /tmp/hello find ~ -name .bashrc tar -czvf test.tar.gz /test tar -xzvf test.tar.gz -C /tmp grep examples ~/.bashrctouch 第一次執(zhí)行創(chuàng)建空文件 hello第二次執(zhí)行修改文件時(shí)間戳。-d 5 days ago 把修改時(shí)間調(diào)整為 5 天前。chown root:root 把文件所有者和所屬組都改成 root改完用 ls -l 驗(yàn)證能看到文件所有者列變成 root。find ~ -name .bashrc 在主目錄下按名稱精確查找文件注意 find 的查找路徑要寫成絕對(duì)路徑或相對(duì)路徑這里 ~ 會(huì)被展開成 /home/用戶名。tar 命令的參數(shù)組合需要逐個(gè)拆開理解-c 創(chuàng)建歸檔-z 用 gzip 壓縮-v 顯示處理過程-f 指定歸檔文件名順序固定寫作 -czvf。解壓時(shí)用 -xzvf其中 -x 表示解包。最后 -C /tmp 指定解壓目標(biāo)目錄這個(gè)參數(shù)在安裝軟件時(shí)很常用把壓縮包解壓到指定位置。grep examples ~/.bashrc 從 ~/.bashrc 里查找包含字符串 examples 的行輸出的每一行都會(huì)高亮匹配部分。這個(gè)命令在后面看日志、搜配置時(shí)是最常用的排查工具第 5 章排查 DataNode 問題時(shí)也要靠它定位配置路徑。3.5 環(huán)境變量配置vim 編輯 ~/.bashrc 設(shè)置 JAVA_HOMEvim ~/.bashrc在文件末尾追加兩行export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export PATH$PATH:$JAVA_HOME/bin保存退出后執(zhí)行 source ~/.bashrc 使配置立即生效最后用 echo $JAVA_HOME 驗(yàn)證source ~/.bashrc echo $JAVA_HOME這一步實(shí)驗(yàn)要求里明確寫了“查看 JAVA_HOME 變量的值”很多同學(xué)配置完忘了 source導(dǎo)致 echo 出來是空值以為配置失敗。實(shí)際上 vim 編輯后當(dāng)前 shell 會(huì)話不會(huì)自動(dòng)加載新的環(huán)境變量必須 source 或重新登錄。PATH 那行使用 $PATH 追加而非覆蓋這是環(huán)境變量配置的黃金規(guī)則永遠(yuǎn)不要寫成 export PATH$JAVA_HOME/bin否則系統(tǒng)原來的命令路徑全丟了連 ls 都會(huì)找不到。4. Hadoop 3.1.3 偽分布式安裝解壓、改配置、格式化一次走完4.1 解壓安裝與目錄規(guī)劃從 Hadoop 官網(wǎng)下載 hadoop-3.1.3.tar.gz 后我一般習(xí)慣把它解壓到 /usr/local 并改名為 hadoopcd /usr/local sudo tar -xzf hadoop-3.1.3.tar.gz sudo mv hadoop-3.1.3 hadoop sudo chown -R hadoop:hadoop /usr/local/hadoop這里把目錄所有者改成當(dāng)前實(shí)驗(yàn)用戶避免后續(xù)每次操作都要 sudo因?yàn)?Hadoop 集群啟動(dòng)后會(huì)往 logs 和 tmp 目錄寫數(shù)據(jù)如果目錄屬于 root普通用戶的啟動(dòng)腳本會(huì)報(bào)權(quán)限錯(cuò)誤。chown -R 遞歸修改整個(gè)目錄樹的所有者包括 hadoop-env.sh 等配置文件。解壓后的目錄結(jié)構(gòu)里最需要關(guān)注的是 etc/hadoop配置文件、sbin啟動(dòng)腳本、bin客戶端命令和 shareMapReduce 示例 jar 包。WordCount 示例位于 share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar第 6 章驗(yàn)證時(shí)會(huì)用到。4.2 core-site.xml指定 NameNode 地址與臨時(shí)數(shù)據(jù)目錄vim /usr/local/hadoop/etc/hadoop/core-site.xml在 configuration 節(jié)點(diǎn)內(nèi)寫入configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property /configurationfs.defaultFS 定義 HDFS 的訪問入口偽分布式模式下使用 hdfs://localhost:9000端口 9000 是 NameNode 內(nèi)部通信端口。hadoop.tmp.dir 是集群所有臨時(shí)數(shù)據(jù)的根目錄NameNode 的元數(shù)據(jù)目錄和 DataNode 的數(shù)據(jù)塊目錄都會(huì)自動(dòng)創(chuàng)建在這個(gè)路徑下默認(rèn)是 /tmp/hadoop-hadoop但 /tmp 目錄在系統(tǒng)重啟時(shí)可能被清理所以我總是不厭其煩地建議改成安裝目錄下的固定位置。這個(gè)參數(shù)直接影響第 5 章 DataNode 起不來的故障排查必須記住你配置的路徑。4.3 hdfs-site.xml副本數(shù)、NameNode 與 DataNode 存儲(chǔ)目錄vim /usr/local/hadoop/etc/hadoop/hdfs-site.xmlconfiguration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:/usr/local/hadoop/tmp/dfs/name/value /property property namedfs.datanode.data.dir/name valuefile:/usr/local/hadoop/tmp/dfs/data/value /property /configurationdfs.replication 設(shè)置副本數(shù)為 1是因?yàn)閭畏植际街挥幸慌_(tái)物理機(jī)數(shù)據(jù)本來只存一份副本數(shù)大于 1 也無意義。dfs.namenode.name.dir 和 dfs.datanode.data.dir 顯式指定元數(shù)據(jù)與數(shù)據(jù)塊的存放位置雖然不寫也會(huì)繼承 hadoop.tmp.dir但寫出來有兩個(gè)好處一是排查問題時(shí)能直接找到關(guān)鍵目錄二是避免某些老版本腳本解析路徑時(shí)出錯(cuò)。注意屬性值里的 file: 前綴HDFS 的 URI 格式要求存儲(chǔ)路徑以 file: 開頭少了這個(gè)前綴會(huì)解析成 HDFS 自身路徑導(dǎo)致啟動(dòng)時(shí)目錄創(chuàng)建失敗。這是一個(gè)很容易忽略的格式細(xì)節(jié)我在好幾個(gè)環(huán)境里都見過因此啟動(dòng)失敗的案例。4.4 hadoop-env.sh 與格式化啟動(dòng)vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh找到 JAVA_HOME 那一行取消注釋并改成實(shí)際 JDK 路徑export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64hadoop-env.sh 里的 JAVA_HOME 是 Hadoop 各啟動(dòng)腳本直接讀取的變量。如果你只在 ~/.bashrc 里配了 JAVA_HOMEstart-dfs.sh 依然會(huì)報(bào)錯(cuò) JAVA_HOME is not set因?yàn)槟_本在通過 SSH 執(zhí)行遠(yuǎn)程命令時(shí)不會(huì)加載交互式 shell 的環(huán)境變量。這個(gè)坑的經(jīng)典程度大概僅次于 DataNode 起不來。啟動(dòng)前先配置 SSH 免密ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys ssh localhostssh-keygen 的 -P 表示生成空密碼密鑰-f 指定輸出文件路徑。公鑰追加到 authorized_keys 后chmod 600 設(shè)置文件權(quán)限SSH 對(duì)密鑰文件的權(quán)限要求很嚴(yán)格權(quán)限過寬會(huì)直接拒絕加載。最后 ssh localhost 能直接進(jìn)入 shell 就代表免密生效。格式化與啟動(dòng)hdfs namenode -format start-dfs.sh jpshdfs namenode -format 指令執(zhí)行時(shí)系統(tǒng)會(huì)在 NameNode 元數(shù)據(jù)目錄里生成 VERSION 文件里面包含 clusterId。這個(gè) clusterId 是整個(gè)集群的身份標(biāo)識(shí)。start-dfs.sh 啟動(dòng)所有 HDFS 進(jìn)程jps 查看進(jìn)程列表。正常狀態(tài)應(yīng)該看到 NameNode、DataNode、SecondaryNameNode 三個(gè)進(jìn)程。只有看到這三個(gè)進(jìn)程HDFS 才算真正起來了。5. 避坑排查DataNode 起不來與 Cluster-Id 不一致的完整記錄5.1 現(xiàn)象jps 少了 DataNode9870 頁面 LiveNode 為 0我用某模擬項(xiàng)目 X 的實(shí)驗(yàn)環(huán)境部署 Hadoop 3.1.3 時(shí)第一次啟動(dòng)集群一切正常但執(zhí)行了幾次格式化操作后重啟集群發(fā)現(xiàn) jps 輸出里只剩 NameNode 和 SecondaryNameNodeDataNode 進(jìn)程完全消失。瀏覽器訪問 :9870 端口能看到 NameNode 的 Web 管理頁面但 Live Nodes 數(shù)量是 0。當(dāng)時(shí)第一反應(yīng)是 start-dfs.sh 有問題反復(fù) stop-all.sh 再 start-all.shDataNode 還是起不來這個(gè)問題卡了將近一個(gè)小時(shí)。5.2 原因多次 namenode -format 導(dǎo)致 clusterId 不一致排查方向轉(zhuǎn)向日志。Hadoop 的日志都寫在 $HADOOP_HOME/logs 目錄下DataNode 的日志文件名是 hadoop-hadoop-datanode-主機(jī)名.log用 tail 看末尾幾十行tail -50 /usr/local/hadoop/logs/hadoop-hadoop-datanode-*.log日志里有一句關(guān)鍵信息namenode clusterID 與 datanode clusterID 不匹配DataNode 拒絕注冊(cè)。原因鏈條很清楚第一次執(zhí)行 hdfs namenode -format 時(shí)NameNode 生成一個(gè) clusterId寫入 dfs/name 目錄的 VERSION 文件DataNode 啟動(dòng)時(shí)在 dfs/data 目錄也會(huì)生成一份帶 clusterId 的 VERSION。如果之后再次執(zhí)行 namenode -formatNameNode 會(huì)生成一個(gè)全新的 clusterId但 DataNode 數(shù)據(jù)目錄里還是舊 clusterId。兩邊對(duì)不上DataNode 就只能不斷重試、最終放棄啟動(dòng)。這個(gè)問題的誘因很常見實(shí)驗(yàn)中途遇到進(jìn)程異常想當(dāng)然地重新格式化以為 format 是萬能后悔藥結(jié)果反而制造了新故障。格式化操作在集群已經(jīng)初始化過后不應(yīng)該重復(fù)執(zhí)行除非確認(rèn)要清空所有數(shù)據(jù)。5.3 解決刪除指定數(shù)據(jù)目錄并重新格式化解決辦法是清除所有舊的元數(shù)據(jù)和數(shù)據(jù)目錄讓兩個(gè)節(jié)點(diǎn)的 clusterId 重新一致stop-all.sh rm -rf /usr/local/hadoop/tmp/dfs hdfs namenode -format start-all.sh jps執(zhí)行前先確認(rèn)數(shù)據(jù)目錄到底在哪因?yàn)檎E渲眠^的 core-site.xml 通常會(huì)指定 hadoop.tmp.dir數(shù)據(jù)路徑往往是 $HADOOP_HOME/tmp 或你自定義的目錄。用 grep 在配置里查一下最穩(wěn)grep -A 1 hadoop.tmp.dir /usr/local/hadoop/etc/hadoop/core-site.xml我當(dāng)時(shí)的 core-site.xml 里配的是 /usr/local/hadoop/tmp所以執(zhí)行 rm -rf /usr/local/hadoop/tmp/dfs 刪除整個(gè) dfs 子目錄包括 name 和 data。重新 format 后NameNode 生成新的 clusterIdDataNode 啟動(dòng)時(shí)發(fā)現(xiàn)本地 data 目錄不存在會(huì)創(chuàng)建新目錄并接受 NameNode 的 clusterId兩邊一致進(jìn)程就恢復(fù)正常了。如果你用 VMware 里的 CentOS 7 做實(shí)驗(yàn)且配置的路徑是 /opt/module/hadoop-3.1.3/data那就要?jiǎng)h /opt/module/hadoop-3.1.3/data 整個(gè)目錄原理完全一樣。當(dāng)時(shí)實(shí)驗(yàn)報(bào)告里記錄的問題解決方法就是刪除 core-site.xml 中指定的緩存數(shù)據(jù)路徑然后重新格式化用 stop-all.sh 和 start-all.sh 重啟集群解決。5.4 另外三個(gè)高頻坑卡密碼、端口不通、JAVA_HOME 沒寫進(jìn)文件現(xiàn)象一start-dfs.sh 執(zhí)行到 localhost 時(shí)卡住提示輸入密碼。原因SSH 免密沒有配置成功多半是 authorized_keys 文件權(quán)限不對(duì)或者公鑰沒有正確追加。解決方式確認(rèn) ~/.ssh 目錄權(quán)限是 700authorized_keys 權(quán)限是 600然后手動(dòng)執(zhí)行 ssh localhost 看是否能直接登錄如果還需要密碼就重新執(zhí)行 ssh-keygen 和追加公鑰的流程。現(xiàn)象二宿主機(jī)瀏覽器訪問虛擬機(jī) 9870 頁面打不開。原因VirtualBox NAT 模式下宿主機(jī)無法直接訪問虛擬機(jī)內(nèi)的端口KVM 或 VMware 的 NAT 也一樣需要轉(zhuǎn)發(fā)規(guī)則。解決方式在 VirtualBox 設(shè)置中配置端口轉(zhuǎn)發(fā)規(guī)則把宿主機(jī)的 9870 端口映射到虛擬機(jī) IP 的 9870 端口或者在虛擬機(jī)內(nèi)用 curl http://localhost:9870 先驗(yàn)證服務(wù)本身正常排除服務(wù)端問題后再處理網(wǎng)絡(luò)映射。現(xiàn)象三執(zhí)行 start-dfs.sh 報(bào)錯(cuò) JAVA_HOME is not set and could not be found。原因只在 ~/.bashrc 配了環(huán)境變量hadoop-env.sh 文件里的 JAVA_HOME 還是空值。解決方式編輯 etc/hadoop/hadoop-env.sh把 export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 寫到文件里注意不要加空格和引號(hào)重啟集群后生效。6. 驗(yàn)證跑通WordCount 實(shí)例與 HDFS 文件操作檢查6.1 用自帶 WordCount 驗(yàn)證 MapReduce 鏈路集群啟動(dòng)后最可靠的驗(yàn)證方式不是只看 jps而是真正跑一個(gè) MapReduce 作業(yè)。Hadoop 3.1.3 自帶 wordcount 示例位于 share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar。先創(chuàng)建 HDFS 測(cè)試目錄并上傳文件hdfs dfs -mkdir -p /user/hadoop/test hdfs dfs -put ~/.bashrc /user/hadoop/test/ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/hadoop/test /user/hadoop/output hdfs dfs -cat /user/hadoop/output/part-r-00000hdfs dfs -mkdir -p 在 HDFS 上遞歸創(chuàng)建目錄-put 將本地文件上傳到 HDFS。hadoop jar 命令提交 WordCount 作業(yè)參數(shù)依次是 jar 包路徑、示例類名、輸入目錄和輸出目錄。作業(yè)執(zhí)行完畢后輸出目錄下會(huì)生成 part-r-00000 文件用 hdfs dfs -cat 查看內(nèi)容能看到 .bashrc 里每個(gè)單詞及其出現(xiàn)次數(shù)說明整個(gè) HDFS 加 MapReduce 的鏈路是通的。6.2 HDFS 文件操作驗(yàn)證清單實(shí)驗(yàn)要求里有一組 HDFS 操作按順序跑一遍即可確認(rèn)環(huán)境沒有問題hdfs dfs -ls /user/hadoop/test hdfs dfs -cp /user/hadoop/test/.bashrc /user/hadoop/test/bashrc_copy hdfs dfs -get /user/hadoop/test/bashrc_copy /usr/local/hadoop/-ls 查看目錄列表對(duì)比本地文件系統(tǒng)HDFS 的路徑以 /user/hadoop 開頭。-cp 在 HDFS 內(nèi)部復(fù)制文件驗(yàn)證副本寫入能力。-get 將 HDFS 文件下載到本地 /usr/local/hadoop 目錄對(duì)應(yīng)實(shí)驗(yàn)要求里“將 HDFS 文件夾 test 復(fù)制到 Linux 系統(tǒng)本地”的步驟。最后再用 jps 和 9870 頁面確認(rèn)一遍進(jìn)程狀態(tài)WordCount 的輸出文件和下載到本地的 bashrc_copy 都驗(yàn)證了 HDFS 的讀寫能力。從那以后我每次搭建 Hadoop 環(huán)境都會(huì)強(qiáng)制走完這一整套流程jps 查進(jìn)程、9870 看 LiveNode、WordCount 跑一個(gè)真實(shí)作業(yè)再執(zhí)行一輪 HDFS 文件上傳下載。這套驗(yàn)證流程把環(huán)境問題擋在實(shí)驗(yàn)開始之前希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取