A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

hdfs:hadoop distributed file system分布式文件系统

一、设计思想

1.分块存储

举个例子,如有有100T文件,存在3个节点,怎么存?100T存在一个节点上吗?直接存储在一台机器上 合理吗?不合理!负载不均衡。我们可以将100T分成多个部分进行存储,分块存储。

每个部分(块)应该分很多合适?1T,如果文件只有2T,分成2个块,还是负载不均衡!
如果块太大不合适,负载会不均衡。

块大小1kb合适吗?也不合适。元数据存储的时候,一个块会存储一条元数据,这样会导致需要存很多元数据。namenode的压力会很大。

hadoop中已经对块做了设计:hadoop1:块大小默认64M ;hadoop2:块大小默认是128M;

在参数设置里有:
dfs.blocksize    134217728     128M

说到这里,我们来看一下集群中的配置:

集群中的所有的配置如果没有进行配置则使用默认配置:
例如我的配置在:/home/hadoop/apps/hadoop-2.7.6/share/hadoop/目录下的jar包中:
                core-default.xml
                hdfs-default.xml
                yarn-default.xml
                mapred-default.xml
想要修改默认块大小,只需要修改这个参数:
hdfs-site.xml文件中:
    <property>
        <name>dfs.blocksize</name>
        <value>46472828</value>
    </property>
如有自己进行配置了,则会覆盖原始的默认配置

再来看一下具体的存储,按照系统默认设置,如果有一个文件300M,则需要分成几块3块(300/128)  
    块1:0-127
    块2:128-255
    块3:256-300M   44M  不满128M   仍然会单独成一个块  块的实际大小44M
如果又来一个文件有150M,是接着上一个的存,还是自己独立存储?
答:自己独立进行存
    块4:0-127
    块5:128-150
所以如果文件存储完了,块不够128M 就按照实际的进行存储,单独存一个块。一个单独的文件即使只有1kb也占一个块。

2. 备份存储—-副本机制

副本是什么?

副本相当于是备份,完全复制出来的,文件完全一样。

在hdfs中数据块的存储是采用多副本存储的

各个副本之间没有主次之分,多个副本之间是相互互为副本,地位一样的。这里副本的个数也就是文件的总份数。例如副本数量为3,也就是这个文件的在集群中的总数量是3。
hadoop集群中默认存储的副本个数:3。

副本配置参数:
    dfs.replication 3

一个块这里配置了几个副本 就会复制几份出来

1)如果配置了副本,则会覆盖默认的副本数量

如果只有3个节点,副本有2个,则每一个块会被存2份。假设有一个块损坏了,剩下1个,这个时候hdfs会进行复制,达到块的个数2。假设复制完了,刚才的损坏的块又恢复了,块的个数变为3 ,这个时候块多1个,namenode在一定的时间内如果发现还是3个块,则会删除一个块,最终达到2个块。

2)同一个块多副本如何存储:

多副本存在一个节点上有没有意义?没有意义,因为如果机器宕机所有副本都没有了。所以每个副本存储在不同的节点上,任何两个副本都不可能存储在相同的节点上。也就是说每一个节点上只能存储同一个块的一个副本,一个节点上可以存多个块,但是这些块都是不同的块。

3)如果节点2个,副本4个怎么存储?

实际存储的时候会存储2个,集群会进行记账,欠2个副本,当集群中的节点个数增加的时候会进行复制,最终复制到4个。

4)副本个数越多越好吗?

副本个数越多数据安全性越高,但是数据维护起来越困难,成本加大。hdfs底层用空间换取数据安全的,因为目前硬件成本相对于数据价值来说是比较低的。

二、hdfs主要架构

namenode的作用一:存储元数据元数据记录了—-抽象目录树:hdfs是一个文件系统 类似于linux根目录/(所有集群共同存储的根目录,不指某一台机器的根目录)

这里的抽象目录树指的是hdfs上的文件目录结构对于用户是看不到底层的一个个节点的,他们看到的是一个抽象出来的目录树。

元数据记录了—-数据和块的映射关系
Block ID: 1073741825,这个参数是全局、(整个hdfs集群)唯一的,是块的标识,每一个块都有自己唯一的id。
Block Pool ID: BP-54673466-192.168.40.201-1531445892504,这个参数是集群的块池,一个namenode只对应一个块池
Generation Stamp: 1001
Size: 134217728   128M

映射关系如:
hadoop-2.7.6.tar.gz
    blk_1073741825
    blk_1073741826


元数据记录了—- 数据块的存储位置

Availability,这个参数记录数据块的存储位置
    hadoop02
    hadoop01

元数据的位置:

/home/hadoop/data/hadoopdata/name/current的目录下:
<property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/hadoop/data/hadoopdata/data</value>
    <description>datanode 的数据存储目录</description>
</property>

namenode的作用二:接收客户端的读写请求

datanode的作用一:负责真正的数据存储

存储的路是在配置文件中写好的,例如我的:
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/data/hadoopdata/data</value>
        <description>datanode 的数据存储目录</description>
    </property>

实际路径在:home/hadoop/data/hadoopdata/data/current/BP-54673466-192.168.40.201-1531445892504/current/finalized/subdir0/subdir0下会:
blk_1073741825          blk_1073741826

datanode的作用二:负责处理客户端的真正读(下载)写(上传)请求

secondarynamenode:是namenode的备份节点 (冷备份)

帮助namenode进行元数据备份;帮namenode做一些工作,减轻nanenode压力

hdfs优缺点

优点

(1)成本低,在普通的廉价机上就可以使用。以硬件故障作为常态
(2)高容错性,一个机器宕机的时候不影响数据的访问
(3)适合批量数据访问:适合离线数据访问
(4)适合大数据访问
(5)流式访问:一次写入,多次读取。不支持修改,修改的成本太高
缺点

(1)不支持低延迟的数据访问,不支持实时的数据访问
(2)不擅长存储小文件(大量的小文件)
寻址时间过长: 在进行数据访问的时候先访问元数据,如果存储了大量的小文件,会花费很长的时间在元数据检索上
namenode的压力过大:底层元数据存储的时候是一个块存储一条元数据,一条元数据大概是150byte,会造成namenode中存储大量的元数据信息,增加namenode的压力
不支持文件内容修改,但是支持对文件内容追加(不建议使用)
三、hdfs的使用

1.脚本方式(使用广泛)

命令

文件上传的命令:hadoop fs -put 本地文件 hdfs路径
查看文件的命令:hadoop fs -ls 路径
启动hadoop的客户端:hadoop fs
hadoop/hdfs:hadoop namemode -format
fs:run a generic filesystem user client
将本地文件追加到hdfs的指定的文件上 ,追加到末尾,不建议使用:-appendToFile aa.txt /yy
查看文件的命令:hadoop fs -cat /hadoop-2.7.6.tar.gz
hadoop fs -checksum /yy
修改文件夹权限:hadoop fs -chmod 777 /yy
修改文件所属用户:chown
本地文件上传到hdfs的根目录:hadoop fs -copyFromLocal aa.txt /
新建文件 空文件:hadoop fs -touchz /yy
删除空文件夹:hadoop fs -rmdir /aa/bb/cc
删除文件:hadoop fs -rm -r -f /aa
-r|R递归删除
-f force 强制删除
从hdfs下载文件到本地:hadoop fs -copyToLocal /yy ./
计数统计:hadoop fs -count /aa
               5            3          216983315 /
             目录的个数    文件的个数   大小
1
2
把hdfs中aa.txt文件复制到/aa下:hadoop fs -cp /aa.txt /aa
查看磁盘占有率:hadoop fs -df -h
查看指定路径的磁盘占有:hadoop fs -du -h /
文件下载: hadoop fs -get /yy ./
显示末尾的 显示末尾1kb的数据:hadoop fs -tail /aa.txt
调整文件或目录的副本个数的:hadoop fs -setrep 4 /hadoop.tar.gz
-w wait,等待复制完成
-R 修改目录的时候代表递归修改其下面的所有文件的副本个数
`
hadoop fs -setrep -w 4 -R /aa

- 以文本方式显示 zip 、jar :
- 显示末尾的 显示末尾1kb的数据hadoop fs -tail /aa.txt

2.api方式

用得较少,不赘述


5 个回复

倒序浏览
回复 使用道具 举报
奈斯
回复 使用道具 举报
牛牛牛!
回复 使用道具 举报
回复 使用道具 举报

优秀
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马