1. 程式人生 > >【Hadoop】HDFS開發手冊(JavaAPI)

【Hadoop】HDFS開發手冊(JavaAPI)

文章目錄

前言

在這裡插入圖片描述

Hadoop家族有很多重要成員,下面列出來的是準備去搞的。

  1. hdfs
  2. hbase
  3. hive
  4. sqoop
  5. zookper
  6. flume

原理的東西,說簡單很簡單,說複雜很複雜。

小編不跟大神比拼,但是會寫一些遇到的坑,思考,總結。

步入正題,HDFS是什麼。HDFS是一個分散式檔案系統。

針對技術學習上的總結方法,我一般持有這幾個點:

來歷、特點、解決的問題、應用場景

維基百科解析:是一種允許檔案透過網上在多臺主機上分享的檔案系統,可讓多機器上的多使用者分享檔案和儲存空間

這篇部落格主要是寫一下Java API的操作,後續更新在伺服器上的HDFS Shell命令。

同步更新Spark。

深入到原始碼和原理,我希望另外寫文章。先把程式碼敲起來,後面就會好奇原始碼和實現的原理了。

大家可以關注程式碼和小編的總結點。

準備

  1. 開發環境
  2. 依賴引入
  3. 瞭解一下HDFS基本操作

既然是檔案系統,開啟你的WIN10系統,看看最常用的操作是什麼呢?

Core Code

建立資料夾

/**
     * 建立資料夾.
     *
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void testMakeDir() throws IOException {
        fileSystem.
mkdirs(new Path("D:\\test\\test")); }

建立新檔案

/**
     * 建立檔案,引數二true代表存在即覆蓋.
     *
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void testCreateFile() throws IOException {
        fileSystem.create(new Path("D:\\test\\test\\demo.txt"), true);
    }

    /**
     * 建立新檔案 .
     * 不同於create是 先執行 exists方法檢視檔案是否存在,不存在才建立
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void testCreateNewFile() throws IOException {
        fileSystem.createNewFile(new Path("D:\\test\\test\\demo.txt"));
    }

讀取檔案

/**
     * 讀取檔案並列印
     *
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void testReadFile() throws IOException {
        FSDataInputStream fsDataInputStream = fileSystem.open(new Path("D:\\test\\test.txt"));
        IOUtils.copyBytes(fsDataInputStream, System.out, configuration);
    }

檔案是否存在

/**
     * 檔案是否存在.
     *
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void testExist() throws IOException {
        boolean exists = fileSystem.exists(new Path("D:\\test"));
        System.out.println(exists);
    }

下載檔案從指定目錄

 /**
     * 下載檔案從指定目錄.
     *
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void downLoadFile() throws IOException {
        fileSystem.copyFromLocalFile(new Path("D:\\test\\distance-final.txt"), new Path("D:\\test\\test\\"));
    }

上傳檔案到指定目錄

/**
     * 上傳檔案到指定目錄.
     *
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void uploadFile() throws IOException {
        fileSystem.copyFromLocalFile(new Path("D:\\test\\demo.txt"), new Path("D:"));
    }

刪除檔案或資料夾

/**
     * 刪除檔案或資料夾.
     * 引數二的true代表 遞迴刪除
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void deleteFile() throws IOException {
        fileSystem.delete(new Path("D:/test/test"), true);
    }

追加內容

/**
     * 追加內容.
     *
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void testAppendContent() throws IOException {
        configuration.set("dfs.support.append", "true");
        FSDataOutputStream fsDataOutputStream = fileSystem.append(new Path("D:/test/test/demo.txt"));
        fsDataOutputStream.write(new String("test something ").getBytes());
    }

重新命名檔案或資料夾

 /**
     * 重新命名檔案或資料夾.
     *
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void testRename() throws IOException {
        fileSystem.rename(new Path("D:/test/test/demo.txt"), new Path("D:/test/test/demo1.txt"));
    }

列出指定資料夾的檔案以及資料夾資訊

/**
     * 列出指定資料夾的檔案以及資料夾資訊.
     *
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void testListStatus() throws IOException {
        FileStatus[] fileStatuses = fileSystem.listStatus(new Path("D:/test"));
        for (FileStatus fileStatus : fileStatuses) {
            System.out.println(fileStatus.getPath().toString());
        }
    }

列出指定路徑所有檔案資訊

/**
     * 列出指定路徑所有檔案資訊.
     * listFiles第二個引數 true 遞迴查詢 會把子資料夾的檔案資訊也查找出來
     *
     * @throws IOException the io exception
     * @since hui_project 1.0.0
     */
    @Test
    public void testListFile() throws IOException {
        RemoteIterator<LocatedFileStatus> fileStatusRemoteIterator = fileSystem.listFiles(new Path("D:/test"), true);
        while (fileStatusRemoteIterator.hasNext()) {
            LocatedFileStatus next = fileStatusRemoteIterator.next();
            System.out.println(next.getPath());
        }
    }

Github

github更新了HDFS常用操作

常用操作在com.hui.bigdata.hadoop.hdfs.HDFSTest

https://github.com/ithuhui/hui-bigdata-hadoop

總結

針對技術學習上的總結方法,我一般持有這幾個點:

來歷、特點、解決的問題、應用場景

為什麼會出現他:常說大資料分析,分析的前提是你有資料,那那麼多資料總得找地方存吧。

資料越來越大了,存哪裡?一臺機器不夠,那就多臺。

主要理念就是:分塊,不管檔案本身多大,分塊之後都會變得更易於儲存。

應用場景不用多說了: 就是應用在資料的儲存(資料量大)。

特點:

  • 儲存量大(儲存空間)
  • 可執行在廉價通用的伺服器上(降低成本)
  • 不適合訪問要求低延遲的系統(HDFS是為高資料吞吐量應用而設計的,必然以高延遲為代價)
  • 儲存小檔案(分塊儲存,小檔案同樣佔用一塊,儘管不滿一塊)

小博主更新很累的…,由簡單入手,我進步一點,深入一點,就更新更深入的內容,

深入到原始碼和原理,我希望另外寫文章。先把程式碼敲起來,後面就會好奇原始碼和實現的原理了。

請求不多,有錯誤指出來,有問題一起討論。轉載就標註一下作者謝謝~