1. 程式人生 > >HDFS的JAVA客戶端編寫(JAVA程式碼實現對HDFS的操作)

HDFS的JAVA客戶端編寫(JAVA程式碼實現對HDFS的操作)

原始碼如下:

package com.sfd.hdfs;

import java.io.FileInputStream;
import java.io.IOException;

import org.apache.commons.compress.utils.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import
org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.junit.BeforeClass; import org.junit.Test; public class HdfsUtils { private static FileSystem fs; /** * 每次測試前都將進入此方法對fs進行初始化 * @throws Exception */ @BeforeClass
public static void init()throws Exception{ Configuration conf=new Configuration(); /** 設定配置檔案(hdfs-site.xml,core-site.xml檔案)的資訊, 也可以將工作目錄下的core-site.xml,hdfs-site.xml檔案 新增到src目錄下,如果不填加程式執行時會報錯, 因為程式的預設的檔案管理系統是本地的檔案管理系統而不是 hdfs。 下面的設定相當於告訴程式,我們的配置是作用在hdfs(分散式檔案系統)上的, 這個設定將會覆蓋scr目錄下hdfs-site.xml中的相應屬性的配置 通過這個配置生成的fs實際上繼承了抽象類FileSystem的DistributedFileSystem子類。 */
conf.set("fs.defaultFS", "hdfs://localhost:9000"); fs = FileSystem.get(conf); } /** * 上傳檔案到hdfs上(沒有被封裝) * @throws Exception */ @Test public void upload() throws Exception{ Path path=new Path("hdfs://localhost:9000/sfd/sfd3.txt"); //從檔案系統中的到輸出流 FSDataOutputStream os=fs.create(path); //得到客戶端本地的輸入流 FileInputStream in=new FileInputStream("/home/sfd/soft/download/sfd1.txt"); //將上面得到的輸入流中的資料通過工具類複製到輸出流中,從而實現檔案從本地上傳到hdfs的過程 IOUtils.copy(in, os); } /** * 使用框架實現本地檔案的上傳 * @throws Exception */ @Test public void upload2() throws Exception{ fs.copyFromLocalFile(new Path("/home/sfd/soft/download/sfd1.txt"), new Path("hdfs://localhost:9000/aa/bb/sfd3.txt")); } /** * 使用框架下載hdfs中的檔案到本地 * @throws Exception */ @Test public void download()throws Exception{ fs.copyToLocalFile(new Path("hdfs://localhost:9000/aa/bb/sfd3.txt"), new Path("/home/sfd/soft/download/sfd4.txt")); } /** * 查詢檔案目錄中的所有檔案(包括子資料夾下的檔案,不包括資料夾) * @throws Exception */ @Test public void listFile()throws Exception{ //得到hdfs指定(第一個引數)目錄下的檔案狀態的迭代器,第二個引數表示是否迭代的取出該目錄下資料夾下的子檔案 RemoteIterator< LocatedFileStatus> files=fs.listFiles(new Path("/"), false); //遍歷迭代器得到檔名 while (files.hasNext()){ //分別得到每個檔案的狀態 LocatedFileStatus file=files.next(); //從狀態中得到檔案的路徑,進而得到檔名 Path path=file.getPath(); String filename=path.getName(); //輸出檔名 System.out.println(filename); } } /** * 查詢指定目錄下的檔案和資料夾 * @throws Exception */ @Test public void listFindAndDir()throws Exception{ //得到檔案的狀態 FileStatus[] listStatus = fs.listStatus(new Path("/")); //遍歷 for (FileStatus fileStatus:listStatus){ Path path = fileStatus.getPath(); String name = path.getName(); System.out.println(name); } } /** * 在hdfs中建立資料夾 * @throws Exception */ @Test public void makedir()throws Exception{ //如果bb資料夾沒有就先建立bb資料夾,如果aa還沒有就先建立cc資料夾 fs.mkdirs(new Path("/aa/bb/cc")); } /** * 使用框架刪除檔案或非空資料夾 * @throws Exception */ @Test public void remove()throws Exception{ //刪除目錄,第二個引數便是是否遞迴刪除,如果第一個引數表示的是非空的資料夾,就會報錯 fs.delete(new Path("/aa/bb"), true); } /** * 使用框架實現檔案的重新命名和移動 * @throws Exception */ @Test public void reName()throws Exception{ //1.當兩個引數所指向的檔案在一個資料夾下的時候實現的是重新命名 //2.當兩個引數所指向的檔案在不同資料夾下的時候實現的是移動檔案 fs.rename(new Path("/sfd/sfd1.txt"),new Path("/sfd/sfd4.txt")); } }