Hadoop 学习笔记之HDFS
一、HDFS概述
1、定义
HDFS 是一个分布式文件系统,用于存储文件,通过目录树来定位文件,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色
2、使用场景
- 需要存储和处理海量数据(如日志分析、数据仓库)
- 一次写入、多次读取的场景(如数据分析和机器学习)
- 对延迟要求不高但需要高吞吐量的应用
3、优缺点
优点:
- 高容错性和可靠性 :数据自动保存多个副本(默认3个),确保数据在硬件故障时仍可用;即使某一节点失效,其他副本仍可提供数据访问;某一副本丢失可自动恢复
- 支持大规模数据存储 :能够处理GB,TB,PB级别规模的数据;能够处理百万以上级别的文件数量
- 廉价硬件的高效利用 :可以运行在普通廉价硬件上,通过分布式架构实现高性能存储和访问
缺点:
- 不适合低延时数据访问 :不能实现毫秒级的数据存储
- 无法高效的对大量小文件进行存储 :大量小文件会占用 NameNode 大量内存和块信息;小文件存储的寻址时间会超过读取时间,违反了hdfs的设计目标
- 不支持并发写入和文件随机修改 :一个文件只能有一个写,不支持多线程写;文件仅支持追加,不支持随机修改
4、组成架构
NameNode+ DataNode + Secondary NameNode + Client
- NameNode 是管理者,管理hdfs的名称空间;配置副本策略;管理数据块映射信息;处理客户端读写请求
- DataNode 是执行者,存储实际的数据块;执行数据块的读写操作
- Secondary NameNode 并非 NameNode 的热备;当 NameNode 实际挂掉的时候,并不能马上替换 NameNode 并提供服务;辅助NameNode ,分担其工作量;比如定期合并 Fsimage 和Edits ,并推送给 NameNode ;在紧急情况下,可辅助恢复 NameNode
- Client 客户端。文件切分, 文件上传 HDFS 的时候, Client 将文件分成一个一个的块, 然后进行上传; 与 NameNode 交互, 获取文件的位置信息; 与 DataNode 交互, 读取或写入数据; 提供一些命令来管理、访问 HDFS ,比如 NameNode 格式化、增删改查操作
5、文件块(Block)
HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定
- 文件块默认128M -> 磁盘传输速率普遍每秒传输100M左右文件
- 设置太小 -> 文件块太多; 增加寻址时间
- 设置太大 -> 文件传输时间增加;远远大于寻址时间;处理数据会非常慢
- 总结: 文件块大小设置取决于磁盘传输速率
二、HDFS 的 Shell 操作
1、常用命令:
- 上传 : hadoop fs -put 本地文件路径 hdfs文件路径 (-moveFromLocal \ -copyFromLocal)
- 下载 : hadoop fs -get 本地文件路径 hdfs文件路径 (-copyToLocal)
- 追加 : hadoop fs -appendToFile 本地文件路径 hdfs文件路径
- 显示目录信息 : hadoop fs -ls hdfs文件路径
- 显示文件内容 : hadoop fs -cat hdfs文件路径
- 创建路径 : hadoop fs -mkdir hdfs文件路径
- 拷贝 : hadoop fs -cp hdfs文件路径 hdfs文件路径
- 移动文件 : hadoop fs -mv hdfs文件路径 hdfs文件路径
- 显示末尾 : hadoop fs -tail hdfs文件路径
- 删除文件 : hadoop fs -rm hdfs文件路径 (-rm -r 递归删除)
- 文件夹大小 : hadoop fs -du -s -h hdfs文件路径 (-h显示每一个文件的大小)
- 设置副本数量 : hadoop fs -setrep 数量 hadoop fs -setrep
三、HDFS的读写流程
1、文件写入流程
- 客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件(将需要写入的文件名、文件大小等信息告诉 NameNode),NameNode 检查目标文件是否已存在,父目录是否存在
- NameNode 返回是否可以上传,如果通过检查。NameNode 会将操作写入 EditLog
- 客户端请求第一个 Block 上传到哪几个 DataNode 服务器上
- NameNode 返回 DataNode 节点,分别为dn1、dn2、dn3
- 客户端通过 FSDataOutputStream 模块请求 dn1 上传数据,dn1 收到请求会继续调用 dn2,然后 dn2 调用 dn3,将这个通信管道建立完成
- dn1、dn2、dn3 逐级应答客户端
- 客户端开始往 dn1上传第一个 Block(先从磁盘读取数据放到一个本地内存缓存),以 packet 为单位,dn1 收到一个 Packet 就会传给 dn2,dn2 传给 dn3;dn1每传一个 packet 会放入一个应答队列等待应答。每个 DataNode 写完一个块后,会返回确认信息
- 当一个 Block 传输完成之后,客户端再次请求 NameNode 上传第二个 Block 的服务器
- 写完数据,关闭输出流
- 发送完成信号给 NameNode
在 HDFS 写数据的过程中,NameNode 会选择距离待上传数据最近距离的 DataNode 接收数据
- 节点距离:两个节点到达最近的共同祖先的距离总和
副本节点选择:
- 第一个副本在 Client 所处的节点上。如果客户端在集群外,随机选一个。
- 第二个副本在另一个机架的随机一个节点
- 第三个副本在第二个副本所在机架的随机节点
2、HDFS读数据流程
- 客户端通过 DistributedFileSystem 向 NameNode 请求下载文件,NameNode 通过查询元数据,找到文件块所在的 DataNode 地址
- 挑选一台 DataNode(就近原则,然后随机)服务器,请求读取数据
- DataNode 开始传输数据给客户端(从磁盘里面读取数据写给输入流,以 Packet 为单位来做校验)
- 客户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件
四、NameNode 和 SecondaryNameNode
1、NameNode 启动
- 第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存
- 客户端对元数据进行增删改的请求
- NameNode 记录操作日志,更新滚动日志
- NameNode 在内存中对元数据进行增删改
2、Secondary NameNode工作
- Secondary NameNode 询问 NameNode 是否需要 CheckPoint(检查点),直接带回NameNode 是否检查结果
- Secondary NameNode 请求执行 CheckPoint
- NameNode 滚动正在写的 Edits 日志
- 将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode
- Secondary NameNode 加载编辑日志和镜像文件到内存,并合并
- 生成新的镜像文件 fsimage.chkpoint
- 拷贝 fsimage.chkpoint 到 NameNode
- NameNode 将 fsimage.chkpoint 重新命名成 fsimage
3、Fsimage和Edits解析
NameNode 被格式化之后,将在 $hadoop$/data/tmp/dfs/name/current目录中产生如下文件
fsimage_0000000000000000000、fsimage_0000000000000000000.md5、seen_txid、VERSION
- Fsimage (镜像文件):HDFS 文件系统元数据的一个永久性的检查点,其中包含 HDFS 文件系统的所有目录和文件 inode 的序列化信息
- Edits (编辑日志):存放 HDFS 文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中
- seen_txid文件保存的是一个数字,就是最后一个edits_的数字
- 每次 NameNode启动的时候都会将 Fsimage 文件读入内存,加载 Edits 里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成 NameNode 启动的时候就将 Fsimage 和 Edits 文件进行了合并
4、CheckPoint时间设置
- 通常情况下,SecondaryNameNode每隔一小时执行一次(hdfs-default.xml)
<property> <name>dfs.namenode.checkpoint.period</name> <value>3600s</value> </property>- 一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次
<property> <name>dfs.namenode.checkpoint.txns</name> <value>1000000</value> <description>操作动作次数</description> </property> <property> <name>dfs.namenode.checkpoint.check.period</name> <value>60s</value> <description> 1分钟检查一次操作次数</description> </property>五、DataNode
1、DataNode工作机制
- 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据,包括数据块的长度,块数据的校验和,以及时间戳
- DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息
- 心跳机制每3秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令,如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟 + 30秒没有收到某个DataNode的心跳,则认为该节点不可用
- 集群运行中可以安全加入和退出一些机器
2、数据完整性
- 当 DataNode 读取 Block 的时候,它会计算 CheckSum
- 如果计算后的 CheckSum,与 Block 创建时值不一样,说明 Block 已经损坏
- Client 读取其他 DataNode 上的 Block
- 常见的校验算法crc(32),md5(128),sha1(160)
- DataNode 在其文件创建后周期验证 CheckSum
