溫馨提示×

溫馨提示×

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

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

五、通過API操作hdfs

發布時間:2020-07-22 19:18:23 來源:網絡 閱讀:321 作者:隔壁小白 欄目:大數據

一、基本api操作

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

方式1:

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

方式2:

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

后面都是通過client這個文件系統對象調用各個方法操作hdfs的。

2、configuration對象的參數值配置

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

3、創建目錄

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

4、上傳文件

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

//還可以設置是否刪除本地文件,以及是否覆蓋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();

//還可以設置是否刪除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表示是否遞歸顯示子目錄下的內容

//例子:
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());
            //文件權限
            System.out.println(i.getPermission());
            //文件屬主
            System.out.println(i.getOwner());
            //文件數組
            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數組,無法遞歸顯示子目錄下的內容,但是能查看子目錄本身的屬性,用法
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("權限:" + f.getPermission());
            System.out.println("大小:" + f.getLen());
            System.out.println("==========================");
        }
        client.close();
    }

9、文件類型判斷

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

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

二、以IO流操作hdfs

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

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

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

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

inputstream   輸入流
outputstream  輸出流
buffsize      緩沖區
close         是否關閉流

例子:

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

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

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

        //輸入流和輸出流對接
        try {
            //輸入流和輸出流拷貝,后面false表示不關閉流
            IOUtils.copyBytes(fis, fos, 1024,false);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //關閉輸入流和輸出流
            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();

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

        //創建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問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女