HDFS教程及命令实例

HDFS

HDFS是Hadoop下的分布式文件管理系统,本文是于考试之前整理所写,希望对于即将考试,或是有意愿学习Hadoop的朋友能有所帮助=v=

1.1 HDFS概述

1.1_1 HDFS产生的背景

随着数据量越来越大,在一个操作系统存储不下所有的数据,那么就分配带更多的操作系统管理的磁盘中,但是不方便管理和维护,所以迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统,HDFS是分布式文件管理系统中的一种

1.1_2 HDFS定义

HDFS(Hadoop Distributed File System),首先它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多台服务器联合起来实现其功能,集群中的服务器有各自的特色。

HDFS适用的场景:适合一次写入、多次读出的场景,且不支持文件的修改。适合用于数据分析,不合适用于网盘。

1.2 HDFS优缺点

1.2_1 优点

- 高容错性

数据自动保存多个副本。通过增加副本的形式,提高容错性。某一个副本丢失之后,可以自动恢复。

- 适合处理大数据

数据规模:能够处理数据规模达到GB、TB,甚至PB级别的数据。
文件规模:能够处理百万规模以上的文件数量,数量相当之大。

- 可以构建在廉价机器上,通过多副本机制,提高可靠性。

1.2_2 缺点

  • 不适合低延时数据访问,比如毫秒级别的存储数据,是做不到的

  • 无法高效的对大量小文件进行存储

    存储大量小文件的话,会占用NameNode大量内存来存储目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。
    小文件的寻址时间会超过读取时间,违反了HDFS的设计目标。

  • 不支持并发写入、文件随即修改
    一个文件只能有一个写,不允许多个线程同时写入。

    仅支持数据追加(append),不支持文件的随机修改。

1.3 HDFS组成架构

HDFS组成架构

1. NameNode(nn)

NameNode:就是master,是一个主管,管理者

主要功能:

  • 管理HDFS的名称空间。
  • 配置副本策略
  • 管理数据块(Block)映射信息。
  • 处理客户端读写请求。

2. DataNode(dn)

DataNode:就是slave。NameNode下达命令,DataNode执行命令

主要功能:

  • 存储实际的数据块。
  • 执行数据块的读/写操作。

3. Client

Client:客户端。

主要功能:

  • 文件切片。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传。
  • 与NameNode进行交互,获取文件的位置信息。
  • 与DataNode进行交互,读取或写入数据。
  • Client提供一些命令来管理HDFS,比如HDFS的格式化。
  • Client可以通过一些命令来访问HDFS,比如对HDFS增删改查操作。

4. SecondaryNameNode

SecondaryNameNode:并非NameNode的热备。当NameNode挂掉时,不会马上替换NameNode并提供服务。

  • 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode。
  • 紧急情况下,可以辅助恢复NameNode。

1.4 HDFS文件块的大小

HDFS中的文件在物理上是分块存储的(Block),块的大小可以通过参数dfs.blocksize设置,在Hadoop2.X版本中,默认大小是128MB,老版本是64MB,本地运行是32MB。
在这里插入图片描述
一个规定:当寻址时间为传输时间的1%时,为最佳状态

1.5 HDFS的Shell操作

1.5_1 基本语法

bin/hadoop fs 具体命令bin/hdfs dfs 具体命令,dfs是fs的实现类。

1.5_2 命令手册

在终端中输入 hdfs dfs即可查看

如下图:
在这里插入图片描述

1.5_3 常用命令

  1. 启动Hadoop集群

    #sbin/start-dfs.sh

    #sbin/start-yarn.sh

  2. -help:输出命令的帮助信息

    #hadoop fs -help rm
    help

  3. -ls:显示目录信息

    #hadoop fs -ls /-ls

  4. -mkdir:在HDFS上创建目录

    #hadoop fs -mkdir -p /0x01/usr
    -mkdir

  5. -moveFromLocal:从本地剪切到HDFS

    #hadoop fs -moveFromLocal /src /target
    -moveFromLocal

  6. -appendToFile:追加一个文件到已经存在的文件末尾
    #hadoop fs -appendToFile /src /target
    -appenToFile

  7. -cat:显示文件内容

    #hadoop fs -cat /0x01/usr/nametest
    -cat

  8. -chgrp、-chmod、-chown:与Linux系统中的用法一致,修改文件所属权限

    初始状态:
    init status
    增加执行权限:
    在这里插入图片描述
    结果如下:在这里插入图片描述
    更改组:
    在这里插入图片描述
    结果如下:
    在这里插入图片描述
    更改所属者:

    在这里插入图片描述

    结果如下:

在这里插入图片描述

  1. -copyFromLocal:从本地系统中拷贝文件到HDFS路径中

    在这里插入图片描述

  2. -copyToLocal:从HDFS上拷贝文件到本地

    在这里插入图片描述

  3. -cp:从HDFS的一个路径拷贝到另一个路径

    #hadoop fs -cp /src /target

    在这里插入图片描述

  4. -mv:在HDFS路径间移动文件

    #hadoop fs -mv /src /target

    在这里插入图片描述

  5. -get:等同于copyFromLocal,就是从HDFS下载文件到本地。

  6. -getmerge:合并下载多个文件,比如HDFS的目录/logs下有log.1、log.2、log.3

    在这里插入图片描述

  7. -put:等同于copyFromLocal

    #hadoop -put /src /target

  8. tail:显示一个文件的结尾

    #hadoop fs -tail /0x01/usr/nametest
    在这里插入图片描述

  9. -rmdir:删除空的路径

  10. -du:统计文件夹的大小信息

在这里插入图片描述

  1. -setrep:设置HDFS中文件的副本数量

    #hadoop fs -setrep 10 /0x01/usr/nametest

    原始状态:

在这里插入图片描述

执行后状态在这里插入图片描述
在这里插入图片描述
PS:由于我的Hadoop集群只有三台机器 所以副本数量不能设置到3以上。

接下来的内容需要有一定的maven、java基础。可以选择在自己的windows上用IDEA做,或者在linux上编写进行,笔者选择在IDEA上进行,没办法 懒就一个字。开摆!!啊对对对!啊对对对!啊对对对!

1.6 HDFS客户端操作环境准备与测试

客户端分类:

  • Shell
    hadoop fs 以及 hdfs dfs
  • Java API

在自己的机器上安装Maven与JDK,笔者选择的是JDK17,MVN选择的是maven3.8.3。当然也可以选择其他版本,看个人喜好吧!

附上调用JAVA API的POM文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>hadooptest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hadoop.version>2.7.2</hadoop.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.ap
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值