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做两次校验。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义