二、HDFS 概述與基本使用

HDFS 作為最早的大數(shù)據(jù)存儲系統(tǒng),存儲著寶貴的數(shù)據(jù)資產(chǎn),各種新的算法、框架要想得到人們的廣泛使用,必須支持 HDFS 才能獲取已經(jīng)存儲在里面的數(shù)據(jù)。所以大數(shù)據(jù)技術(shù)越發(fā)展,新技術(shù)越多,HDFS 得到的支持越多,我們越離不開 HDFS。HDFS 也許不是最好的大數(shù)據(jù)存儲技術(shù),但依然最重要的大數(shù)據(jù)存儲技術(shù)。

HDFS 基本組成

1、HDFS 涉及兩個(gè)重要進(jìn)程:NameNode、DataNode;
2、表現(xiàn)形式上:主要是 目錄和文件。畢竟是文件系統(tǒng);
3、物理存儲單元是 block。

物理存儲單元為什么不是文件呢?在使用或表現(xiàn)形式上,HDFS的文件與Windows系統(tǒng)上的文件是一致的。但是考慮數(shù)據(jù)的分布式查看和計(jì)算,所以將文件內(nèi)的數(shù)據(jù)分塊存儲是非常有必要。

HDFS 一些特點(diǎn)

1、一個(gè)分布式文件存儲系統(tǒng)??蓴U(kuò)展性強(qiáng),能存放大量數(shù)據(jù);
2、容錯(cuò)率高。每一個(gè)block都有備份(包括自己,默認(rèn)3個(gè))。當(dāng)主block不能出錯(cuò)時(shí),可以使用備份的block;
3、適合一次寫入,多次讀出的場景。一個(gè)文件經(jīng)過創(chuàng)建、寫入和關(guān)閉之后就不需要改變;
4、不支持并發(fā)寫入和隨機(jī)寫入,可以創(chuàng)建、刪除、追加。
5、不適合大量的小文件的存儲。

HDFS 的基本使用

HDFS 的基本命令與Linux操作文件或目錄的命令基本是一致的:mkdir、cp、等。啟動集群后,可以通過 http://flink01:9870 查看命令操作后的結(jié)果。

  • 查看命令的使用幫助
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -help rm
  • 創(chuàng)建/刪除 目錄
# 創(chuàng)建傳感器(sensor)目錄
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -mkdir /sensor
# 刪除目錄
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -rm -r /sensor
  • 上傳文件:moveFromLocal、copyFromLocal、put
# moveFromLocal:從本地剪切粘貼到HDFS
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs  -moveFromLocal  ./sensor1.txt  /sensor
# copyFromLocal:從本地文件系統(tǒng)中拷貝文件到HDFS
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -copyFromLocal sensor2.txt /sensor
# put:等同于copyFromLocal,從本地文件系統(tǒng)中拷貝文件到HDFS
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -put sensor3.txt /sensor
  • 從HDFS的一個(gè)路徑拷貝或移動到HDFS的另一個(gè)路徑:cp、mv
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -cp /sanguo/sensor3.txt /
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -mv /sanguo/sensor3.txt /
  • 下載文件:copyToLocal、get
# copyToLocal:從HDFS拷貝到本地
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -copyToLocal /sensor/sensor1.txt ./sensor
# get:等同于copyToLocal
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -get /sensor/sensor1.txt ./sensor
  • 給文件追加內(nèi)容:appendToFile
# appendToFile:追加一個(gè)文件到已經(jīng)存在的文件末尾
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -appendToFile sensor11.txt /sensor/sensor1.txt
  • 查看文件內(nèi)容:cat、tail
cat:顯示文件內(nèi)容
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -cat /sensor/sensor1.txt
  • 查看目錄信息:ls
# ls: 查看目錄信息
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -ls /sensor
  • 設(shè)置文件的副本數(shù)量:setrep
    系統(tǒng)默認(rèn)3個(gè)副本,設(shè)置的副本數(shù)如果大于節(jié)點(diǎn)數(shù),將只有節(jié)點(diǎn)數(shù)的副本,后續(xù)增加節(jié)點(diǎn)則才能增加副本數(shù)量直至設(shè)置的副本數(shù)量。
# setrep:設(shè)置HDFS中文件的副本數(shù)量
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -setrep 10 /sensor/sensor1.txt
  • 其他命令
    修改文件所屬權(quán)限:-chgrp、-chmod、-chown;
    統(tǒng)計(jì)文件夾的大小信息:-du -s -h

HDFS Client(Java)的API

寫個(gè)HDFS的Java客戶端得做一些準(zhǔn)備工作:
1、下載對應(yīng)版本的依賴包。這里我沒發(fā)現(xiàn)3.3.1的,只能使用3.1.0的。后邊發(fā)現(xiàn)也可以;
2、配置HADOOP_HOME環(huán)境變量,對應(yīng)路徑就是上邊依賴包的的路徑;
3、環(huán)境變量path中加上%HADOOP_HOME%/bin。

  • 創(chuàng)建Maven項(xiàng)目
  • 添加依賴
<dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.30</version>
        </dependency>
    </dependencies>
  • 在項(xiàng)目的resource目錄下增加日志配置文件:log4j.properties
log4j.rootLogger=INFO, stdout  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n  
log4j.appender.logfile=org.apache.log4j.FileAppender  
log4j.appender.logfile.File=target/spring.log  
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
  • 寫代碼,具體就不說了
    1、連接HDFS
    2、操作
    3、關(guān)閉連接
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

/**
 * @author Administrator
 */
public class HDFSClient {

    FileSystem fs;

    @Before
    public void connet() throws URISyntaxException, IOException, InterruptedException {
        URI uri = new URI("hdfs://flink01:8020");
        Configuration configuration = new Configuration();
        fs = FileSystem.get(uri, configuration, "liuwen");
    }

    @After
    public void close() throws IOException {
        fs.close();
    }

    @Test
    public void testMKDir() throws URISyntaxException, IOException, InterruptedException {
        fs.mkdirs(new Path("/sensor"));
    }

    @Test
    public void testPut() throws URISyntaxException, IOException, InterruptedException {
        fs.copyFromLocalFile(new Path("D:\\hadoop\\test-data\\sensor\\input"), new Path("/sensor/input"));
    }

    @Test
    public void testGet() throws URISyntaxException, IOException, InterruptedException {
        fs.copyToLocalFile(new Path("/sensor/test.txt"), new Path("D:\\test.txt"));
    }

    @Test
    public void testListFiles() throws URISyntaxException, IOException, InterruptedException {
        RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(new Path("/sensor"), true);

        while (iterator.hasNext()) {
            LocatedFileStatus fileStatus = iterator.next();

            System.out.println("========" + fileStatus.getPath() + "=========");
            System.out.println(fileStatus.getPermission());
            System.out.println(fileStatus.getOwner());
            System.out.println(fileStatus.getGroup());
            System.out.println(fileStatus.getLen());
            System.out.println(fileStatus.getModificationTime());
            System.out.println(fileStatus.getReplication());
            System.out.println(fileStatus.getBlockSize());
            System.out.println(fileStatus.getPath().getName());

            // 獲取塊信息
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            System.out.println(Arrays.toString(blockLocations));
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容