1.實驗?zāi)康?/h2>
(1)理解HDFS在Hadoop體系結(jié)構(gòu)中的角色;
(2)熟練使用HDFS操作常用的Shell命令;
(3)熟悉HDFS操作常用的Java API。
2. 實驗平臺
(1)操作系統(tǒng):Linux;
(2)Hadoop版本:2.7.4 ;
(3)JDK版本1.8;
(4)Java IDE:eclipse ?。
3. 實驗步驟
(一)編程實現(xiàn)以下功能,并利用Hadoop提供的Shell命令完成相同任務(wù):
(1)向HDFS中上傳任意文本文件,如果指定的文件在HDFS中已經(jīng)存在,則由用戶來指定是追加到原有文件末尾還是覆蓋原有的文件
/**
* 向HDFS中上傳任意文本文件
* 如果指定的文件在 HDFS 中已經(jīng)存在
* 由用戶指定是追加到原有文件末尾還是覆蓋原有的文件
* @param fileSystem
* @param srcPath 本地文件地址
* @param desPath HDFS文件地址
* @author yangd
*/
@Test
private static void test1(FileSystem fileSystem, Path srcPath, Path desPath) {
try {
if (fileSystem.exists(new Path("/a/test.txt"))) {
System.out.println("文件已存在,是否覆蓋原有的文件? ( y 覆蓋/n 追加)");
if (new Scanner(System.in).next().equals("y")) {
fileSystem.copyFromLocalFile(false, true, srcPath, desPath);
} else {
FileInputStream inputStream = new FileInputStream(srcPath.toString());
FSDataOutputStream outputStream = fileSystem.append(new Path("/test/test.txt"));
byte[] bytes = new byte[1024];
int read = -1;
while ((read = inputStream.read(bytes)) > 0) {
outputStream.write(bytes, 0, read);
}
inputStream.close();
outputStream.close();
}
} else {
fileSystem.copyFromLocalFile(srcPath, desPath);
}
} catch (IOException e) {
e.printStackTrace();
}
}
調(diào)用方法
public static void main(String args[]) throws IOException {
// HDFS路徑
Path path1 = new Path("/a/test.txt");
// 本地路徑
Path path2 = new Path("D:/test.txt");
System.setProperty("hadoop.home.dir", "D:\\Hadoop2.7.4\\hadoop-2.7.4");
// 構(gòu)造一個配置參數(shù)對象,設(shè)置一個參數(shù):要訪問的HDFS的URI
Configuration conf = new Configuration();
// 這里指定使用的是HDFS
conf.set("fs.defaultFS", "hdfs://192.168.121.130:9000");
// 通過如下的方式進行客戶端身份的設(shè)置
System.setProperty("HADOOP_USER_NAME", "root");
// 通過FileSystem的靜態(tài)方法獲取文件系統(tǒng)客戶端對象
FileSystem fs = FileSystem.get(conf);
test1(fs, path2, path1);
}
結(jié)果
shell
hadoop fs -put /export/data/word.txt /test
hadoop fs -appendToFile /export/data/word.txt /test
hadoop fs -copyFromLocal -f /export/data/word.txt /test
(2)從HDFS中下載指定文件,如果本地文件與要下載的文件名稱相同,則自動對下載的文件重命名;
/**
?? ?* 從HDFS中下載指定文件 若本地文件與要下載的文件名稱相同
?? ?* 則自動對下載的文件重命名
?? ?* @param fileSystem
?? ?* @param remotePath HDFS文件地址
?? ?* @param localPath? 本地文件地址
?? ?* @author yangd
?? ?*/
?? @Test
?? private static void test2(FileSystem fileSystem, Path remotePath, Path localPath) {
????? try {
????????? if (fileSystem.exists(remotePath)) {
???????????? if(!(fileSystem.equals(localPath))){
???????????? fileSystem.copyToLocalFile(remotePath, localPath);
???????????? System.out.println("從HDFS中下載文件成功!");
???????????? }else {
???????????? ?? fileSystem.copyToLocalFile(remotePath, new Path("localPath"+ new Random().nextInt() + ".txt"));
??????????????? System.out.println("從HDFS中下載文件并重命名成功!");
???????????? }
????????? } else {
???????????? System.out.println("在HDFS中找不到此文件!");
????????? }
????? }catch (IOException e) {
????????? e.printStackTrace();
????? }
?? }
hadoop fs -copyToLocal /a/test.txt /export/data/test.txt
(3)將HDFS中指定文件的內(nèi)容輸出到終端中;
hadoop fs -cat /a/test.txt
/**
?? ?* 將HDFS中指定文件的內(nèi)容輸出到終端中
?? ?*
?? ?* @param fileSystem
?? ?* @param remotePath
?? ?* @author yangd
?? ?*/
?? @Test
?? private static void test3(FileSystem fileSystem, Path remotePath) {
????? try {
????????? FSDataInputStream inputStream = fileSystem.open(remotePath);
????????? BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
????????? String line;
???? System.out.println("HDFS中文件內(nèi)容為:");
????????? while ((line = bufferedReader.readLine()) != null) {
???????????? System.out.println(line);
????????? }
????? } catch (IOException e) {
????????? e.printStackTrace();
????? }
?? }
(4)顯示HDFS中指定的文件的讀寫權(quán)限、大小、創(chuàng)建時間、路徑等信息;
/**
?? ?* 顯示HDFS中指定的文件的讀寫權(quán)限、大小、創(chuàng)建時間、路徑等信息
?? ?* @param fileSystem
?? ?* @param remotePath HDFS文件地址
?? ?* @author yangd
?? ?*/
?? private static void test4(FileSystem fileSystem, Path remotePath) {
????? try {
????????? FileStatus[] fileStatus = fileSystem.listStatus(remotePath);
????????? System.out.println("HDFS中指定的文件的讀寫權(quán)限、大小、創(chuàng)建時間、路徑信息如下:");
????????? for (FileStatus status : fileStatus) {
????????? ?? System.out.println(status.getPermission());
????????? ?? System.out.println(status.getBlockSize());
????????? ?? System.out.println(status.getAccessTime());
???????????? System.out.println(status.getPath());
????????? }
????? } catch (IOException e) {
????????? e.printStackTrace();
????? }
?? }
hadoop fs -ls -h /a/test.txt
完整實驗過程及源代碼和運行結(jié)果截圖下載鏈接:
?文章來源:http://www.zghlxwxcb.cn/news/detail-417602.html
??實驗2常用的HDFS操作.doc-Linux文檔類資源-CSDN文庫文章來源地址http://www.zghlxwxcb.cn/news/detail-417602.html
到了這里,關(guān)于實驗2熟悉常用的HDFS操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!