來(lái)自博主卷毛迷你豬的授權(quán),這是我的老師的博客多多關(guān)注
實(shí)驗(yàn)?zāi)康?/h2>
掌握 Hadoop 中 HDFS 的 Shell 命令操作
掌握 Hadoop 中 HDFS 的API操作
? 項(xiàng)目1:HDFS常見(jiàn)命令練習(xí)
? 項(xiàng)目2:HDFS命令的綜合運(yùn)用實(shí)踐
? 項(xiàng)目3:HDFS的API使用實(shí)踐
? 項(xiàng)目4:HDFS的API單元測(cè)試程序和更多思考(選做)
一、 實(shí)驗(yàn)原理
? HDFS是hadoop平臺(tái)的核心組成之一。
? HDFS的訪問(wèn)方式有多種,可通過(guò)web訪問(wèn),也可通過(guò)shell方式或者API方式訪問(wèn)。
? 基本操作有:對(duì)文件的讀、寫(xiě)、追加、刪除;新建文件夾、刪除文件夾等;還可顯示文件及文件夾的屬性。
二、實(shí)驗(yàn)準(zhǔn)備
? 實(shí)驗(yàn)一中已經(jīng)完成配置的偽分布式hadoop環(huán)境。
? 項(xiàng)目1、項(xiàng)目2,可以直接使用上述環(huán)境
? 項(xiàng)目3有可能需要配置自己的虛擬機(jī)網(wǎng)絡(luò)連接模式
實(shí)驗(yàn)內(nèi)容
【實(shí)驗(yàn)項(xiàng)目】項(xiàng)目1、項(xiàng)目2、項(xiàng)目3必做;項(xiàng)目4選做
? 項(xiàng)目1:HDFS常見(jiàn)命令練習(xí)
? 項(xiàng)目2:HDFS命令的綜合運(yùn)用實(shí)踐
? 項(xiàng)目3:HDFS的API使用實(shí)踐
? 項(xiàng)目4:HDFS的API單元測(cè)試程序和更多思考(選做)
步驟
項(xiàng)目1 HDFS常見(jiàn)命令練習(xí)
? 我們先熟悉一下HDFS的Shell命令,(以下實(shí)驗(yàn)使用hdfs dfs類(lèi)命令,可以在終端輸入hdfs dfs -help command查詢命令用法),執(zhí)行并查看結(jié)果。
列出HDFS當(dāng)前用戶家目錄下的文件及文件夾:
? (1)列出HDFS當(dāng)前用戶家目錄下的文件及文件夾:(剛開(kāi)始是沒(méi)有文件夾的需要自己新建)
hdfs dfs -ls (hdfs dfs -ls [path])
列出HDFS文件下名為directory的文件夾中的文件:
? (2)列出HDFS文件下名為directory的文件夾中的文件:
hdfs dfs -ls directory
上傳文件,將本地目錄file1文件上傳到HDFS上并重命名為file2:
? (3)上傳文件,將本地目錄file1文件上傳到HDFS上并重命名為file2:
hdfs dfs -put file1 file2
下載文件,將HDFS中的file2文件復(fù)制到本地系統(tǒng)并命名為file1:
? (4)下載文件,將HDFS中的file2文件復(fù)制到本地系統(tǒng)并命名為file1:
hdfs dfs -get file2 file1
查看文件,查看HDFS下file1文件中的內(nèi)容:
? (5)查看文件,查看HDFS下file1文件中的內(nèi)容:
hdfs dfs -cat file1
刪除文檔,刪除HDFS下名為file1的文件:
? (6)刪除文檔,刪除HDFS下名為file1的文件:
hdfs dfs -rm file1
在HDFS根路徑下建立新目錄,名為directory:
? (7)在HDFS根路徑下建立新目錄,名為directory:
hdfs dfs -mkdir /directory
本地文件復(fù)制到HDFS(注意與put的區(qū)別):
? (8)本地文件復(fù)制到HDFS(注意與put的區(qū)別):
hdfs dfs -copyFromLocal LocalPath ToPath
簡(jiǎn)單的說(shuō),-put更寬松,可以把本地或者HDFS上的文件拷貝到HDFS中;而-copyFromLocal則更嚴(yán)格限制只能拷貝本地文件到HDFS中。
本地文件移動(dòng)到HDFS
? (9)本地文件移動(dòng)到HDFS:
hdfs dfs -moveFromLocal LocalPath ToPath
文件或文件夾復(fù)制:
? (10)文件或文件夾復(fù)制:
hdfs dfs -cp src dsth
文件或文件夾的移動(dòng):
? (11)文件或文件夾的移動(dòng):
hdfs dfs -mv src dst
copyToLocal 復(fù)制文件到本地:
? (12)copyToLocal 復(fù)制文件到本地:
hdfs dfs -copyToLocal src dst
touchz 創(chuàng)建一個(gè)空文件file:
? (13) touchz 創(chuàng)建一個(gè)空文件file:
hdfs dfs -touchz file
追加到文件末尾的指令:
14)追加到文件末尾的指令:
hdfs dfs -appendToFile local.txt text.txt
項(xiàng)目2 HDFS命令的綜合運(yùn)用實(shí)踐
【注】文件名字可以自己取,重點(diǎn)是命令執(zhí)行是否成功
? (1)創(chuàng)建一個(gè)文件file1,查看file1是否創(chuàng)建成功,往file1內(nèi)寫(xiě)一些內(nèi)容。
? (2)在HDFS上創(chuàng)建一個(gè)文件夾folder1,把file1上傳到folder1中。
? (3)查看是否上傳成功,成功后查看file1的內(nèi)容。
? (4)把file1下載到本地,查看file1的內(nèi)容。
? (5)把folder1刪除,并查看是否刪除成功。
? (6)最后把本地的file1刪除
【拓展與思考】
【拓展與思考】思考題1、思考題2、思考題3必做,其余選做
? 思考題1(必做):對(duì)項(xiàng)目1、項(xiàng)目2命令行操作的結(jié)果,是否能在Web訪問(wèn)模式下看到?如果能請(qǐng)截圖舉例說(shuō)明;如果不能,請(qǐng)查清原因并確認(rèn)結(jié)果。
1.先進(jìn)入50070,在Utilities下的Browse the file system下可以先看見(jiàn)我們之前創(chuàng)建的目錄信息
HDFS Web界面可以直接下載文件。單擊文件列表中需要下載的文件名,超鏈接在彈出窗口中單擊【Download】,即可將文件下載到本地。
? 思考題2(必做):hdfs dfs -ls -R 某個(gè)HDFS上的目錄 該命令中“R”參數(shù)的作用是什么?請(qǐng)截圖并給出相應(yīng)的說(shuō)明。
在hdfs dfs -ls命令中,-R參數(shù)表示遞歸地列出指定目錄下的所有文件和子目錄,包括子目錄中的文件和子目錄。如果不加-R參數(shù),則只會(huì)列出指定目錄下的文件和子目錄,不會(huì)遞歸到子目錄中去。
因此,使用hdfs dfs -ls -R <hdfs_directory>命令可以遞歸地列出指定HDFS目錄下的所有文件和子目錄的詳細(xì)信息,包括文件名、權(quán)限、大小、修改時(shí)間等信息。這對(duì)于需要查看大量文件和子目錄的情況非常有用,可以方便快捷地查看整個(gè)目錄結(jié)構(gòu),并且不需要手動(dòng)進(jìn)入每個(gè)子目錄進(jìn)行查看。
? 思考題3(必做):如果已經(jīng)上傳了某個(gè)本地A文件到HDFS上,并在HDFS中命名為file1, 那再次上傳A文件并在HDFS中命名為file1是否可行(路徑一致)?如果換另一個(gè)本地文件B上傳到HDFS中也命名為file1是否可行(路徑一致)?
如果已經(jīng)上傳了本地文件A到HDFS上,并在HDFS中命名為file1,再次上傳本地文件A并在HDFS中命名為file1是可行的,但實(shí)際上并不會(huì)改變?cè)械奈募?nèi)容,只會(huì)在HDFS上創(chuàng)建一個(gè)新的副本。
如果上傳另一個(gè)本地文件B,并在HDFS中命名為file1(路徑一致),則會(huì)覆蓋原來(lái)的file1文件,即用新的文件B替換原有的文件A。
? 思考題4(必做):如果操作對(duì)象是文件夾,如何使用命令完成和文件類(lèi)似的操作?
如果需要操作的對(duì)象是文件夾,可以使用以下命令完成和文件類(lèi)似的操作:
上傳文件夾到HDFS:hdfs dfs -copyFromLocal <local_directory> <hdfs_directory> 或者 hdfs dfs -put <local_directory> <hdfs_directory>
下載HDFS文件夾到本地:hdfs dfs -copyToLocal <hdfs_directory> <local_directory> 或者 hdfs dfs -get <hdfs_directory> <local_directory>
在HDFS中創(chuàng)建文件夾:hdfs dfs -mkdir <hdfs_directory>
刪除HDFS中的文件夾:hdfs dfs -rm -r <hdfs_directory> 或者 hdfs dfs -rmdir <hdfs_directory>
顯示HDFS文件夾內(nèi)容:hdfs dfs -ls <hdfs_directory>
將本地文件夾合并到HDFS文件夾:hdfs dfs -put <local_directory>/* <hdfs_directory> 或者 hdfs dfs -copyFromLocal <local_directory>/* <hdfs_directory>
? 思考題5(選做,可加分保命): hdfs dfs -copyFromLocal 與 hdfs dfs -put 有什么區(qū)別?
hdfs dfs -copyFromLocal和hdfs dfs -put都是將本地文件上傳到HDFS的命令,但它們有以下區(qū)別:
hdfs dfs -copyFromLocal命令只能將本地文件復(fù)制到HDFS,而hdfs dfs -put命令可以將本地文件復(fù)制到HDFS,也可以將HDFS文件復(fù)制到HDFS。
hdfs dfs -put命令可以指定文件的權(quán)限、用戶和組,而hdfs dfs -copyFromLocal命令則不能指定這些參數(shù)。
hdfs dfs -put命令可以設(shè)置文件的塊大小和副本數(shù),而hdfs dfs -copyFromLocal命令則不能設(shè)置這些參數(shù)。
因此,如果只是將本地文件上傳到HDFS,并且不需要指定文件的權(quán)限、用戶和組以及文件塊大小和副本數(shù),則使用hdfs dfs -copyFromLocal命令更為簡(jiǎn)單方便。如果需要更多的控制和配置,則可以使用hdfs dfs -put命令。
? 思考題6(選做,可加分保命): linux中每一個(gè)命令其實(shí)都是對(duì)應(yīng)程序的執(zhí)行結(jié)果,那HDFS命令對(duì)應(yīng)的程序具體在哪些文件中定義呢?
在Linux系統(tǒng)中,可以通過(guò)which命令來(lái)查找HDFS命令對(duì)應(yīng)的程序所在的位置
該命令會(huì)輸出hdfs可執(zhí)行程序所在的路徑。
項(xiàng)目3 HDFS的API使用實(shí)踐
大致步驟
- 3-1 改造虛擬機(jī)網(wǎng)絡(luò)
- 3-2 改造Hadoop配置
- 3-3 編寫(xiě)代碼 ==> 要完成文件的 創(chuàng)建/追加/修改
實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【前置知識(shí)】VMware網(wǎng)絡(luò)配置中的:橋接模式、NAT模式和僅主機(jī)模式
問(wèn)題:如何讓虛擬機(jī)里的Linux設(shè)備上網(wǎng)呢?
橋接模式(Bridged Mode):這種模式會(huì)將虛擬機(jī)連接到主機(jī)所在的網(wǎng)絡(luò)中,讓虛擬機(jī)可以像主機(jī)一樣直接訪問(wèn)網(wǎng)絡(luò)。
橋接模式下要讓虛擬機(jī)里的Linux設(shè)備上網(wǎng)需要:
在VMware的網(wǎng)絡(luò)設(shè)置中選擇橋接模式,然后選擇要橋接的物理網(wǎng)絡(luò)適配器。
在Linux虛擬機(jī)中使用DHCP或手動(dòng)配置IP地址和其他網(wǎng)絡(luò)設(shè)置。
如果您使用的是DHCP,請(qǐng)確保虛擬機(jī)可以正確獲取IP地址、默認(rèn)網(wǎng)關(guān)和DNS服務(wù)器地址。
NAT模式(Network Address Translation Mode):這種模式會(huì)將虛擬機(jī)連接到主機(jī)所在的網(wǎng)絡(luò),但會(huì)使用主機(jī)的IP地址作為虛擬機(jī)的公共IP地址,因此虛擬機(jī)可以通過(guò)主機(jī)訪問(wèn)Internet。
NAT模式下要讓虛擬機(jī)里的Linux設(shè)備上網(wǎng),您需要:
在VMware的網(wǎng)絡(luò)設(shè)置中選擇NAT模式。
在Linux虛擬機(jī)中使用DHCP或手動(dòng)配置IP地址和其他網(wǎng)絡(luò)設(shè)置。
如果您使用的是DHCP,請(qǐng)確保虛擬機(jī)可以正確獲取IP地址、默認(rèn)網(wǎng)關(guān)和DNS服務(wù)器地址。
如果您手動(dòng)配置了IP地址,請(qǐng)將默認(rèn)網(wǎng)關(guān)設(shè)置為主機(jī)的IP地址。
僅主機(jī)模式(Host-Only Mode):這種模式只會(huì)將虛擬機(jī)連接到主機(jī)所在的網(wǎng)絡(luò)中,虛擬機(jī)不能直接訪問(wèn)Internet。
要讓虛擬機(jī)里的Linux設(shè)備上網(wǎng),您需要:
在VMware的網(wǎng)絡(luò)設(shè)置中選擇僅主機(jī)模式。
在Linux虛擬機(jī)中使用DHCP或手動(dòng)配置IP地址和其他網(wǎng)絡(luò)設(shè)置。
如果您使用的是DHCP,請(qǐng)確保虛擬機(jī)可以正確獲取IP地址、默認(rèn)網(wǎng)關(guān)和DNS服務(wù)器地址。
如果您手動(dòng)配置了IP地址,請(qǐng)將默認(rèn)網(wǎng)關(guān)設(shè)置為主機(jī)的IP地址,并設(shè)置主機(jī)為虛擬機(jī)的DNS服務(wù)器。
【前置知識(shí)】VMware網(wǎng)絡(luò)配置中的:橋接模式、NAT模式和僅主機(jī)模式
? 需要設(shè)置虛擬網(wǎng)絡(luò)
? 虛擬網(wǎng)絡(luò)配置有三種模式:
? 僅主機(jī)(適配器VMnet1)
? NAT (適配器VMnet8)
? 橋接
此處的適配器可以簡(jiǎn)單理解為
人們常說(shuō)的“網(wǎng)卡”。
? 查看下Windows下對(duì)應(yīng)的網(wǎng)絡(luò)設(shè)備和網(wǎng)絡(luò)服務(wù)
? 查看下Windows下對(duì)應(yīng)的網(wǎng)絡(luò)設(shè)備和VM網(wǎng)絡(luò)服務(wù) ==> win+r 輸入 services.msc 查看VM相關(guān)服務(wù)
橋接模式:讓物理機(jī)和虛擬機(jī)設(shè)置在同一個(gè)網(wǎng)段,前提是網(wǎng)段有多余的IP可用。
NAT模式:將物理機(jī)當(dāng)做一個(gè)路由器去使用
僅主機(jī)模式:Host-Only模式將虛擬機(jī)與外網(wǎng)隔開(kāi),使得虛擬機(jī)成為一個(gè)獨(dú)立的系統(tǒng),只與主機(jī)相互通訊
? 顯然:
? NAT模式才是最好的解決方案
? 且我們應(yīng)該放棄DHCP自動(dòng)賦值地址信息,手動(dòng)設(shè)置網(wǎng)絡(luò)更加符合實(shí)際需要
? 更多網(wǎng)絡(luò)知識(shí)細(xì)節(jié),可以參考以下鏈接(附錄中有完整網(wǎng)址):
? VMware虛擬機(jī)三種網(wǎng)絡(luò)模式:橋接模式,NAT模式,僅主機(jī)模式
? vmware 虛擬機(jī)三種網(wǎng)絡(luò)模式 橋接 NAT 僅主機(jī)區(qū)別 是什么意思
? 網(wǎng)絡(luò)連接的三種模式:橋接模式,Net模式,僅主機(jī)模式
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【實(shí)操】step_1-1 確認(rèn)window上的虛擬網(wǎng)卡VMnet8開(kāi)啟(NAT用),手動(dòng)設(shè)置配置
【實(shí)操】step_1-2 確認(rèn)window上的虛擬網(wǎng)卡VMnet8開(kāi)啟(NAT用),手動(dòng)設(shè)置配置
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【實(shí)操】step_2-1 設(shè)置VM中網(wǎng)絡(luò),在“虛擬網(wǎng)絡(luò)編輯器”中點(diǎn)擊“更改設(shè)置”
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【實(shí)操】step_2-2 設(shè)置VM中網(wǎng)絡(luò),采用手動(dòng)NAT
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【實(shí)操】step_2-3 設(shè)置VM中網(wǎng)絡(luò),設(shè)置網(wǎng)關(guān),點(diǎn)擊“添加”綁定通信端口
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【實(shí)操】step_3-1 設(shè)置linux虛擬機(jī)網(wǎng)絡(luò),界面操作簡(jiǎn)單,也可以直接命令行
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【實(shí)操】step_3-2 設(shè)置linux虛擬機(jī)網(wǎng)絡(luò),手動(dòng)填寫(xiě)剛才在Window下擬定的配置
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【實(shí)操】step_3-3 確認(rèn)網(wǎng)絡(luò)可以訪問(wèn):試試ping百度、用瀏覽器上網(wǎng)(前提是物理機(jī)聯(lián)網(wǎng))
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【實(shí)操】step_3-4 確認(rèn)網(wǎng)絡(luò)可以訪問(wèn):試試ping百度、用瀏覽器上網(wǎng)(前提是物理機(jī)聯(lián)網(wǎng))
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【實(shí)操】step_3-5 在linux虛擬機(jī)中ping通windows物理機(jī)的VMnet8設(shè)定IP
第一次ping很長(zhǎng)時(shí)間也沒(méi)有數(shù)據(jù)(原因:沒(méi)有關(guān)閉win的防火墻)
關(guān)閉后:
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-1 改造虛擬機(jī)網(wǎng)絡(luò)
【實(shí)操】step_3-6 在windows側(cè)ping同linux虛擬機(jī),確認(rèn)兩邊網(wǎng)路通信OK(win+r cmd)
實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-2 改造Hadoop配置
【實(shí)操】將hadoop涉及到的5個(gè)進(jìn)程的localhost都調(diào)整為新設(shè)定的IP,也可以使用/etc/hosts中設(shè)定一個(gè)名稱,方便后續(xù)快速更改(這樣做更加正規(guī))
step_1 先查看有哪些文件使用了localhost
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-2 改造Hadoop配置
【實(shí)操】step_2-1 在關(guān)閉Hadoop所有服務(wù)的前提下修改相關(guān)配置文件(yarn-site.xml)master是我自己的主機(jī)名,請(qǐng)?zhí)钭约旱模。。?/strong>
修改完后(第27行有語(yǔ)法錯(cuò)誤下圖還沒(méi)有修改應(yīng)為是前面截圖正確的是</property>,后面會(huì)講,看到就在這說(shuō)了)
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-2 改造Hadoop配置
【實(shí)操】step_2-2 在關(guān)閉Hadoop所有服務(wù)的前提下修改相關(guān)配置文件(hdfs-site.xml)
修改前:
修改后
作用:
這些代碼是 Hadoop 分布式文件系統(tǒng)的配置文件,其中包含以下三個(gè)屬性:
dfs.replication:該屬性設(shè)置了文件副本的數(shù)量。在這里,設(shè)置為1,表示文件只有一個(gè)副本存儲(chǔ)在文件系統(tǒng)中。這意味著 Hadoop 不會(huì)創(chuàng)建文件的備份,這將節(jié)省磁盤(pán)空間,但也增加了數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
dfs.namenode.http.address:這個(gè)屬性指定了主 NameNode 的 HTTP 通信地址。在這里,設(shè)置為 master:50070,表示主 NameNode 在主機(jī)名為 master,端口號(hào)為 50070 的地址上運(yùn)行。
dfs.http.address:該屬性指定了所有 NameNode 和 DataNode 的 HTTP 通信地址。在這里,設(shè)置為 master:50070,表示所有節(jié)點(diǎn)都在主機(jī)名為 master,端口號(hào)為 50070 的地址上運(yùn)行。
總的來(lái)說(shuō),這些代碼的作用是設(shè)置 Hadoop 分布式文件系統(tǒng)的副本數(shù)量和各個(gè)節(jié)點(diǎn)的通信地址,以確保文件系統(tǒng)能夠正確地工作。
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-2 改造Hadoop配置
【實(shí)操】step_2-3 在關(guān)閉Hadoop所有服務(wù)的前提下修改相關(guān)配置文件(core-site.xml)
就改了主機(jī)名為master
作用:
hadoop.tmp.dir:該屬性指定了 Hadoop 的臨時(shí)目錄路徑。在這里,設(shè)置為 /home/hadoop/hadoop/tmp,表示 Hadoop 將使用這個(gè)路徑作為臨時(shí)目錄來(lái)存儲(chǔ)各種臨時(shí)文件和數(shù)據(jù)。
fs.defaultFS:該屬性指定了 Hadoop 的默認(rèn)文件系統(tǒng)。在這里,設(shè)置為 hdfs://master,表示 Hadoop 的默認(rèn)文件系統(tǒng)是一個(gè)名為 master 的 NameNode 上運(yùn)行的 HDFS 文件系統(tǒng)。
這些配置文件的作用是為 Hadoop 集群配置一些默認(rèn)值,例如臨時(shí)目錄和默認(rèn)文件系統(tǒng)。這些屬性可以通過(guò)修改配置文件來(lái)改變,以適應(yīng)特定的應(yīng)用程序需求。
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-2 改造Hadoop配置
【實(shí)操】step_2-4 最后在檢查下是否還有遺漏
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-2 改造Hadoop配置
【實(shí)操】step_2-5 啟動(dòng)Hadoop,確認(rèn)相關(guān)JVM進(jìn)程正常工作
前面啟動(dòng)發(fā)現(xiàn)JVM(start-all.sh)報(bào)錯(cuò)yarn-site.xml,是前面的語(yǔ)法錯(cuò)誤,可以回看我yarn-site.xml的截圖
修復(fù)完后成功啟動(dòng)
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-2 改造Hadoop配置
【實(shí)操】step_2-6 簡(jiǎn)單測(cè)試功能是否可用
發(fā)現(xiàn)沒(méi)有問(wèn)題
實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-3 編寫(xiě)代碼
【實(shí)操】此處用eclipse演示,具體細(xì)節(jié)請(qǐng)參考梁江懷老師博客
- 配置開(kāi)發(fā)環(huán)境
(1)我們建議,可先采用非Maven的方式完成開(kāi)發(fā),因?yàn)檫@樣可以規(guī)避許多的網(wǎng)絡(luò)訪問(wèn)問(wèn)題。
(2)如果非Maven方式完成后,再嘗試去做Maven模式。 - 參考博客,編寫(xiě)代碼
(1)非Maven工程API訪問(wèn)HDFS
https://blog.csdn.net/qq_42881421/article/details/83001401
跟著弄成功運(yùn)行!
(2)Maven工程API訪問(wèn)HDFS
https://blog.csdn.net/qq_42881421/article/details/100762022
【注】
? Maven的相關(guān)配置和下載請(qǐng)耐心完成
? 如果遇到海外網(wǎng)絡(luò)不能訪問(wèn)的問(wèn)題,請(qǐng)參考實(shí)驗(yàn)1介紹的配置國(guó)內(nèi)鏡像源的方法解決
? 其實(shí)為了方便,建議直接使用IDEA完成;后續(xù)課程《大數(shù)據(jù)內(nèi)存計(jì)算》(spark)也要使用IDEA
根據(jù)教程同樣完成:
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-3 編寫(xiě)代碼
【實(shí)操】如果對(duì)環(huán)境配置不熟悉,可以先看:
(3)熟悉Eclipse + Maven的JAVA開(kāi)發(fā)環(huán)境
https://blog.csdn.net/qq_42881421/article/details/82945454
(4)IDEA + Maven工程
https://blog.csdn.net/qq_42881421/article/details/100717502
(5)Maven的單篇安裝教程
https://blog.csdn.net/qq_42881421/article/details/82900849
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-3 編寫(xiě)代碼
【實(shí)操】完成Maven工程配置后,編寫(xiě)如下代碼(此處僅僅是文件內(nèi)容讀取,注意自己虛擬機(jī)的IP和端口)
package com.test.HDFS;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class ReadFile {
public static void main(String[] args) throws IOException {
//創(chuàng)建Configuration實(shí)例
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.244.130:8020");//注意修改成Linux的IP
//通過(guò)配置獲取到文件系統(tǒng)
FileSystem fs = FileSystem.get(conf);
//定義要讀取文件所在的HDFS路徑
Path src=new Path("hdfs://192.168.244.130:8020/AAA");//注意修改成Linux的IP
//通過(guò)文件系統(tǒng)的open()方法得到一個(gè)文件輸入流,用于讀取
FSDataInputStream dis = fs.open(src);
//用IOUtils下的copyBytes將流中的數(shù)據(jù)打印輸出到控制臺(tái)
IOUtils.copyBytes(dis, System.out, conf);
//關(guān)閉輸入流
dis.close();
}
}
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-3 編寫(xiě)代碼
【實(shí)操】注意,我們?cè)谔摂M網(wǎng)絡(luò)IP的設(shè)備上編寫(xiě)了一個(gè)Client程序,用于讀取HDFS上對(duì)應(yīng)文件的內(nèi)容:
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目3-3 編寫(xiě)代碼
【實(shí)操】注意,通過(guò)編寫(xiě)HDFS API程序,我們一共要完成以下六個(gè)功能:
? 文件的創(chuàng)建
? 文件的刪除
? 文件的上傳
? 文件的下載
? 文件屬性查看
? 文件內(nèi)容查看
編寫(xiě)HDFS API程序可以使用Java編程語(yǔ)言,并使用Hadoop的Java API庫(kù)進(jìn)行開(kāi)發(fā)。以下是六個(gè)基本功能的實(shí)現(xiàn)方法:
文件的創(chuàng)建
package com.test.HDFS;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import java.net.URI;
public class CreateFile {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration(); // 創(chuàng)建Hadoop配置對(duì)象
URI uri = new URI("hdfs://192.168.244.130:8020"); // 定義HDFS連接參數(shù)
FileSystem fs = FileSystem.get(uri, conf, "hadoop"); // 獲取HDFS文件系統(tǒng)對(duì)象
Path file = new Path("/Java_Create"); // 定義要?jiǎng)?chuàng)建的文件路徑
FSDataOutputStream out = fs.create(file, true); // 創(chuàng)建文件輸出流,第二個(gè)參數(shù)表示是否覆蓋已有文件
out.writeBytes("Hello World\n"); // 寫(xiě)入文件內(nèi)容(不支持中文)
out.writeUTF("你好世界\n"); // 再次寫(xiě)入文件內(nèi)容(支持中文)
out.close(); // 關(guān)閉文件輸出流
fs.close(); // 關(guān)閉HDFS文件系統(tǒng)對(duì)象
}
}
文件的刪除
package com.test.HDFS;
import java.net.URI; // 引入Java標(biāo)準(zhǔn)庫(kù)中的URI類(lèi),用于處理URI(統(tǒng)一資源標(biāo)識(shí)符)。
import org.apache.hadoop.conf.Configuration; // 引入Apache Hadoop庫(kù)中的Configuration類(lèi),用于讀取Hadoop集群的配置信息。
import org.apache.hadoop.fs.FileSystem; // 引入Apache Hadoop庫(kù)中的FileSystem類(lèi),用于訪問(wèn)Hadoop分布式文件系統(tǒng)(HDFS)。
import org.apache.hadoop.fs.Path; // 引入Apache Hadoop庫(kù)中的Path類(lèi),用于表示HDFS上的路徑。
public class DeleteFile {
public static void main(String[] args) throws Exception {
Configuration conf=new Configuration();// 引入Apache Hadoop庫(kù)中的Path類(lèi),用于表示HDFS上的路徑。
//注意修改為自己的IP
URI uri=new URI("hdfs://192.168.244.130:8020");// 創(chuàng)建一個(gè)URI對(duì)象,表示Hadoop集群的名稱節(jié)點(diǎn)所在的地址和端口號(hào)。
FileSystem fs=FileSystem.get(uri,conf,"hadoop");//使用上述URI和Configuration對(duì)象,創(chuàng)建一個(gè)FileSystem對(duì)象,用于訪問(wèn)HDFS上的文件系統(tǒng)。
//HDFS file
Path path=new Path("/user/hadoop/1.txt");//創(chuàng)建一個(gè)Path對(duì)象,表示HDFS上的文件路徑。
fs.delete(path,true);//使用FileSystem對(duì)象刪除HDFS上指定的文件,第二個(gè)參數(shù)true表示遞歸刪除,如果文件不存在也不會(huì)拋出異常。
}
}
文件的上傳
第一次運(yùn)行下面代碼報(bào)錯(cuò),后面發(fā)現(xiàn)原因是path的問(wèn)題
package com.test.HDFS;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import java.net.URI;
public class UploadFile {
public static void main(String[] args) throws Exception{
Configuration conf=new Configuration();
//注意修改為自己的IP
URI uri=new URI("hdfs://192.168.244.130:8020");
FileSystem fs=FileSystem.get(uri,conf,"hadoop");
//local file
Path localPath=new Path("?E:/Hello.txt");//這里寫(xiě)的是Windows系統(tǒng)下的文件路徑,注意按實(shí)際修改。
//HDFS file
//上傳到目的地路徑,可以自定義, hdfs的/user/hadoop目錄需要先用命令創(chuàng)建出來(lái)
Path dstPath=new Path("/hadoop/Hello.txt_Win");
fs.copyFromLocalFile(localPath,dstPath);
}
}
把代碼的Path改成下面這個(gè),然后運(yùn)行發(fā)現(xiàn)成功了
Path localPath = new Path(“file:///E:/Hello.txt”);
文件的下載
鏈接的教程這里有點(diǎn)小錯(cuò)誤,跟我改就可以了
package com.test.HDFS;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import java.net.URI;
public class DownloadFile {
public static void main(String[] args) throws Exception{
Configuration conf=new Configuration();
URI uri=new URI("hdfs://192.168.244.130:8020");
FileSystem fs=FileSystem.get(uri,conf,"hadoop");
//HDFS文件:"/2.txt"為hdfs的文件,如果沒(méi)有該文件請(qǐng)從Linux上傳一個(gè)文件到HDFS.
Path dstPath=new Path("/hadoop/Hello.txt_Win");
//local文件位置:需要先在Windows D盤(pán)創(chuàng)建一個(gè)test文件夾存放下載的文件
Path localPath=new Path("file:///D:/Download_Linux");
//從HDFS下載文件到本地
fs.copyToLocalFile(false,dstPath,localPath,true);
}
}
運(yùn)行成功
文件屬性查看
文件內(nèi)容查看
package com.test.HDFS;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import java.net.URI;
import java.sql.Date;
import java.text.SimpleDateFormat;
public class FileAttr {
public static void main(String[] args) throws Exception {
Configuration conf=new Configuration();
URI uri=new URI("hdfs://192.168.244.130:8020");
FileSystem fs=FileSystem.get(uri,conf,"hadoop");
//locate file 文件位置
Path fpath=new Path("/hadoop/Hello.txt_Win");
FileStatus filestatus=fs.getFileLinkStatus(fpath);//指定要獲取屬性的文件路徑。
//get block size 獲取文件塊大小
long blocksize=filestatus.getBlockSize();
System.out.println("blocksize:"+blocksize);
//get file size 獲取文件大小
long filesize=filestatus.getLen();
System.out.println("filesize:"+filesize);
//get file owner 獲取文件所屬者
String fileowner=filestatus.getOwner();
System.out.println("fileowner:"+fileowner);
//get file access time 獲取文件存取時(shí)間
SimpleDateFormat formatter=new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
long accessTime=filestatus.getAccessTime();
System.out.println("access time:"+formatter.format(new Date(accessTime)));
//get file modify time 獲取文件修改時(shí)間
long modifyTime=filestatus.getModificationTime();
System.out.println("modify time:"+formatter.format(new Date(modifyTime)));
}
}
運(yùn)行成功
所有代碼都可以參考 梁江懷 老師博客 or 科普白皮教材 or 《權(quán)威指南》
【拓展與思考】
思考題7(選做,可加分保命)實(shí)際上HDFS的命令除了 hdfs 也有 hadoop的,譬如hadoop fs -ls / 就等同于 hdfs dfs -ls /,請(qǐng)問(wèn)這兩種命令有和不同嗎?
實(shí)際上,hadoop fs和hdfs dfs命令是相同的,只是在不同的Hadoop版本中使用不同的命令。
在早期版本中,hadoop fs是主要的文件系統(tǒng)命令,而在較新的版本中,hdfs dfs是主要的文件系統(tǒng)命令。
因此,兩種命令的功能是相同的,都可以用于在HDFS中執(zhí)行文件系統(tǒng)操作。
例如,hadoop fs -ls /和hdfs dfs -ls /命令都用于列出HDFS根目錄中的文件和目錄。
思考題8 (選做,可加分保命)hdfs dfs -ls的顯示結(jié)果中,是否能夠看到block副本數(shù)量,如果可以請(qǐng)指明,否則說(shuō)明情況。
在hdfs dfs -ls命令的輸出中,默認(rèn)情況下是不會(huì)顯示文件的block副本數(shù)量的。
但是,您可以使用hdfs dfs -ls -h命令來(lái)顯示文件的人類(lèi)可讀形式的大小和block副本數(shù)量。
該命令的輸出將包括文件大小、權(quán)限、所有者、組、修改時(shí)間、路徑和block副本數(shù)量等信息。
思考題9(選做,可加分保命)之前學(xué)習(xí)Linux文件系統(tǒng)時(shí),我們討論過(guò)文件權(quán)限問(wèn)題,請(qǐng)思考HDFS中的文件權(quán)限會(huì)有和不同之處?
雖然HDFS中的文件權(quán)限控制與Linux文件系統(tǒng)中的文件權(quán)限控制有些相似之處,但也存在一些重要的不同之處,
這些差異主要體現(xiàn)在權(quán)限控制的簡(jiǎn)單性和一些特殊性。
HDFS中的權(quán)限控制是由Hadoop的NameNode管理的,
而不是像Linux文件系統(tǒng)一樣是由操作系統(tǒng)內(nèi)核管理的。
HDFS中的文件權(quán)限比Linux文件系統(tǒng)中的文件權(quán)限更加簡(jiǎn)單,只包括讀(read)、寫(xiě)(write)和執(zhí)行(execute)三種權(quán)限。
HDFS中的文件權(quán)限控制比較粗粒度,只能控制整個(gè)文件或目錄的讀寫(xiě)執(zhí)行權(quán)限,而不能對(duì)文件的特定部分進(jìn)行訪問(wèn)控制。
思考題10(選做,可加分保命)HDFS中的distcp命令的作用是什么?它與hdfs dfs -cp 命令有何不同?
與hdfs dfs -cp命令相比,distcp命令的主要不同之處在于以下幾點(diǎn)
并行復(fù)制:distcp命令可以在多個(gè)源和目標(biāo)之間并行復(fù)制數(shù)據(jù),以加快復(fù)制速度。例如,可以使用多個(gè)并發(fā)任務(wù)來(lái)復(fù)制不同的文件或子目錄,每個(gè)任務(wù)都會(huì)復(fù)制一部分?jǐn)?shù)據(jù),以最大程度地利用集群的帶寬和處理能力。
跨集群復(fù)制:distcp命令可以在不同的HDFS集群之間復(fù)制數(shù)據(jù),而hdfs dfs -cp命令只能在同一集群內(nèi)復(fù)制數(shù)據(jù)。這使得distcp命令非常適合在多個(gè)地理位置或不同的組織之間復(fù)制數(shù)據(jù),例如,將數(shù)據(jù)從一個(gè)Hadoop集群復(fù)制到另一個(gè)Hadoop集群或?qū)?shù)據(jù)從Hadoop集群復(fù)制到云存儲(chǔ)服務(wù)等。
自動(dòng)故障恢復(fù):distcp命令可以自動(dòng)檢測(cè)和恢復(fù)復(fù)制過(guò)程中的故障和錯(cuò)誤。如果其中一個(gè)復(fù)制任務(wù)失敗,distcp命令可以自動(dòng)重新啟動(dòng)該任務(wù),或者將失敗的任務(wù)分成更小的子任務(wù)進(jìn)行重試,以確保復(fù)制過(guò)程的連續(xù)性和正確性。
高級(jí)選項(xiàng):distcp命令還提供了一些高級(jí)選項(xiàng),例如設(shè)置帶寬限制、跳過(guò)已經(jīng)復(fù)制的文件、忽略某些文件或目錄、在源和目標(biāo)之間進(jìn)行差異對(duì)比等。
項(xiàng)目4 HDFS的API單元測(cè)試程序和更多思考(選做)–還沒(méi)寫(xiě)
【目的】目前實(shí)驗(yàn)課程也在不斷進(jìn)化和改革,其實(shí)思考題和選做部分的內(nèi)容才能真正訓(xùn)練大家對(duì)課程知識(shí)體系的理解,也和培訓(xùn)班面向面試從業(yè)的理念更加貼近。
【思考】
Q1:每次為了嘗試使用HDFS的API都要寫(xiě)一個(gè)類(lèi),然后編寫(xiě)main嗎?
A1:這樣做太業(yè)余了,明顯應(yīng)該用Java課程中學(xué)過(guò)的UT測(cè)試去編寫(xiě)測(cè)試代碼啊。
Q2:一直強(qiáng)調(diào)文件分塊是為了適應(yīng)分布式計(jì)算,那么這點(diǎn)是如何體現(xiàn)的呢?
A2:參看“seek”和“文件屬性”案例
Q3:HDFS是分布式的,那么如果我們文件中寫(xiě)入了數(shù)據(jù),那么這些數(shù)據(jù)能夠被立即讀取到嗎?
A3:參看《權(quán)威指南》P74,進(jìn)一步理解I/O流,理解為何要出現(xiàn)工具類(lèi)IOUtils
【注】還是那句話,多看經(jīng)典書(shū)籍,多看項(xiàng)目作者寫(xiě)的資料、論文和書(shū)籍,辨(yuan)證(離開(kāi))垃圾教材和教程;培訓(xùn)班的課程要分辨著聽(tīng);學(xué)習(xí)技術(shù)知識(shí)一定要有自己的總結(jié)。
實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-0 簡(jiǎn)單設(shè)置UT
前面沒(méi)發(fā)現(xiàn)要導(dǎo)org.junit.Before,直接@Before報(bào)錯(cuò)
后面發(fā)現(xiàn)在如下界面導(dǎo)入
實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-1 單元測(cè)試mkdir
? 根據(jù)前面@Before的注釋?zhuān)冗x擇hd賬號(hào)創(chuàng)建/lab2目錄
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-1 單元測(cè)試mkdir
【結(jié)果】
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-1 單元測(cè)試mkdir
【結(jié)果】
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-1 單元測(cè)試mkdir
? 根據(jù)前面@Before的注釋?zhuān)馁~號(hào)為ubuntu,執(zhí)行命令報(bào)錯(cuò)
? 注意,打印語(yǔ)句在報(bào)錯(cuò)之前,所以信息仍然是:“目錄已存在,將刪除后重建”
? 錯(cuò)誤調(diào)用棧信息比較多,在下一頁(yè)展示,可以看到權(quán)限錯(cuò)誤
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-1 單元測(cè)試mkdir
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-1 單元測(cè)試mkdir
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-1 單元測(cè)試mkdir
實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-2 單元測(cè)試upload
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-2 單元測(cè)試upload
實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-3 單元測(cè)試blocks
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-3 單元測(cè)試blocks文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-858360.html
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-3 單元測(cè)試blocks文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-858360.html
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-3 單元測(cè)試blocks
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-3 單元測(cè)試blocks
4.實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-3 單元測(cè)試blocks
實(shí)驗(yàn)內(nèi)容 項(xiàng)目4-4 MD5校驗(yàn)
到了這里,關(guān)于實(shí)驗(yàn)二 HDFS的Shell命令操作,和HDFS的API操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!