hdfs

hdfs是hadoop负责存储的模块。

分布式存储。

 

比如你有200T的资料。但是你只有200台1T的服务器。那么就可以用hdfs来做分布式存储。

用来管理数据具体存在哪的组件叫namenode。所以namenode就需要高可用,不然你不知道某1T的资料具体存在哪里。这就需要2NN,用来辅助namenode。(具体存文件的元数据,比如文件名,文件属性,目录结构)(2NN每隔一段时间对namenode进行备份)

具体存储数据的组件叫datanode。(具体存文件块,和校验和)

 

hdfs适合一次写入,多次读取的场景。

优点:容错性高,因为是多副本的。适合处理大数据,不管是数据规模还是文件规模大,都能处理。机器要求不高。

缺点:不适合低延时数据访问。无法高效存储大量小文件(大量的小文件会占用namenode大量内存来存储目录结构和块信息。同时小文件的寻址时间会超过读取时间,这违背了大数据设计的目标)。不适合并发写入,文件随机修改。

 

namenode负责管理HDFS的名称空间,配置副本策略,管理数据块隐射信息,处理客户端读写请求。

datanode实际存储数据,执行数据块的读写。

second namenode:并非namenode的热备。当namenode挂掉时,并不能马上代替namenode工作。主要是辅助namenode,定期合并fsimage和edits并推送给namenode。紧急情况下,可以辅助恢复namenode。

 

biock块大小的设置,假设寻址时间为10ms,那么寻址时间为传输时间的1%就是最好的。也就是传输时间为1S.而HDD差不多就是100MB/S左右。所以默认时128M.如果你是用的SSD,那么可以调到256MB.

设置得太小,寻址时间会变大。设置得太大,传输时间会太大。

 

shell操作:

hadoop fs 具体命令

或者

hdfs dfs 具体命令

 

具体命令举例:

上传:

-mkdir /data 创建文件夹。

-moveFromLocal ./localfile /data  从本地剪切到HDFS

-copyFromLocal 同上,只不过是复制

-put 和copy是一样的

-appendToFile 追加

 

下载:

 -copyToLocal /data/file ./  拷贝到本地

-get同上

 

直接操作:

-ls

-cat

-chgrp -chmod -chown 

-mkdir

-cp

-mv

-tail

-rm

-rm r

......

以上命令和linux下是一样的。不多说。 

-setrep 10 /data/file 设置副本数量。(和你datanode数量有关,比如说你只有3个datanode,你把这个值设成了10.它会显示有10个副本,但是实际上只有3个副本,但是如果你添加了一个datanode,他会自动拷贝副本到新机器。)

 

HDFS resetful API:

 

 3.1.3版本支持的/

基本的操作都有。之前有个项目,在调研HDFS的时候。由于只能用resetful api去操作。结果看完了,没有发现mv操作,就放弃了,转用glusterfs了。

 

 

HDFS的写流程:

1.HDFS Client创建distributed filesystem然后向namenode请求上传文件。

2.namenode检查权限和目录结构。

3.回复可以上传文件。

4.client请求上传第一个block,请namenode返回datanode

5.namenode返回datanode节点。

6.client  write FSDataOutPutStream。传输方式是client先向datanode1传输block,然后node1向node2传输,node2向node3传输。以此类推。然后node3向node2应答成功,node2向node1应答成功,最后回复client成功。

client传输的最小单位是packet,64k。packet有包括很多个chunk。chunk是由512byte+4byte的checksum组成。

然后第一个packet到达node1,node1开始写盘,同时把这个packet传给node2。也就是说,每一个packet都需要一个ACK。

 

 

HDFS节点距离计算:

上面的读写流程,其实namenode在返回datanode的时候是需要选择的。首先考虑的是节点最近,然后再考虑负载均衡。

同一节点上的进程:distance=0

同一机架上的不同节点:distance=2

同一机房的不同机架节点:distance=4

不同机房:distance=6

至于机架感知,比较复杂,就不说了,在官方文档搜索hdfsdesign/data_replication就行了

 

 

HDFS读数据流程:

1.HDFS Client创建distributed filesystem然后向namenode请求下载文件。

2.namenode检查权限和目录结构。

3.返回文件的元数据。

4.client创建FSDatalnputStream,请求读数据blk_1.(具体请求哪一个datanode,会先考虑距离,然后再考虑负载)

5.datanode向client传输数据。

6.这个读取过程是串行读。以block为单位。

 

 

namenode和second namenode工作机制:

 namenode存储的数据(内存中)=fsimage中的数据(磁盘上记录的初始值)与edits的合并(磁盘上记录的变化)

和AOF很像。

而fsimage和edits的合并就由2NN进行。

具体的工作原理:

在HDFS启动时:

1.加载编辑日志edits和镜像文件fsimage到内存。(每个block在内存中站150byte)

2.client对namenode进行元数据请求。

3.在edits中记录操作日志,更新滚动日志。

4.更新内存。

然后2NN异步合并流程:

1.2NN请求NN是否需要checkpoint。(2种条件。1是定时,2是edits满了)

2.2NN请求执行checkpoint。

3.生成一个新的edits。如果有新的操作,那么会追加到新的edits上。

4.将旧的edits和fsimage拷贝到2NN节点。

5.将edits和fismage加载到内存进行合并。并生成新的fsimage.chkpoint

6.将fsimage.chkpoint拷贝到NN。并重命名为fsimage。

 

 

fsimage,edits文件和其他相关文件:

 fsimage是HDFS文件系统元数据的一个永久性检查点,其中包含HDFS的所有目录和inode序列化信息。

edits:存放HDFS所有更新操作的路径,客户端所有的写操作会先写到edits里。

seen_txid:保存edits最新版本号

用hdfs oiv可以查看fsimage文件。hdfs oev可以查看edits文件。

 

checkpoint:

默认触发时间是3600秒。

或者edits的操作打到100w次(2NN默认每隔1分钟检查一次)

两个参数都能改。

 

datanode:

每个block维护数据,时间戳,校验和,数据长度。

datanode启动后,会主动向namenode注册。

每隔6小时还会继续向namenode上报块信息。

心跳每3秒进行一次。超过10分钟+30秒没有收到心跳,namenode认为该节点不可用。

 

数据完整性:

用的是crc校验。在client和HDFS做两次校验。

posted @ 2022-07-06 16:17  拿什么救赎  阅读(198)  评论(0编辑  收藏  举报