阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

初识HDFS原理及框架

268次阅读
没有评论

共计 5532 个字符,预计需要花费 14 分钟才能阅读完成。

目录
  1. HDFS 是什么
  2. HDFS 的优缺点
  3. HDFS 的框架
  4. HDFS 的读写流程
  5. HDFS 命令
  6. HDFS 参数

1. HDFS 是什么


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

2.HDFS 的优缺点


      之所以选择 HDFS 来存储数据,是具有如下优势:

No优势描述
1高容错性
  • 数据自动保存多个副本。它通过增加副本的形式,提高容错性。
  • 某一个副本丢失以后,它可以自动恢复,这是由 HDFS 内部机制实现的,我们不必关心。
2适合批处理
  • 它是通过移动计算而不是移动数据。
  • 它会把数据位置暴露给计算框架。
3适合大数据处理
  • 处理数据达到 GB、TB、甚至 PB 级别的数据。
  • 能够处理百万规模以上的文件数量,数量相当之大。
  • 能够处理 10K 节点的规模。
4流式文件访问
  • 一次写入,多次读取。文件一旦写入不能修改,只能追加。
  • 它能保证数据的一致性。
5可构建在廉价机器上
  • 它通过多副本机制,提高可靠性。
  • 它提供了容错和恢复机制。比如某一个副本丢失,可以通过其它副本来恢复。

       HDFS 也有不适合的场景:

No缺点描述
1低延时数据访问
  • 比如毫秒级的来存储数据,这是不行的,它做不到。
  • 它适合高吞吐率的场景,就是在某一时间内写入大量的数据。但是它在低延时的情况下是不行的,比如毫秒级以内读取数据,这样它是很难做到的。
2小文件存储
  • 存储大量小文件 (这里的小文件是指小于 HDFS 系统的 Block 大小的文件(默认 64M)) 的话,它会占用 NameNode 大量的内存来存储文件、目录和块信息。这样是不可取的,因为 NameNode 的内存总是有限的。
  • 小文件存储的寻道时间会超过读取时间,它违反了 HDFS 的设计目标。
3并发写入、文件随机修改
  • 一个文件只能有一个写,不允许多个线程同时写。
  • 仅支持数据 append(追加),不支持文件的随机修改。

3. HDFS 框架结构


 初识 HDFS 原理及框架

    HDFS 采用 Master/Slave 的架构来存储数据,这种架构主要由四个部分组成,分别为 HDFS Client、NameNode、DataNode 和 Secondary NameNode。下面我们分别介绍这四个组成部分。

No角色功能描述
1Client:就是客户端
  • 文件切分。文件上传 HDFS 的时候,Client 将文件切分成 一个一个的 Block,然后进行存储。
  • 与 NameNode 交互,获取文件的位置信息。
  • 与 DataNode 交互,读取或者写入数据。
  • Client 提供一些命令来管理 HDFS,比如启动或者关闭 HDFS。
  • Client 可以通过一些命令来访问 HDFS。
2NameNode:就是 master,它是一个主管、管理者
  • 管理 HDFS 的名称空间
  • 管理数据块(Block)映射信息
  • 配置副本策略
  • 处理客户端读写请求。
3DataNode:就是 Slave。NameNode 下达命令,DataNode 执行实际的操作
  • 存储实际的数据块。
  • 执行数据块的读 / 写操作。
4Secondary NameNode:并非 NameNode 的热备。当 NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务
  • 辅助 NameNode,分担其工作量。
  • 定期合并 fsimage 和 fsedits,并推送给 NameNode。
  • 在紧急情况下,可辅助恢复 NameNode。

4. HDFS 的读写流程


   4.1. HDFS 的块大小

       HDFS 中的文件在物理上是分块存储(block),块的大小可以通过配置参数 (dfs.blocksize) 来规定,默认大小在 hadoop2.x 版本中是 128M,老版本中是 64M

       HDFS 的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。

       如果寻址时间约为 10ms,而传输速率为 100MB/s,为了使寻址时间仅占传输时间的 1%,我们要将块大小设置约为 100MB。默认的块大小 128MB

       块的大小:10ms*100*100M/s = 100M

   4.2. HDFS 写数据流程

初识 HDFS 原理及框架

1)客户端向 namenode 请求上传文件,namenode 检查目标文件是否已存在,父目录是否存在。

2)namenode 返回是否可以上传。

3)客户端请求第一个 block 上传到哪几个 datanode 服务器上。

4)namenode 返回 3 个 datanode 节点,分别为 dn1、dn2、dn3。

5)客户端请求 dn1 上传数据,dn1 收到请求会继续调用 dn2,然后 dn2 调用 dn3,将这个通信管道建立完成

6)dn1、dn2、dn3 逐级应答客户端

7)客户端开始往 dn1 上传第一个 block(先从磁盘读取数据放到一个本地内存缓存),以 packet 为单位,dn1 收到一个 packet 就会传给 dn2,dn2 传给 dn3;dn1 每传一个 packet 会放入一个应答队列等待应答

8)当一个 block 传输完成之后,客户端再次请求 namenode 上传第二个 block 的服务器。(重复执行 3 - 7 步)

   4.3. HDFS 读数据流程

初识 HDFS 原理及框架

1)客户端向 namenode 请求下载文件,namenode 通过查询元数据,找到文件块所在的 datanode 地址。

2)挑选一台 datanode(就近原则,然后随机)服务器,请求读取数据。

3)datanode 开始传输数据给客户端(从磁盘里面读取数据放入流,以 packet 为单位来做校验)。

4)客户端以 packet 为单位接收,先在本地缓存,然后写入目标文件。

5.HDFS 命令


1)基本语法

     bin/hadoop fs 具体命令

2)常用命令实操

(1)-help:输出这个命令参数

              bin/hdfs dfs -help rm

(2)-ls: 显示目录信息

             hadoop fs -ls /

(3)-mkdir:在 hdfs 上创建目录

             hadoop fs  -mkdir  -p  /aaa/bbb/cc/dd

(4)-moveFromLocal 从本地剪切粘贴到 hdfs

             hadoop  fs  – moveFromLocal  /home/hadoop/a.txt  /aaa/bbb/cc/dd

(5)-moveToLocal:从 hdfs 剪切粘贴到本地(尚未实现)

            hadoop fs -help moveToLocal

             -moveToLocal <src> <localdst> :

               Not implemented yet

(6)–appendToFile:追加一个文件到已经存在的文件末尾

          hadoop  fs  -appendToFile  ./hello.txt  /hello.txt

(7)-cat:显示文件内容

(8)-tail:显示一个文件的末尾

        hadoop  fs  -tail  /weblog/access_log.1

(9)-chgrp、-chmod、-chown:linux 文件系统中的用法一样,修改文件所属权限

        hadoop  fs  -chmod  666  /hello.txt

        hadoop  fs  -chown  someuser:somegrp  /hello.txt

(10)-copyFromLocal:从本地文件系统中拷贝文件到 hdfs 路径去

        hadoop  fs  -copyFromLocal  ./jdk.tar.gz  /aaa/

(11)-copyToLocal:从 hdfs 拷贝到本���

        hadoop fs -copyToLocal /user/hello.txt ./hello.txt

(12)-cp:从 hdfs 的一个路径拷贝到 hdfs 的另一个路径

        hadoop  fs  -cp  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2

(13)-mv:在 hdfs 目录中移动文件

        hadoop  fs  -mv  /aaa/jdk.tar.gz  /

(14)-get:等同于 copyToLocal,就是从 hdfs 下载文件到本地

        hadoop fs -get /user/hello.txt ./

(15)-getmerge:合并下载多个文件,比如 hdfs 的目录 /aaa/ 下有多个文件:log.1, log.2,log.3,…

        hadoop fs -getmerge /aaa/log.* ./log.sum

(16)-put:等同于 copyFromLocal

        hadoop  fs  -put  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2

(17)-rm:删除文件或文件夹

       hadoop fs -rm -r /aaa/bbb/

(18)-rmdir:删除空目录

       hadoop  fs  -rmdir  /aaa/bbb/ccc

(19)-df:统计文件系统的可用空间信息

       hadoop  fs  -df  -h  /

(20)-du 统计文件夹的大小信息

       hadoop fs -du -s -h /user/data/wcinput

  188.5 M  /user/data/wcinput

        hadoop fs -du  -h /user/data/wcinput

  188.5 M  /user/data/wcinput/hadoop-2.7.2.tar.gz

97     /user/data/wcinput/wc.input

(21)-count:统计一个指定目录下的文件节点数量

        hadoop fs -count /aaa/

        hadoop fs -count /user/data/wcinput

      1                  2          197657784 /user/data/wcinput

嵌套文件层级;包含文件的总数

(22)-setrep:设置 hdfs 中文件的副本数量

         hadoop fs -setrep 3 /aaa/jdk.tar.gz 

这里设置的副本数只是记录在 namenode 的元数据中,是否真的会有这么多副本,还得看 datanode 的数量。如果只有 3 台设备,最多也就 3 个副本,只有节点数的增加到 10 台时,副本数才能达到 10。

6.HDFS 相关参数


No参数名称默认值所属参数文件描述
1

dfs.block.size,

dfs.blocksize

134217728hdfs-site.xml以字节计算的新建 HDFS 文件默认块大小。请注意该值也用作 HBase 区域服务器 HLog 块大小。
2dfs.replication3hdfs-site.xmlHDFS 文件的数据块复制份数。
3dfs.webhdfs.enabledTRUEhdfs-site.xml启用 WebHDFS 界面,启动 50070 端口。
4dfs.permissionsTRUEhdfs-site.xmlHDFS 文件权限检查。
5dfs.datanode.failed.volumes.tolerated0hdfs-site.xml能够导致 DN 挂掉的坏硬盘最大数,默认 0 就是只要有 1 个硬盘坏了,DN 就会 shutdown。
6

dfs.data.dir,

dfs.datanode.data.dir

xxx,xxxhdfs-site.xmlDataNode 数据保存路径,可以写多块硬盘,逗号分隔
7

dfs.name.dir,

dfs.namenode.name.dir

xxx,xxxhdfs-site.xmlNameNode 本地元数据存储目录,可以写多块硬盘,逗号分隔
8fs.trash.interval1core-site.xml垃圾桶检查频度(分钟)。要禁用垃圾桶功能,请输入 0。
9dfs.safemode.min.datanodes0hdfs-site.xml指定在名称节点存在 safemode 前必须活动的 DataNodes 数量。输入小于或等于 0 的值,以在决定启动期间是否保留 safemode 时将活动的 DataNodes 数量考虑在内。值大于群集中 DataNodes 的数量时将永久保留 safemode。
10dfs.client.read.shortcircuitTRUEhdfs-site.xml启用 HDFS short circuit read。该操作允许客户端直接利用 DataNode 读取 HDFS 文件块。这样可以提升本地化的分布式客户端的性能
11dfs.datanode.handler.count3hdfs-site.xmlDataNode 服务器线程数。默认为 3, 较大集群, 可适当调大些, 比如 8。
12dfs.datanode.max.xcievers, dfs.datanode.max.transfer.threads256hdfs-site.xml指定在 DataNode 内外传输数据使用的最大线程数,datanode 在进行文件传输时最大线程数
13dfs.balance.bandwidthPerSec, dfs.datanode.balance.bandwidthPerSec1048576hdfs-site.xml每个 DataNode 可用于平衡的最大带宽。单位为字节 / 秒

以上参数中可能有 2 个名称,前面一个是老版本 1.x 的后面的是新版本 2.x 的。

使用 HDFS dfs 命令对文件进行增删改查操作 https://www.linuxidc.com/Linux/2018-08/153641.htm

Hadoop 集群间的 HDFS 文件拷贝  https://www.linuxidc.com/Linux/2017-09/146879.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5532字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中