搭建Hadoop偽分布式環(huán)境:從零開始的大數(shù)據(jù)入門實(shí)驗(yàn))
簡(jiǎn)介面向大數(shù)據(jù)入門讀者的實(shí)驗(yàn)一配套文檔系統(tǒng)講解Linux操作與Hadoop操作的基礎(chǔ)訓(xùn)練。內(nèi)容圍繞三個(gè)核心目標(biāo)展開掌握Linux虛擬機(jī)安裝、熟悉常用Linux命令、完成Hadoop偽分布式安裝適合正在準(zhǔn)備大數(shù)據(jù)課程實(shí)驗(yàn)或需要搭建單機(jī)實(shí)驗(yàn)環(huán)境的在校學(xué)生與自學(xué)者。壓縮包內(nèi)包含1個(gè)docx文件大小289KB文檔結(jié)構(gòu)清晰覆蓋實(shí)驗(yàn)?zāi)康摹⑵脚_(tái)選擇、操作命令詳解與知識(shí)點(diǎn)總結(jié)可直接打印或者對(duì)照步驟上機(jī)練習(xí)。目前已有974人學(xué)習(xí)下載是同類入門實(shí)驗(yàn)中較常被參考的一份。文件重點(diǎn)演示cd、ls、mkdir、rmdir、cp、mv、rm、cat、tac等常用命令并結(jié)合Hadoop 3.1.3給出偽分布式安裝及基礎(chǔ)Shell操作說(shuō)明包含WordCount實(shí)例驗(yàn)證思路同時(shí)補(bǔ)充Java環(huán)境變量配置、tar壓縮解壓、find與grep檢索等實(shí)用操作幫助讀者快速打通大數(shù)據(jù)實(shí)驗(yàn)的起步環(huán)節(jié)。1. 聽到 Hadoop 就頭大它到底是什么這門實(shí)驗(yàn)到底在帶你做什么第一次接觸大數(shù)據(jù)實(shí)操課很多人都會(huì)在同一個(gè)地方懵住課還沒怎么開始老師先讓你把 Linux 虛擬機(jī)裝起來(lái)接著在里面敲一堆看不懂的命令最后再裝一個(gè)叫 Hadoop 的東西。這里的關(guān)鍵詞其實(shí)只有兩個(gè)——大數(shù)據(jù)和 Linux。Hadoop 是目前大數(shù)據(jù)處理繞不開的基礎(chǔ)框架它能用一堆普通電腦組成集群一起處理海量數(shù)據(jù)而 Hadoop 在 Linux 上運(yùn)行最穩(wěn)定、生態(tài)工具也最全。所以這堂入門實(shí)驗(yàn)的本質(zhì)就是帶你做三件事裝出你的第一臺(tái) Linux 虛擬機(jī)、練熟最常用的 Linux 命令、再在單機(jī)上把 Hadoop 的偽分布式環(huán)境跑起來(lái)親手完成幾個(gè)文件操作。如果你現(xiàn)在連“終端”在哪里都還不知道完全不用慌這篇就是給你準(zhǔn)備的。讀完你就能明白每一步在干什么也能照著自己動(dòng)手做一遍。2. 先把地基打好為什么 Windows 上必須裝一臺(tái) Linux 虛擬機(jī)很多新手拿到實(shí)驗(yàn)指導(dǎo)書的第一反應(yīng)是“我電腦就是 Windows直接在 Windows 上裝 Hadoop 不行嗎” 行但你會(huì)把自己坑得很慘。這一章就把虛擬機(jī)這件事講透順便給你一條能走通的安裝路徑。2.1 為什么非要在 Linux 上跑 HadoopHadoop 的設(shè)計(jì)目標(biāo)、測(cè)試環(huán)境和主流生產(chǎn)部署幾乎全部圍繞 Linux 展開。它的啟動(dòng)腳本是 Shell 腳本它管理文件依賴 Linux 的用戶權(quán)限體系它生態(tài)里的大多數(shù)配套工具默認(rèn)只發(fā)布 Linux 版本。你可以把 Hadoop 想象成一位在特定廚房里練了十年手藝的廚師換一間廚房也能做菜但處處不對(duì)勁。在 Windows 上硬裝 Hadoop 不是不可能但你會(huì)遇到很多“別人沒遇到過(guò)”的問(wèn)題。比如教程里寫的路徑是 /usr/local/hadoopWindows 上要改成盤符教程里說(shuō)用 chown 改文件歸屬Windows 上沒有這個(gè)概念。對(duì)一個(gè)零基礎(chǔ)新手來(lái)說(shuō)跟著主流走就是少踩坑。那虛擬機(jī)是什么簡(jiǎn)單說(shuō)就是用軟件在你現(xiàn)有電腦里“模擬出另一臺(tái)完整電腦”。這臺(tái)虛擬電腦有自己的硬盤、內(nèi)存、網(wǎng)卡你可以在里面安裝 Ubuntu 系統(tǒng)。對(duì)你來(lái)說(shuō)它只是個(gè)窗口里的桌面對(duì) Ubuntu 來(lái)說(shuō)它以為自己獨(dú)占了一臺(tái)機(jī)器。凡是教程里說(shuō) Linux 能做到的事在虛擬機(jī)里都能做。我第一次學(xué)的時(shí)候也覺得多此一舉后來(lái)才發(fā)現(xiàn) Hadoop 的啟動(dòng)腳本全是 .sh 文件這些腳本在 Linux 里就是原生應(yīng)用雙擊不行、要在終端里跑這條路走通之后后面所有實(shí)驗(yàn)都順暢了。2.2 用 VirtualBox 裝 Ubuntu可視化步驟清單實(shí)驗(yàn)平臺(tái)推薦使用 VirtualBox 和 Ubuntu 18.04或 16.04。這兩個(gè)都是免費(fèi)資源下載渠道在各自官網(wǎng)就能找到。整個(gè)安裝過(guò)程大概半小時(shí)核心步驟是這么幾條在 Windows 上安裝 VirtualBox。一路“下一步”即可安裝完成后建議重啟一次電腦讓驅(qū)動(dòng)生效。下載 Ubuntu 18.04 的桌面版鏡像文件后綴是 .iso。鏡像就是一張“虛擬光盤”虛擬機(jī)要依靠它來(lái)安裝系統(tǒng)。打開 VirtualBox點(diǎn)擊“新建”給虛擬機(jī)起個(gè)名字類型選 Linux版本選 Ubuntu 64-bit。分配內(nèi)存。建議給 2GB 到 4GB。如果你電腦內(nèi)存總共只有 8GB給虛擬機(jī) 2GB 也能跑只是慢一點(diǎn)低于 2GB 會(huì)非常吃力。創(chuàng)建虛擬硬盤。建議 20GB 起步類型選默認(rèn)的 VDI 就行。設(shè)置里加載 Ubuntu 鏡像在“存儲(chǔ)”里把剛才下載的 .iso 掛載到光驅(qū)位置然后啟動(dòng)虛擬機(jī)。虛擬機(jī)屏幕里會(huì)進(jìn)入 Ubuntu 安裝界面選“Install Ubuntu”按提示選語(yǔ)言、時(shí)區(qū)、鍵盤布局設(shè)置一個(gè)用戶名和密碼。安裝完成后重啟進(jìn)入 Ubuntu 桌面整個(gè)流程就走完了。提示安裝過(guò)程中如果虛擬窗口很小先別管裝完系統(tǒng)后裝“增強(qiáng)功能”就能全屏使用。裝完系統(tǒng)先別急著開始還有三件小事要處理見下一節(jié)。2.3 裝完系統(tǒng)先做三件小事第一件是更新軟件源。終端里執(zhí)行 sudo apt update作用是讓系統(tǒng)拿到最新的軟件清單后面的安裝才不會(huì)找不到包。第二件是安裝 SSH 服務(wù)。這一步和本實(shí)驗(yàn)強(qiáng)相關(guān)Hadoop 的各個(gè)角色之間通信要用 SSH偽分布式雖然在一臺(tái)機(jī)器上跑但 NameNode 連接 DataNode 時(shí)會(huì)用它。所以我們要裝 openssh-server并配置免密登錄。聽起來(lái)很玄其實(shí)就是“辦一張門禁卡”讓 Hadoop 進(jìn)程自己進(jìn)門不用輸密碼。# 安裝 SSH 服務(wù)端 sudo apt install -y openssh-server # 生成一張“門禁卡”密鑰按三次回車即可 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa # 把公鑰寫進(jìn)授權(quán)列表 cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys # 測(cè)試免密登錄如果能直接進(jìn)到 shell 說(shuō)明成功退出用 exit ssh localhost第三件是確認(rèn) Java 環(huán)境。Hadoop 跑在 Java 之上實(shí)驗(yàn)要求配置 JAVA_HOME前提是系統(tǒng)里已經(jīng)裝了 JDK。在終端執(zhí)行 java -version如果提示找不到命令先去裝一個(gè) JDK記住你安裝的路徑后面配置環(huán)境變量要用。2.4 初次登錄需要建立的兩個(gè)直覺第一次進(jìn) Ubuntu 桌面大部分人都會(huì)有點(diǎn)迷。你需要建立兩個(gè)直覺第一終端是一個(gè)“和電腦對(duì)話的輸入框”。圖形界面里點(diǎn)鼠標(biāo)能做的事在終端里敲命令也能做而且更適合批量操作。終端通常在左側(cè)任務(wù)欄里或者按 CtrlAltT 打開。第二sudo 的意思是“以管理員權(quán)限執(zhí)行這條命令”。類比 Windows 里的“以管理員身份運(yùn)行”它不改變你的身份只是讓一條命令擁有更高權(quán)限。所以看到 sudo 開頭就是在做系統(tǒng)級(jí)操作。3. 命令練熟再進(jìn)下一步Linux 常用的 17 個(gè)命令一次講明白實(shí)驗(yàn)要求掌握的 Linux 命令一共有十幾條聽起來(lái)很多但它們其實(shí)分成了清晰的幾組。你不需要背跟著下面的場(chǎng)景過(guò)一遍重點(diǎn)感受“每條命令解決什么問(wèn)題”做完實(shí)驗(yàn)自然就記住了。3.1 先學(xué)會(huì)認(rèn)路cd、ls、pwdLinux 里所有的文件都放在一個(gè)以 / 開頭的目錄樹里。cd 是切換目錄ls 是列出目錄內(nèi)容pwd 是告訴你現(xiàn)在在哪。這三條命令就像手機(jī)地圖里的“定位 瀏覽”。# 切換到 /usr/local 目錄 cd /usr/local # 返回當(dāng)前目錄的上一級(jí) cd .. # 回到當(dāng)前登錄用戶的主文件夾也就是家目錄 cd ~ # 查看 /usr 目錄下有哪些文件和目錄 ls /usr # 顯示當(dāng)前完整路徑 pwd這里有個(gè)新手很容易迷糊的點(diǎn)~/usr/local 和 /usr/local 不是一回事。~ 是當(dāng)前用戶的主目錄/ 是系統(tǒng)根目錄。一條命令帶不帶斜杠開頭含義可能完全不同。遇到路徑不確定時(shí)先 pwd 確認(rèn)自己站在哪里。3.2 新建和刪除目錄mkdir、rmdir、touchmkdir 是新建目錄rmdir 是刪除空目錄touch 是創(chuàng)建空文件。實(shí)驗(yàn)里有個(gè)經(jīng)典練習(xí)在 /tmp 下創(chuàng)建 a1/a2/a3/a4 這種多級(jí)目錄用 mkdir -p 一步到位。# 進(jìn)入 /tmp創(chuàng)建目錄 a cd /tmp mkdir a # 創(chuàng)建多級(jí)目錄 a1/a2/a3/a4 mkdir -p a1/a2/a3/a4 # 刪除空目錄 a rmdir a # 刪除多級(jí)空目錄 a1/a2/a3/a4會(huì)從最內(nèi)層開始刪 rmdir -p a1/a2/a3/a4 # 在 /tmp 下創(chuàng)建一個(gè)空文件 hellols -l 可以查看它的時(shí)間 touch hellormdir 只能刪空目錄如果里面有文件就會(huì)報(bào)錯(cuò)。這是 Linux 的一個(gè)保護(hù)機(jī)制防止你誤刪有內(nèi)容的目錄。想刪非空目錄要等下文的 rm -r 出場(chǎng)。3.3 文件的復(fù)制、移動(dòng)、改名、刪除cp、mv、rm這四條是日常用得最頻繁的命令。cp 負(fù)責(zé)復(fù)制mv 負(fù)責(zé)移動(dòng)和改名rm 負(fù)責(zé)刪除。實(shí)驗(yàn)中還涉及 chown 這個(gè)命令用來(lái)修改文件所有者也是文件操作的重要一環(huán)。# 把家目錄下的 .bashrc 復(fù)制到 /usr 下并重命名為 bashrc1 cp ~/.bashrc /usr/bashrc1 # 在 /tmp 下新建目錄 test再?gòu)?fù)制到 /usr 下 mkdir /tmp/test cp -r /tmp/test /usr/ # 把 /usr/bashrc1 移動(dòng)到 /usr/test 目錄里 mv /usr/bashrc1 /usr/test/ # 把 /usr/test 重命名為 test2 mv /usr/test /usr/test2 # 刪除 /usr/test2 里的 bashrc1 rm /usr/test2/bashrc1 # 刪除整個(gè) test2 目錄-r 表示遞歸刪除 rm -r /usr/test2 # 把 hello 文件所有者改成 root需要管理員權(quán)限 sudo chown root /tmp/hello特別注意 rm -r 和 rm -rf。Linux 刪除文件沒有回收站刪了就真的沒了。r 表示遞歸刪除目錄里的所有內(nèi)容f 表示強(qiáng)制刪除不詢問(wèn)。新手對(duì)這兩個(gè)參數(shù)一定要保持敬畏不確定自己在刪什么的時(shí)候先 ls 看清楚再動(dòng)手。3.4 查看文件內(nèi)容cat、tac、more、head、tail這五個(gè)命令都是“打開文件看內(nèi)容”但視角不同。實(shí)驗(yàn)里反復(fù)拿家目錄的 .bashrc 做練習(xí)你跟著過(guò)一遍就有感覺了。命令行為適合場(chǎng)景cat從頭到尾一口氣輸出全部?jī)?nèi)容文件短的時(shí)候tac從最后一行開始反向輸出偶爾想倒著看more一頁(yè)一頁(yè)翻動(dòng)按空格翻頁(yè)文件很長(zhǎng)、想慢慢看head只看開頭默認(rèn) 10 行快速確認(rèn)格式tail只看結(jié)尾默認(rèn) 10 行看日志最新輸出# 正著看 .bashrc 全部?jī)?nèi)容 cat ~/.bashrc # 反著看 .bashrc tac ~/.bashrc # 分頁(yè)查看按 q 退出 more ~/.bashrc # 查看前 20 行 head -n 20 ~/.bashrc # 查看最后 20 行 tail -n 20 ~/.bashrchead 和 tail 的 -n 參數(shù)表示“幾行”這是最常見的用法。等你以后接觸了 Hadoop 日志會(huì)經(jīng)常用 tail 看日志尾部的最新報(bào)錯(cuò)信息那時(shí)你就知道這會(huì)比打開整個(gè)文件高效多少。3.5 查找、打包、搜字符串find、grep、tarfind 按名字找文件grep 在文件內(nèi)容里找字符串tar 負(fù)責(zé)打包和解壓。這三個(gè)都是“檢索類”命令方向不同find 管文件位置grep 管內(nèi)容匹配tar 管歸檔搬運(yùn)。# 在家目錄下找文件名為 .bashrc 的文件 find ~ -name .bashrc # 在 .bashrc 里查找字符串 examples帶行號(hào)顯示 grep -n examples ~/.bashrc # 在根目錄 / 下新建文件夾 test然后打包成 test.tar.gz cd / tar -zcvf test.tar.gz test # 把 /test.tar.gz 解壓到 /tmp 目錄 tar -zxvf /test.tar.gz -C /tmptar 的參數(shù)看起來(lái)嚇人其實(shí)拆開記就行z 表示用 gzip 壓縮c 表示創(chuàng)建打包文件v 表示顯示過(guò)程f 表示后面跟的是文件名解壓時(shí)把 c 換成 x再補(bǔ)一個(gè) -C 指定解壓目標(biāo)目錄。這套記法能覆蓋你 90% 的使用場(chǎng)景。3.6 配置環(huán)境變量讓命令“永久認(rèn)識(shí)自己”實(shí)驗(yàn)的最后一步不是命令而是配置環(huán)境變量。它解決一個(gè)實(shí)際問(wèn)題每次打開終端系統(tǒng)怎么知道你的 Java 裝在哪個(gè)路徑答案是提前把答案寫進(jìn)一個(gè)叫 ~/.bashrc 的文件里終端一啟動(dòng)就會(huì)自動(dòng)讀它。# 用 vim 打開 .bashrc vim ~/.bashrc # 在文件末尾加兩行把路徑替換成你實(shí)際的 JDK 安裝路徑 export JAVA_HOME/usr/lib/jvm/你的JDK路徑 export PATH$PATH:$JAVA_HOME/bin # 保存退出先按 Esc輸入 :wq 再回車 # 讓配置立刻生效 source ~/.bashrc # 驗(yàn)證輸出 JAVA_HOME 的值 echo $JAVA_HOME這里最容易翻車的點(diǎn)是忘記 source。改了 .bashrc 之后當(dāng)前終端不會(huì)自動(dòng)更新必須執(zhí)行 source ~/.bashrc改動(dòng)才算真正生效。如果你發(fā)現(xiàn) echo $JAVA_HOME 輸出是空的十有八九就是漏了這一步。4. Hadoop 偽分布式安裝讓一臺(tái)電腦假裝一個(gè)集群Linux 命令練完接下來(lái)就是重頭戲裝 Hadoop。這一章先講清“偽分布式”到底是個(gè)什么原理再帶你走一遍從下載到驗(yàn)證的完整流程。4.1 偽分布式是什么一個(gè)人分飾多角真實(shí)的大數(shù)據(jù)集群是很多臺(tái)服務(wù)器各司其職有的節(jié)點(diǎn)專門管“文件目錄和檔案索引”叫 NameNode有的節(jié)點(diǎn)專門存“實(shí)際文件內(nèi)容”叫 DataNode還有節(jié)點(diǎn)負(fù)責(zé)任務(wù)調(diào)度叫 ResourceManager。每臺(tái)機(jī)器獨(dú)立運(yùn)行通過(guò)網(wǎng)絡(luò)通信。偽分布式的意思是沒有多臺(tái)機(jī)器只有你這一臺(tái)虛擬機(jī)但要模擬出整個(gè)集群的邏輯。怎么辦同時(shí)啟動(dòng)多個(gè)進(jìn)程每個(gè)進(jìn)程扮演一個(gè)角色。你的電腦既當(dāng) NameNode 又當(dāng) DataNode還當(dāng) ResourceManager??雌饋?lái)是集群實(shí)際上都是同一臺(tái)機(jī)器的進(jìn)程。這個(gè)“偽”字很重要。它能讓你把集群的目錄結(jié)構(gòu)、文件上傳下載、啟動(dòng)停止這些操作完整跑一遍等以后接觸真集群命令幾乎一模一樣只是機(jī)器數(shù)和配置項(xiàng)更多。對(duì)入門者來(lái)說(shuō)這是性價(jià)比最高的環(huán)境。4.2 下載、解壓、準(zhǔn)備環(huán)境Hadoop 官網(wǎng)提供編譯好的壓縮包本實(shí)驗(yàn)使用的是 3.1.3 版本。下載后得到一個(gè) hadoop-3.1.3.tar.gz 文件我們需要把它解壓到 /usr/local/hadoop這個(gè)路徑是實(shí)驗(yàn)里反復(fù)會(huì)用到的地方。# 先確保你已進(jìn)入下載文件所在目錄然后解壓到 /usr/local sudo tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local # 改目錄歸屬避免每次操作都要 sudo把“你的用戶名”換成實(shí)際登錄名 sudo chown -R 你的用戶名 /usr/local/hadoop # 驗(yàn)證版本看到版本號(hào)說(shuō)明解壓和環(huán)境變量都到位了 hadoop version如果 hadoop version 提示找不到命令回到第 3 章最后一步檢查 JAVA_HOME 是否配置并 source 生效。這一步不過(guò)后面所有操作都不必開始。4.3 核心配置文件到底改什么Hadoop 的配置分散在 /usr/local/hadoop/etc/hadoop/ 目錄下的多個(gè) XML 文件里。新手最容易犯的錯(cuò)是想一口氣搞懂所有配置。不用急這次實(shí)驗(yàn)只動(dòng)兩個(gè)文件。core-site.xml 是全局核心配置。我們需要告訴 Hadoop默認(rèn)文件系統(tǒng)地址是什么、臨時(shí)數(shù)據(jù)放在哪里。configuration !-- 默認(rèn)文件系統(tǒng)端口 9000 是 NameNode 的通信端口 -- property namefs.defaultFS/name valuehdfs://localhost:9000/value /property !-- 臨時(shí)數(shù)據(jù)目錄NameNode 和 DataNode 的元數(shù)據(jù)都存在這里 -- property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property /configurationhdfs-site.xml 是 HDFS 的專屬配置。最關(guān)鍵的一項(xiàng)是把副本數(shù)設(shè)為 1。默認(rèn)副本數(shù)是 3意思是同一份數(shù)據(jù)要復(fù)制到三臺(tái)機(jī)器你只有一臺(tái)機(jī)器不改成 1系統(tǒng)會(huì)一直想復(fù)制卻找不到地方日志里各種報(bào)錯(cuò)。configuration !-- 副本數(shù)設(shè)為 1因?yàn)閭畏植际街挥幸慌_(tái)機(jī)器 -- property namedfs.replication/name value1/value /property /configuration提示以后跑 WordCount 等任務(wù)時(shí)通常還要配置 yarn-site.xml。到那一步再按實(shí)驗(yàn)指導(dǎo)書補(bǔ)今天先把 HDFS 跑通。4.4 格式化、啟動(dòng)、驗(yàn)證配置改完后啟動(dòng)流程分三步格式化、啟動(dòng) HDFS、啟動(dòng) YARN。格式化這個(gè)動(dòng)作容易讓人緊張我用白話解釋一下NameNode 啟動(dòng)前要先建立一個(gè)“檔案索引”記錄整個(gè)文件系統(tǒng)有哪些目錄和文件。hdfs namenode -format 就是初始化這個(gè)索引類似于新硬盤買回來(lái)先分區(qū)格式化。它只會(huì)清空 HDFS 的元數(shù)據(jù)不會(huì)刪除你的安裝文件。# 第一步初始化 NameNode 的元數(shù)據(jù) hdfs namenode -format # 第二步啟動(dòng) HDFS啟動(dòng) NameNode、DataNode、SecondaryNameNode start-dfs.sh # 第三步啟動(dòng) YARN啟動(dòng) ResourceManager、NodeManager start-yarn.sh # 第四步用 jps 查看當(dāng)前 Java 進(jìn)程驗(yàn)證各角色是否都起來(lái)了 jps執(zhí)行完 jps 后如果一切正常你應(yīng)該看到 5 個(gè)進(jìn)程N(yùn)ameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager。少一個(gè)就要回到第 5 章排查。最后是瀏覽器驗(yàn)證。打開瀏覽器訪問(wèn) http://localhost:9870這是 Hadoop 3.x 的 HDFS 管理界面。能看到頁(yè)面并且首頁(yè)顯示 Live Nodes 為 1你的偽分布式集群就算真正跑起來(lái)了。注意端口不是常見的 8080 或者 50070Hadoop 3 默認(rèn)是 9870。5. 第一次啟動(dòng)就翻車Hadoop 安裝常見坑與排查指南環(huán)境搭建這一步幾乎所有新手都會(huì)在某個(gè)地方卡住。我自己第一次搭的時(shí)候也折騰到半夜。下面四條是最典型的坑每一條按“現(xiàn)象→原因→解決”的順序?qū)懩阌龅筋愃频膯?wèn)題直接對(duì)照著查。5.1 Datanode 起不來(lái)Live Nodes 顯示 0現(xiàn)象啟動(dòng)完成后jps 里怎么都找不到 DataNode 進(jìn)程或者瀏覽器訪問(wèn) 9870 端口發(fā)現(xiàn) Live Nodes 數(shù)量是 0明明 NameNode 還活著。原因八成是你之前不小心執(zhí)行了多次 hdfs namenode -format。每次格式化都會(huì)生成一個(gè)新的集群 IDCluster ID而 DataNode 啟動(dòng)時(shí)會(huì)拿著自己上次記住的集群 ID 去和 NameNode 核對(duì)。兩邊對(duì)不上DataNode 就拒絕啟動(dòng)。這就好比你搬家換了新小區(qū)門禁密碼舊門禁卡自然刷不開門。誰(shuí)造成的最多反復(fù)格式化的人。解決讓 DataNode 忘掉舊 ID重新認(rèn)識(shí)新 ID。具體做法是找到前文 core-site.xml 里 hadoop.tmp.dir 指定的數(shù)據(jù)目錄把里面的數(shù)據(jù)刪掉然后重新格式化。# 先停掉所有 Hadoop 進(jìn)程 stop-all.sh # 刪除臨時(shí)數(shù)據(jù)目錄路徑要和 core-site.xml 里配的一致 rm -rf /usr/local/hadoop/tmp # 重新初始化 NameNode hdfs namenode -format # 重啟集群 start-all.sh # 再次確認(rèn)進(jìn)程 jps之后再去 9870 頁(yè)面刷新Live Nodes 應(yīng)該顯示 1。記住一個(gè)血淚經(jīng)驗(yàn)正常運(yùn)行的集群永遠(yuǎn)不要去動(dòng)格式化命令。5.2 瀏覽器打不開 9870 頁(yè)面現(xiàn)象輸 http://localhost:9870 之后頁(yè)面一直轉(zhuǎn)圈、拒絕連接或者顯示“無(wú)法訪問(wèn)此網(wǎng)站”。原因分三種情況。第一種是 HDFS 根本沒啟動(dòng)成功jps 里看不到 NameNode第二種是系統(tǒng)防火墻攔截了 9870 端口第三種是你在瀏覽器里訪問(wèn)的地址寫錯(cuò)了比如把 localhost 寫成了虛擬機(jī)的 IP而那個(gè) IP 不對(duì)。解決先做診斷按順序檢查。第一步回終端執(zhí)行 jps看 NameNode 進(jìn)程在不在。不在說(shuō)明啟動(dòng)失敗回去看 5.1。第二步NameNode 在但頁(yè)面打不開執(zhí)行 sudo ufw status 看防火墻是否開啟如果是執(zhí)行 sudo ufw allow 9870 放行端口。第三步確認(rèn)訪問(wèn)地址在虛擬機(jī)本機(jī)用 http://localhost:9870 訪問(wèn)別用別的地址。5.3 配置了環(huán)境變量重開終端又提示命令找不到現(xiàn)象上次明明 export 了 JAVA_HOMEhadoop version 也能用重開一個(gè)終端窗口后再敲 hadoop version 又提示 command not found。原因你只在當(dāng)前終端里執(zhí)行了 export沒有把 export 寫進(jìn) ~/.bashrc。export 的作用范圍僅限于當(dāng)前終端窗口關(guān)掉就沒了。你誤以為“我配過(guò)了”其實(shí)是“我臨時(shí)用了一次”。解決把 export 語(yǔ)句寫進(jìn) ~/.bashrc 文件然后 source 一下。如果你已經(jīng)寫進(jìn)了 .bashrc 還是不行檢查是不是寫錯(cuò)行——比如寫到了 export PATH 之外的地方導(dǎo)致語(yǔ)法被注釋掉開頭多了 #。改完后執(zhí)行 echo $JAVA_HOME能輸出路徑才算真配好。5.4 遇到問(wèn)題就想 rm -rf 清空重來(lái)結(jié)果越搞越糟現(xiàn)象集群某個(gè)進(jìn)程起不來(lái)你第一反應(yīng)是把整個(gè) hadoop 安裝目錄刪掉重新解壓或者不確認(rèn)進(jìn)程狀態(tài)就格式化結(jié)果問(wèn)題沒解決反而把原本好的部分也弄壞了。原因沒分清“安裝文件”和“運(yùn)行時(shí)數(shù)據(jù)”。安裝文件是解壓出來(lái)的那一整套程序刪掉重來(lái)很傷運(yùn)行時(shí)數(shù)據(jù)是 tmp 目錄里由集群自己生成的元數(shù)據(jù)出問(wèn)題時(shí)需要清理的是這些。這兩者的位置不同作用更不同。同時(shí)刪文件前沒先停進(jìn)程系統(tǒng)還在寫這些目錄刪一半鎖死下次啟動(dòng)自然起不來(lái)。解決制定一條紀(jì)律動(dòng)手刪除之前先執(zhí)行 jps 確認(rèn)所有進(jìn)程已停止再確認(rèn)目錄路徑只處理 core-site.xml 里 hadoop.tmp.dir 指向的目錄而不是整個(gè) hadoop 安裝文件夾。不放心的話把同名目錄復(fù)制一份存到別處再刪。格式化命令執(zhí)行前同樣按這條紀(jì)律走一遍流程。6. 用 Shell 指揮 Hadoop從這次實(shí)驗(yàn)到下一個(gè)實(shí)驗(yàn)環(huán)境跑通了最后一步是親手用命令操作 HDFS感受一下“分布式文件系統(tǒng)”和本地文件系統(tǒng)的區(qū)別。這也是實(shí)驗(yàn)的收尾做完它你的第一站就算真正走完了。6.1 hdfs dfs像操作本地文件一樣操作分布式文件系統(tǒng)HDFS 有一套自己的命令體系以 hdfs dfs 開頭。你可以把它理解成“Hadoop 版的文件管理器”只不過(guò)操作不是用鼠標(biāo)而是用命令。# 為 hadoop 用戶在 HDFS 中創(chuàng)建用戶目錄-p 表示父目錄不存在時(shí)自動(dòng)創(chuàng)建 hdfs dfs -mkdir -p /user/hadoop # 在剛才的目錄下創(chuàng)建一個(gè) test 文件夾 hdfs dfs -mkdir /user/hadoop/test # 查看目錄內(nèi)容確認(rèn) test 已存在 hdfs dfs -ls /user/hadoop/test # 把 Linux 本地家目錄下的 .bashrc 上傳到 HDFS 的 test 文件夾 hdfs dfs -put ~/.bashrc /user/hadoop/test/ # 再查看一次能看到 .bashrc 文件就在上面 hdfs dfs -ls /user/hadoop/test/ # 把 HDFS 里的文件下載回本地 /usr/local/hadoop 目錄 hdfs dfs -get /user/hadoop/test/.bashrc /usr/local/hadoop/重點(diǎn)理解一下路徑的差別這里的 /user/hadoop 不是本地磁盤上的目錄而是 HDFS 內(nèi)部的一個(gè)命名空間。它看起來(lái)像 Linux 路徑其實(shí)完全獨(dú)立相當(dāng)于一個(gè)“網(wǎng)盤目錄”。你寫的文件上傳到了 HDFS 里和本地 /usr/local/hadoop 完全不是一回事。這一點(diǎn)理解了后面學(xué) HDFS 的讀寫原理會(huì)輕松很多。6.2 接下來(lái)怎么走做完這個(gè)實(shí)驗(yàn)?zāi)阋呀?jīng)具備了三項(xiàng)能力會(huì)裝 Linux 虛擬機(jī)、會(huì)基本 Linux 操作、會(huì)把 Hadoop 偽分布式跑起來(lái)。下一步建議這么走第一跑一遍 Hadoop 自帶的 WordCount 實(shí)例。它可以算作 Hadoop 的“hello world”幾分鐘就能跑完能跑通就說(shuō)明你的環(huán)境完全正常。實(shí)驗(yàn)指導(dǎo)書里通常會(huì)給出明確命令照著執(zhí)行觀察輸出結(jié)果即可。第二趁熱打鐵理解三個(gè)概念塊、副本、元數(shù)據(jù)。剛才操作過(guò) HDFS這三個(gè)詞就不再是抽象理論了——你上傳的文件被切成塊存進(jìn) DataNode副本數(shù)由配置決定文件的所有目錄信息都由 NameNode 管理。把這三者的關(guān)系想清楚HDFS 的原理就算入門了一半。第三往編程方向走一步。下一個(gè)實(shí)驗(yàn)通常是 HDFS 編程用 Java 或 Python 寫一個(gè)程序連接集群完成文件上傳下載。到那時(shí)候你會(huì)發(fā)現(xiàn)今天在 Shell 里敲的每條命令都能在代碼里找到對(duì)應(yīng)的 API 調(diào)用兩邊一對(duì)照學(xué)得會(huì)特別快。從那以后我每次做 Hadoop 相關(guān)的實(shí)驗(yàn)都強(qiáng)制自己先開一個(gè)終端執(zhí)行 jps確認(rèn)進(jìn)程狀態(tài)再?zèng)Q定下一步做什么動(dòng)手格式化之前永遠(yuǎn)先看一眼 core-site.xml 里配的目錄路徑。這個(gè)習(xí)慣幫我擋掉了無(wú)數(shù)個(gè)本可避免的深夜調(diào)試。這份資源把從零到跑通的路都鋪好了剩下的就是你親手敲一遍。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取