二、HDFS 概述与基本使用

HDFS 作为最早的大数据存储系统,存储着宝贵的数据资产,各种新的算法、框架要想得到人们的广泛使用,必须支持 HDFS 才能获取已经存储在里面的数据。所以大数据技术越发展,新技术越多,HDFS 得到的支持越多,我们越离不开 HDFS。HDFS 也许不是最好的大数据存储技术,但依然最重要的大数据存储技术。

HDFS 基本组成

1、HDFS 涉及两个重要进程:NameNode、DataNode;
2、表现形式上:主要是 目录和文件。毕竟是文件系统;
3、物理存储单元是 block。

物理存储单元为什么不是文件呢?在使用或表现形式上,HDFS的文件与Windows系统上的文件是一致的。但是考虑数据的分布式查看和计算,所以将文件内的数据分块存储是非常有必要。

HDFS 一些特点

1、一个分布式文件存储系统。可扩展性强,能存放大量数据;
2、容错率高。每一个block都有备份(包括自己,默认3个)。当主block不能出错时,可以使用备份的block;
3、适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变;
4、不支持并发写入和随机写入,可以创建、删除、追加。
5、不适合大量的小文件的存储。

HDFS 的基本使用

HDFS 的基本命令与Linux操作文件或目录的命令基本是一致的:mkdir、cp、等。启动集群后,可以通过 http://flink01:9870 查看命令操作后的结果。

  • 查看命令的使用帮助
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -help rm
  • 创建/删除 目录
# 创建传感器(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:从本地文件系统中拷贝文件到HDFS
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -copyFromLocal sensor2.txt /sensor
# put:等同于copyFromLocal,从本地文件系统中拷贝文件到HDFS
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -put sensor3.txt /sensor
  • 从HDFS的一个路径拷贝或移动到HDFS的另一个路径: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
  • 给文件追加内容:appendToFile
# appendToFile:追加一个文件到已经存在的文件末尾
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -appendToFile sensor11.txt /sensor/sensor1.txt
  • 查看文件内容:cat、tail
cat:显示文件内容
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -cat /sensor/sensor1.txt
  • 查看目录信息:ls
# ls: 查看目录信息
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -ls /sensor
  • 设置文件的副本数量:setrep
    系统默认3个副本,设置的副本数如果大于节点数,将只有节点数的副本,后续增加节点则才能增加副本数量直至设置的副本数量。
# setrep:设置HDFS中文件的副本数量
[liuwen@flink01 hadoop-3.3.1]$ hadoop fs -setrep 10 /sensor/sensor1.txt
  • 其他命令
    修改文件所属权限:-chgrp、-chmod、-chown;
    统计文件夹的大小信息:-du -s -h

HDFS Client(Java)的API

写个HDFS的Java客户端得做一些准备工作:
1、下载对应版本的依赖包。这里我没发现3.3.1的,只能使用3.1.0的。后边发现也可以;
2、配置HADOOP_HOME环境变量,对应路径就是上边依赖包的的路径;
3、环境变量path中加上%HADOOP_HOME%/bin。

  • 创建Maven项目
  • 添加依赖
<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>
  • 在项目的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、关闭连接
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));
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容