大數(shù)據(jù)技術(shù)原理與應(yīng)用實(shí)驗(yàn)指南——HDFS JAVA API編程實(shí)踐
hdfs Java API編寫合并文件內(nèi)容
1. 實(shí)驗(yàn)?zāi)康?/strong>
(1) 熟練使用HDFS操作常用的Shell命令。
(2) 熟悉HDFS操作常用的Java API。
2. 實(shí)驗(yàn)內(nèi)容
(1) 編程實(shí)現(xiàn)指定功能,并利用Hadoop提供的Shell命令完成相同任務(wù)(文件的上傳、下載、輸出、刪除、移動(dòng)等操作)。
(2) 有余力編寫一個(gè)Java程序,讀取HDFS中的指定文件。
3. 實(shí)驗(yàn)平臺(tái)(軟件版本)
VirtualBox-6.1.4
jdk-8u162-linux-x64.tar
eclipse-4.7.0-linux.gtk.x86_64.tar
ubuntukylin-16.04-desktop-amd64
hadoop-3.1.3
FileZilla_3.17.0.0_win64_setup 這是一個(gè)用于將windows文件與linux互相傳的軟件
**4. 實(shí)驗(yàn)步驟 **
實(shí)驗(yàn)步驟思維導(dǎo)圖如下圖所示
(1) 啟動(dòng)全分布集群
$ start-dfs.sh
$ start-yarn.sh
$ mr-jobhistory-daemon.sh start historyserver
通過命令jps可以查看各個(gè)節(jié)點(diǎn)所啟動(dòng)的進(jìn)程(如下圖所示:)
在Slave節(jié)點(diǎn)可以看到DataNode和NodeManager進(jìn)程(如下圖所示:)
集群啟動(dòng)成功:如下圖所示
(2) 目錄操作:
① 本教程全部采用hadoop用戶登錄Linux系統(tǒng),因此,需要在HDFS中為hadoop用戶創(chuàng)建一個(gè)用戶目錄,命令如下:
$ hdfs dfs -mkdir -p /user/hadoop
該命令中表示在HDFS中創(chuàng)建一個(gè)“/user/hadoop”目錄,“–mkdir”是創(chuàng)建目錄的操作,“-p”表示如果是多級(jí)目錄,則父目錄和子目錄一起創(chuàng)建,這里“/user/hadoop”就是一個(gè)多級(jí)目錄,因此必須使用參數(shù)“-p”,否則會(huì)出錯(cuò)。
② “-ls”表示列出HDFS某個(gè)目錄下的所有內(nèi)容,“.”表示HDFS中的當(dāng)前用戶目錄,也就是“/user/hadoop”目錄,以下兩個(gè)命令等價(jià)!
$ hdfs dfs –ls .
$ hdfs dfs –ls /user/hadoop
目錄創(chuàng)建與顯示如下圖所示
(3) 文件操作:
① 首先使用vim編輯器,在本地Linux文件系統(tǒng)的“/home/hadoop/”目錄下創(chuàng)建四個(gè)文件file1.txt、file2.txt、file3.txt、file4.abc和file5.abc,文件內(nèi)容分別如下所示:
file1.txt的內(nèi)容是: this is file1.txt
file2.txt的內(nèi)容是: this is file2.txt
file3.txt的內(nèi)容是: this is file3.txt
file4.abc的內(nèi)容是: this is file4.abc
file5.abc的內(nèi)容是: this is file5.abc
② 可以使用如下命令把本地文件系統(tǒng)的“/home/hadoop/***.txt”上傳到HDFS中的當(dāng)前用戶目錄
上傳文件的代碼顯示如下圖所示
(4) 利用Java API與HDFS進(jìn)行交互——在Ubuntu中安裝Eclipse
① 可以到Eclipse官網(wǎng)(https://www.eclipse.org/downloads/)下載安裝包。
② 假設(shè)安裝文件下載后保存在了Linux系統(tǒng)的目錄“~/Downloads”下,下面執(zhí)行如下命令對(duì)文件進(jìn)行解壓縮:
$ cd ~/Downloads
$ sudo tar -zxvf ./eclipse-4.7.0-linux.gtk.x86_64.tar.gz -C /usr/local
③ 然后,執(zhí)行如下命令啟動(dòng)Eclipse:
$ cd /usr/local/eclipse`
$ ./eclipse
這樣就可以看到啟動(dòng)界面,如下圖所示:提示設(shè)置工作空間(workspace)
可以直接采用默認(rèn)的設(shè)置“/home/hadoop/workspace”,點(diǎn)擊“OK”按鈕。可以看出,由于當(dāng)前是采用hadoop用戶登錄了Linux系統(tǒng),因此,默認(rèn)的工作空間目錄位于hadoop用戶目錄“/home/hadoop”下。
④ 為了能讓代碼順利運(yùn)行,需要在Eclipse工作空間(workspace)的bin目錄下復(fù)制屬于集群上的core-site.xml和dfs-site.xml(它們存放在/usr/local/hadoop/etc/hadoop目錄下)
⑤ Eclipse啟動(dòng)以后,選擇“File->New–>Java Project”菜單,開始創(chuàng)建一個(gè)Java工程,會(huì)彈出如下圖所示界面。
⑥ 點(diǎn)擊界面底部的“Next>”按鈕,為項(xiàng)目添加需要用到的JAR包,包含common或者common/lib與hdfs或者h(yuǎn)dfs/lib,還有client下所有的JAR包這些JAR包都位于Linux系統(tǒng)的Hadoop安裝目錄下,對(duì)于本教程而言,就是在“/usr/local/hadoop/share/hadoop”目錄下。點(diǎn)擊界面中的“Libraries”選項(xiàng)卡,然后,點(diǎn)擊界面右側(cè)的“Add External JARs…”按鈕,會(huì)彈出如下圖所示界面。
(5) 編寫Java應(yīng)用程序
① 請(qǐng)?jiān)贓clipse工作界面左側(cè)的“Package Explorer”面板中(如下圖所示),找到剛才創(chuàng)建好的工程名稱“HDFSExample”,然后在該工程名稱上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單中選擇“New–>Class”菜單。然后在出現(xiàn)的界面中只需要在“Name”后面輸入新建的Java類文件的名稱,這里采用名稱“MergeFile1”(其余java文件操作類似)“HDFSCreate”“HDFSUpload”…其他都可以采用默認(rèn)設(shè)置,然后,點(diǎn)擊界面右下角“Finish”按鈕
出現(xiàn)如下圖所示界面。
② read.java創(chuàng)建并編寫完畢后結(jié)果以及最終演示如下圖所示(實(shí)現(xiàn)下載功能,并展示下載內(nèi)容):
(6) 這里展示MergeFile1.java的源代碼文件。
package Demo;
import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
/**
* 過濾掉文件名滿足特定條件的文件
*/
class Filter implements PathFilter {
String reg = null;
Filter(String reg) {
this.reg = reg;
}
public boolean accept(Path path) {
if (!(path.toString().matches(reg)))
return true;
return false;
}
}
/***
* 利用FSDataOutputStream和FSDataInputStream合并HDFS中的文件
*/
public class MergeFile1 {
Path inputPath = null; //待合并的文件所在的目錄的路徑
Path outputPath = null; //輸出文件的路徑
public MergeFile1(String input, String output) {
this.inputPath = new Path(input);
this.outputPath = new Path(output);
}
public void doMerge() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.43.49:9000");//特別注意此處192.168.43.49是自己主節(jié)點(diǎn)的IP地址
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fsSource = FileSystem.get(URI.create(inputPath.toString()), conf);
FileSystem fsDst = FileSystem.get(URI.create(outputPath.toString()), conf);
//下面過濾掉輸入目錄中后綴為.abc的文件
FileStatus[] sourceStatus = fsSource.listStatus(inputPath,
new Filter(".*\\.abc"));
FSDataOutputStream fsdos = fsDst.create(outputPath);
PrintStream ps = new PrintStream(System.out);
//下面分別讀取過濾之后的每個(gè)文件的內(nèi)容,并輸出到同一個(gè)文件中
for (FileStatus sta : sourceStatus) {
//下面打印后綴不為.abc的文件的路徑、文件大小
System.out.print("路徑:" + sta.getPath() + " 文件大小:" + sta.getLen()
+ " 權(quán)限:" + sta.getPermission() + " 內(nèi)容:");
FSDataInputStream fsdis = fsSource.open(sta.getPath());
byte[] data = new byte[1024];
int read = -1;
while ((read = fsdis.read(data)) > 0) {
ps.write(data, 0, read);
fsdos.write(data, 0, read);
}
fsdis.close();
}
ps.close();
fsdos.close();
}
public static void main(String[] args) throws IOException {
MergeFile1 merge = new MergeFile1(
"hdfs://192.168.43.49:9000/user/hadoop/",//特別注意此處192.168.43.49是自己主節(jié)點(diǎn)的IP地址
"hdfs://192.168.43.49:9000/user/hadoop/merge.txt");//特別注意此處192.168.43.49是自己主節(jié)點(diǎn)的IP地址
merge.doMerge();
}
}
MergeFile.java運(yùn)行結(jié)果如下
merge.txt文件生成成功
merge.txt文件內(nèi)容展示如下
5. 完成情況與問題討論
(1) 實(shí)際完成情況
完成!
(2) 問題與討論
問題一:偽分布的java API實(shí)現(xiàn)與全分布有什么不同?
解決:文章來源:http://www.zghlxwxcb.cn/news/detail-828000.html
Configuration conf =new Configuration();
//對(duì)于全分布而言是連接到NameNode(主節(jié)點(diǎn)的ip地址)
//對(duì)于偽分布而言使用localhost代替主機(jī)ip地址的輸入。
conf.set("fs.defaultFS", "hdfs://192.168.43.49:9000");
//得到HDFS的客戶端
FileSystem fs = FileSystem.get(conf);
問題二:出現(xiàn)Wrong FS:hdfs://localhost:9000/user/hadoop/input.txt,excepted:file:///這類問題該怎么辦?
解決:
把配置文件放到當(dāng)前Java工程目錄下:需要把集群上的core-site.xml和hdfs-site.xml(這兩個(gè)文件存在于/usr/local/hadoop/etc/hadoop目錄下)放到當(dāng)前工程項(xiàng)目下,即eclipse工作目錄的bin文件夾下面文章來源地址http://www.zghlxwxcb.cn/news/detail-828000.html
到了這里,關(guān)于大數(shù)據(jù)技術(shù)原理與應(yīng)用實(shí)驗(yàn)指南——HDFS JAVA API編程實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!