溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

五、通過API操作hdfs

發(fā)布時間:2020-07-22 19:18:23 來源:網(wǎng)絡(luò) 閱讀:277 作者:隔壁小白 欄目:大數(shù)據(jù)

一、基本api操作

1、獲取HDFS對象的兩種方式:

方式1:

public static FileSystem initFileSystem1() throws IOException {
        //獲取配置對象
        Configuration conf = new Configuration();
        //指定namenode地址
        conf.set("fs.defaultFS", "hdfs://bigdata121:9000");
        //獲取hdfs文件系統(tǒng)訪問對象
        FileSystem client = FileSystem.get(conf);
        return client;
    }

方式2:

public static FileSystem initFileSystem2() throws IOException, URISyntaxException {
        Configuration conf = new Configuration();
        //直接通過uri的方式獲取hdfs文件系統(tǒng)訪問對象
        FileSystem client = FileSystem.get(new URI("hdfs://bigdata121:9000"), conf);
        return client;
    }

后面都是通過client這個文件系統(tǒng)對象調(diào)用各個方法操作hdfs的。

2、configuration對象的參數(shù)值配置

//通過conf.set(key, value)的方式即可設(shè)置參數(shù)值,如
conf.set("fs.defaultFS", "hdfs://bigdata121:9000");

3、創(chuàng)建目錄

Path p = new Path(HDFS路徑);
client.mkdirs(p);

4、上傳文件

```;
Path dest = new Path(HDFS路徑);
Path src = new Path(本地路徑);
client.copyFromLocalFile(src, dest);

//還可以設(shè)置是否刪除本地文件,以及是否覆蓋hdfs中的原有同名文件


5、下載文件

//用法:
client.copyToLocalFile(srcPath,destPath,)

//例子:
Path downloadFile = new Path("/king/edit_new.xml");
Path destPath = new Path("G:\edits.xml");
client.copyToLocalFile(downloadFile, destPath);
client.close();

//還可以設(shè)置是否刪除hdfs中的源文件


6、刪除文件或者目錄

```java
/*方式1: client.delete(Path HDFS路徑,boolean 是否遞歸刪除)
         如果不是遞歸刪除,那么在刪除的目錄的時候,如果目錄非空,那么就會報錯
*/
Path deletePath = new Path("/linux2.txt");
client.delete(deletePath, true);
client.close();

/*方式2: client.deleteOnExit(Path HDFS路徑)*/
Path deletePath = new Path("/linux2.txt");
client.deleteOnExit(deletePath);       //存在裁刪除
client.close();

7、查看文件屬性(只能查看文件,不能查看目錄)

//返回的是一個LocatedFileStatus迭代器,用法:
RemoteIterator<LocatedFileStatus> pathList = client.listFiles(HDFS路徑, recursive);
recursive表示是否遞歸顯示子目錄下的內(nèi)容

//例子:
public void listFileMetaData() throws Exception{
        FileSystem client = initFileSystem2();
        Path listPath = new Path("/");
        //獲取指定路徑下列表,不遞歸顯示,返回一個迭代器
        RemoteIterator<LocatedFileStatus> pathList = client.listFiles(listPath, false);
        while (pathList.hasNext()) {
            LocatedFileStatus i = pathList.next();
            //獲取文件名
            System.out.println(i.getPath().getName());
            //文件權(quán)限
            System.out.println(i.getPermission());
            //文件屬主
            System.out.println(i.getOwner());
            //文件數(shù)組
            System.out.println(i.getGroup());
            //文件大小,單位Byte
            System.out.println(i.getLen());
            //文件的block的大小
            System.out.println("blocksize:" + i.getBlockSize());

            //獲取文件的block地址
            BlockLocation[] bl = i.getBlockLocations();
            for (BlockLocation b:bl) {
                //獲取每個block 的偏移地址
                System.out.println("offset:" + b.getOffset());
                //獲取當前副本的block所在的所有datanode的主機名
                String[] hosts = b.getHosts();
                for (String h:hosts) {
                    System.out.println(h);
                }
            }
            System.out.println("===========================");
        }

8、查看文件和目錄的屬性

//返回的是一個FileStatus數(shù)組,無法遞歸顯示子目錄下的內(nèi)容,但是能查看子目錄本身的屬性,用法
FileStatus[] f = client.listStatus(Path);

public void judgeFile() throws Exception{
        FileSystem client = initFileSystem2();
        Path path = new Path("/");
        //獲取FileSstatus對象
        FileStatus[] fileStatuses = client.listStatus(path);
        //通過Filestatus對象獲取文件或者目錄的屬性
        for (FileStatus f:fileStatuses) {
            System.out.println("文件名:" + f.getPath().getName());
            System.out.println("權(quán)限:" + f.getPermission());
            System.out.println("大小:" + f.getLen());
            System.out.println("==========================");
        }
        client.close();
    }

9、文件類型判斷

//通過上面的FileStatus和LocatedFileStatus 都可以調(diào)用內(nèi)部的方法判斷當前是文件還是目錄
FileStatus對象.isFile()
LocatedFileStatus對象.isFile()

FileStatus對象.isDirectory()
LocatedFileStatus對象.isDirectory()

二、以IO流操作hdfs

1、以IO流方式上傳文件
主要用到的是下面兩個方法:

//這是HDFS專用的數(shù)據(jù)流輸出流
FSDataOutputStream fos = client.create(Path)

//create方法還有以下參數(shù):
boolean overwrite:如果文件文件已存在,是否覆蓋,默認是true
short replication:可以指定副本數(shù),不指定就以hdfs的配置為準
int bufferSize:緩沖區(qū)大小
long blockSize:指定自己使用的塊大小
FsPermission var2:指定權(quán)限
ChecksumOpt checksumOpt:指定校驗值

//下面是對接輸入流和輸出流的工具
IOutils.copyBytes(inputstream,outputstream,buffsize,close)

inputstream   輸入流
outputstream  輸出流
buffsize      緩沖區(qū)
close         是否關(guān)閉流

例子:

 @Test
    public void putFileFromIO() throws Exception {
        FileSystem client = initFileSystem2();

        //創(chuàng)建本地文件字節(jié)輸入流
        InputStream fis = new FileInputStream("E:\\file\\big data\\java se\\第十八章 Java文件與IO流.md");

        //創(chuàng)建hdfs文件字節(jié)輸出流,注意,創(chuàng)建輸出流文件的時候,一定要指定文件名,否則會報錯
        Path uploadPath = new Path("/第十八章 Java文件與IO流.md");
        FSDataOutputStream fos = client.create(uploadPath);

        //輸入流和輸出流對接
        try {
            //輸入流和輸出流拷貝,后面false表示不關(guān)閉流
            IOUtils.copyBytes(fis, fos, 1024,false);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //關(guān)閉輸入流和輸出流
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
        }
    }

2、以IO流方式下載文件

Path getPath = new Path("/dog.txt");
FSDataInputStream fis = client.open(getPath);

例子:


/*
    * 寫入有兩種方式:
    * 1、使用流的read/write方法
    * 2、使用IOUtils.copyBytes(instream,outstream,buffize)這個工具
    * */
    @Test
    public void getFileFromIO() throws Exception{
        FileSystem client = initFileSystem2();

        //創(chuàng)建本地輸出流,保存內(nèi)容
        OutputStream fos = new FileOutputStream("F:\\edit_new.xml");

        //創(chuàng)建hdfs輸入流
        Path getPath = new Path("/dog.txt");
        FSDataInputStream fis = client.open(getPath);

        try {
            IOUtils.copyBytes(fis, System.out, 1024);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
        }

    }
向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI