Skip to main content

分布式文件系统HDFS

分布式文件系统 HDFS

HDFS: GFS的一个实现

name node + data node

replica 一般3, 同机架2, 异地1, 可以以文件为粒度配置

心跳: block report, 向name node报告元数据

通常跑在Linux fs上, name node一般单独的机器跑

单机一般一个node

不支持软硬链接

NameNode存的数据: filename, numReplicas, block-ids,...

3-replica为例: 同机架2, 异地1: 怎么做?hdfs支持机架感知

editlog

元数据 FsImage

这两个都在本地文件系统上

也类似db可以有checkpoint, 定时刷盘

走TCP/IP

任何文件都会有一个crc校验码, 避免传输损坏/恶意篡改

写pipeline, 一定要全部写完 读负载均衡

优化: 长pipeline中间的checkpoint, 断点续传

通过将数据表分解为ColumnFamily,HBase能够实现对数据的高效组织、存储和访问。ColumnFamily的设计不仅提高了数据访问的性能,还支持动态扩展和细粒度的权限控制,使得HBase在处理大规模非结构化和半结构化数据时具有显著的优势

  1. 数据局部性:
    • 相同的 ColumnFamily 中的数据存储在一起,便于进行批量读取和写入操作,提高数据访问效率。
  2. 独立配置:
    • 每个 ColumnFamily 可以单独配置压缩、版本控制和存储策略等参数,允许更精细地优化性能。
  3. 灵活的存储模型:
    • 可以根据访问模式将相关列放在同一个 ColumnFamily 中,从而优化特定查询的性能。
  4. 动态扩展:ColumnFamily支持动态扩展,新的列可以随时添加到现有的ColumnFamily中,而不需要对整个表进行重构。这种灵活性使得HBase能够适应不断变化的数据需求和业务场景
  5. 减少 I/O 操作:
    • 只需读取相关的 ColumnFamily,而不需要加载整个行的数据,减少不必要的 I/O 开销。
  6. 提高写入性能:ColumnFamily的设计使得写入操作更加高效。数据写入时,HBase会将数据先写入MemStore,当MemStore满时,数据会异步刷新到HFile中。每个ColumnFamily对应一个HStore,HStore由一个MemStore和多个HFile组成。这种设计减少了写入时的锁竞争,提高了写入性能
  7. 稀疏存储:HBase支持稀疏存储,即允许大量列值为空,并不占用任何存储空间。这对于存储大量列但每行只有少数列有值的稀疏表非常有用
  8. 版本管理:
  • 可以为每个 ColumnFamily 设置不同的版本数,适应不同数据的保留需求。

当有程序需要读取HDFS中的Block文件数据时,HDFS的处理逻辑会根据一系列条件来确定应该访问哪个副本。以下是具体的处理逻辑:

  1. 查询NameNode
  • 获取Block位置信息:客户端首先向NameNode发送请求,查询所需文件的Block位置信息。NameNode会返回文件所有Block的副本位置列表,包括每个副本所在的DataNode信息。
  1. 选择副本
  • 距离优先:NameNode会根据数据块的位置和副本因子返回最近的副本位置列表。客户端会选择距离最近的副本进行读取,以减少读取延时。
  • 本地优先:如果客户端所在的节点就是DataNode,并且该DataNode上有所需的Block副本,则优先选择本地副本进行读取。
  • 同机架优先:如果本地没有副本,则会选择同一机架内的DataNode上的副本进行读取。这样可以减少跨机架的网络传输开销。
  • 其他机架:如果同一机架内也没有副本,则会选择其他机架上的DataNode上的副本进行读取。
  1. 考虑节点状态
  • 检查节点是否在服务:检查目标DataNode是否在服务中。如果节点不在服务中,则不会选择该节点。
  • 检查节点是否是下线节点:检查目标DataNode是否是下线节点。如果是下线节点,则不会选择该节点。
  • 考虑节点负载:如果考虑节点负载,则会检查目标DataNode的负载是否过高。如果负载过高,则不会选择该节点。
  • 检查目标机架:检查目标机架是否已经选择了过多的节点。如果某个机架已经选择了过多的节点,则不会继续选择该机架的节点。
  1. 读取数据
  • 数据传输:客户端根据返回的位置信息,选择最近的一个DataNode作为数据源进行读取。如果读取失败,会尝试下一个最近的副本。
  • 并行读取:如果有多个Block需要读取,客户端会并行读取多个Block,最终合并输出为完整文件。
  1. 性能优化
  • 客户端本地缓存:客户端在读取HDFS文件时可以将数据缓存到本地,对于重复读取相同文件的情况可以极大提高速度。
  • 数据压缩:对于不经常变动的大文件,采用数据压缩可以减少网络传输和磁盘I/O。
  • 优化网络布局:优化DataNode的网络布局,通过合理配置网络和存储设备,使得数据尽可能在本地读取,减少网络开销。

通过上述处理逻辑,HDFS能够高效地选择最合适的副本进行读取,确保数据访问的高效性和可靠性。