HDFS写数据时的Packet和Chunk分别指什么?它们的大小分别是多少?
在 HDFS(Hadoop 分布式文件系统)写数据的过程中,数据并不是一次性、整块地发送到 DataNode 的,而是会被层层拆解。Packet 和 Chunk 就是 HDFS 客户端在构建网络传输流和进行数据校验时使用的两个核心微观单位。
它们之间的关系可以简单理解为:Block(数据块) > Packet(数据包) > Chunk(校验块)。
以下是它们的详细解释和大小:
1. Chunk(校验块)
- 指代什么: Chunk 是 HDFS 中 数据校验(Checksum)的最小单位。为了防止数据在网络传输或磁盘存储过程中发生损坏,HDFS 会对数据进行 CRC32 校验。客户端每收集到一个 Chunk 的数据,就会为它计算出一个校验和(Checksum)。
- 大小:
- 数据大小:默认 512 Byte(字节)。
- 校验和大小:4 Byte。
- 因此,一个 Chunk 加上它的校验和,实际占用的空间是 516 Byte。
- 相关配置参数:
io.bytes.per.checksum(默认值为 512)。
2. Packet(数据包)
- 指代什么: Packet 是 HDFS 客户端向 DataNode 的 Pipeline(数据管道)中进行 网络传输的基本单位。因为每次只发送 512 字节的网络开销太大了,所以 HDFS 客户端在内存中设置了一个缓冲区(DataQueue),将多个带有校验和的 Chunk 收集起来,封装成一个 Packet。当 Packet 被填满后,才会通过网络发送给 DataNode。
- 大小:
- 默认大小:64 KB(65536 Byte)。
- 内部结构: 一个 Packet 包含一个 Packet Header(头部元数据,如偏移量、序列号等),以及多个 Chunk + Checksum。
- (计算一下:64 KB / 512 Byte = 128,所以一个默认的 Packet 大约包含 128 个 Chunk)
- 相关配置参数:
dfs.client-write-packet-size(默认值为 65536,即 64KB)。
💡 总结与写数据流程串联
为了更好地理解,我们可以把 HDFS 写数据(以默认配置为例)的过程连起来看:
- 切分 Block: 客户端要写入一个大文件,HDFS 首先按 128 MB(默认 Block 大小)对其进行逻辑切分。
- 生成 Chunk: 客户端的输出流接收应用程序写来的数据,每积攒到 512 Byte(1 个 Chunk),就计算出 4 Byte 的校验和。
- 封装 Packet: 客户端将这 516 Byte 写入一个内存中的 Packet。不断重复这个过程,直到 Packet 达到 64 KB。
- 网络发送: 达到 64 KB 的 Packet 会被放入一个发送队列(DataQueue),由专门的线程(DataStreamer)发送到 DataNode 组成的 Pipeline 中进行实际的物理存储。
大小对照表速记:
| 单位 | 概念说明 | 默认大小 |
|---|---|---|
| Block | 存储在磁盘上的大物理文件块 | 128 MB (Hadoop 2.x/3.x) |
| Packet | 网络传输到 DataNode 的基本数据包 | 64 KB |
| Chunk | 计算 Checksum(数据校验)的最小单位 | 512 Byte |
| Checksum | 针对每个 Chunk 生成的校验码 | 4 Byte |
右滑查看面试常问