HDFS

本文详细介绍了HDFS(Hadoop Distributed File System)的核心概念,包括其块大小设定为128MB的原因,以及HDFS的Shell命令和Java程序操作。讨论了HDFS不适于随机读写和小文件存储的原因,并提供了文件上传、下载、块信息处理的实例。同时,文章通过一个分块下载的练习展示了HDFS的实际应用。
摘要由CSDN通过智能技术生成

HDFS

什么是HDFS

它是一个分布式文件系统,适合一次写入多次读出。

不支持文件的随机读写,支持对文件的追加。原因:HDFS在存储文件时,以块的形式存储。如果随机写入,为保证块的顺序,所有内容都要后移(类似于数组),第一块写入一个文件,后面所有块的内容都要后移,会造成大量的网络Io(在hadoop中是非常宝贵的资源)和磁盘Io。而追加的话,直接在最后一块上追加即可。HDFS不适应与低时间延迟的数据访问,大量的小文件存储以及多用户写入,任意修改文件的场景。

HDFS文件的块

在Hadoop中一个文件被存放在多个块之中,每个块默认的大小为128M,如果一个文件不足128m,它同样占据一个块,如果超过128m它将被分割,除最后一个块以外,每一块的大小都是128m,最后一个块的大小小于128m。

为什么是128m

首先128m是一个人为定义的值,在Hadoop中可以通过修改hdfs.site.xml进行修改,应当设置为512byte的倍数。因为HDFS在传输时,每512bytes校验一次/

<property>
  <name>dfs.blocksize</name>
  <value>134217728</value>
  <description>
 The default block size for new files, in bytes.
  You can use the following suffix (case insensitive):
  k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.),
      Or provide complete size in bytes (such as 134217728 for 128 MB).
  </description>
</property>

一个块是存储在磁盘上,因此在读写时,需要先寻址再读写。研究表明,一次最有性价比的传输是:寻址时间/传输时间=1%。寻址时间为10ms,因此传输时间控制在1s为好,在现有磁盘速度为100M/s时,设置128是最好的,如果磁盘读写速度达到500m,那可以设置512m;

但无论磁盘速度如何,块大小都不能过大或过小

  • 过大
  1. :hadoop运行在廉价机器,太大,如果一个块在传输时出错,重传的代价太高
  2. :分块读取和下载时,块太大不适应分块读取,造成资源的浪费,例如读400M到600m时,要读一个G太浪费了。
  3. :map阶段一次默认处理一个块(一次处理一个块map的效率高),如果切片太大,map阶段的运行效率低。
  • 过小
  1. :最直接的影响就是会增加NN的负担,NN中存储数据的元数据,过小的块会导致块的数量激增,NN需要处理的元数据信息过多(元数据会被加载到内存之中),服役能力下降。元数据信息有(权限信息 Last Modified Replication Block SizeN ame -rw-r–r-- jueshali supergroup 273.81 MB tiem 备份数 文件大小 文件名),还有就是每一块在哪台机器上。
  2. :块太小,每次读取一个块都要一定的寻址时间,效率低。
  • ps hadoop不适合存储小文件
  1. :小文件太多,NN受不了
  2. :小文件在读写时,性价比太低,量少信息量低。

HDFS的Shell操作

hadoop fs + 命令

输入 hadoop fs会出现如下信息(命令)

Usage: hadoop fs [generic options]
    [-appendToFile <localsrc> ... <dst>]    \\向文件追加
    *[-cat [-ignoreCrc] <src> ...]   \\查看文件
    [-checksum <src> ...]       \\计算文件校验
    *[-chgrp [-R] GROUP PATH...] \\changeGroup
    [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]  \\权限设置
    [-chown [-R] [OWNER][:[GROUP]] PATH...] \\所有者设置
    *[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]\\从本地上传
    *[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]\\从hdfs下载到本地
    [-count [-q] [-h] <path> ...]\\计数
    [-cp [-f] [-p | -p[topax]] <src> ... <dst>]\\复制
    [-createSnapshot <snapshotDir> [<snapshotName>]]\\ 对一个snapshottable目录创建snapshot,snapshot可以用于数据的backup,避免用户错误和灾难恢复
    [-deleteSnapshot <snapshotDir> <snapshotName>]\\ 删除快照
    [-df [-h] [<path> ...]]\\ 显示磁盘使用情况
    [-du [-s] [-h] <path> ...]\\ 显示目录或者文件的大小
    [-expunge]\\接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。?
    [-find <path> ... <expression> ...]\\
    [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]\\下载
    [-getfacl [-R] <path>]\\获取副本数
    [-getmerge [-nl] <src> <localdst>]\\下载后合并
    [-help [cmd ...]]\\帮助
    [-ls [-d] [-h] [-R] [<path> ...]]\\ 类似于ls
    [-mkdir [-p] <path> ...]\\创建文件夹
    [-moveFromLocal <localsrc> ... <dst>]\\移动
    [-moveToLocal <src> <localdst>]\\移动
    [-mv <src> ... <dst>]\\移动允许多个源路径
    [-put [-f] [-p] [-l] <localsrc> ... <dst>]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值