1. 首页 > Hadoop教程 > 正文

大数据教程FG011-HDFS读写流程原理解析实战

内容简介:本文详细介绍HDFS读写流程原理解析,包括文件读取流程、文件写入流程、数据块定位、管道写入机制、错误处理等核心内容。风哥教程参考Hadoop官方文档HDFS Architecture、HDFS Data Flow等内容。

目录大纲

Part01-基础概念与理论知识
  1.1 HDFS读写架构概述
  1.2 数据块与副本机制
  1.3 客户端与NameNode交互
Part02-生产环境规划与建议
  2.1 读写性能优化规划
  2.2 网络拓扑规划
  2.3 客户端配置优化
Part03-生产环境项目实施方案
  3.1 文件读取流程实战
  3.2 文件写入流程实战
  3.3 数据块定位与选择
  3.4 错误处理与重试机制
Part04-生产案例与实战讲解
  4.1 大文件读取优化案例
  4.2 高并发写入案例
  4.3 读写故障排查案例
Part05-风哥经验总结与分享
  5.1 读写优化最佳实践
  5.2 常见问题解决方案

Part01-基础概念与理论知识

1.1 HDFS读写架构概述

HDFS采用主从架构,NameNode管理元数据,DataNode存储数据块。更多视频教程www.fgedu.net.cn 客户端通过RPC与NameNode交互获取元数据,然后直接与DataNode进行数据传输。

风哥提示:HDFS读写采用流式数据访问模式,客户端直接与DataNode通信,NameNode不参与数据传输,避免NameNode成为瓶颈。

1.2 数据块与副本机制

HDFS将文件切分成固定大小的数据块(默认128MB),每个数据块有多个副本。学习交流加群风哥微信: itpux-com 副本分布在不同DataNode上,保证数据可靠性。

# 查看文件数据块信息
hdfs fsck /bigdata/warehouse/fgedu/data.parquet -files -blocks -locations

Connecting to namenode via http://fgedu01.net.cn:9870
FSCK started by hdfs from /192.168.1.100
/bigdata/warehouse/fgedu/data.parquet 1073741824 bytes, 8 block(s):
0. BP-1234567890:blk_1073741825_1001 len=134217728 Live_repl=3 [DatanodeInfoWithStorage[192.168.1.101:9866,DS-1], DatanodeInfoWithStorage[192.168.1.102:9866,DS-2], DatanodeInfoWithStorage[192.168.1.103:9866,DS-3]]
1. BP-1234567890:blk_1073741826_1002 len=134217728 Live_repl=3 [DatanodeInfoWithStorage[192.168.1.102:9866,DS-1], DatanodeInfoWithStorage[192.168.1.103:9866,DS-2], DatanodeInfoWithStorage[192.168.1.104:9866,DS-3]]

Status: HEALTHY

1.3 客户端与NameNode交互

客户端通过RPC协议与NameNode交互,获取文件元数据。from bigdata视频:www.itpux.com 主要交互包括:获取数据块位置、创建文件、添加数据块等。

客户端与NameNode交互类型:
– 读取操作:获取数据块位置信息
– 写入操作:创建文件、申请数据块
– 删除操作:删除元数据
– 权限操作:检查访问权限

Part02-生产环境规划与建议

2.1 读写性能优化规划

HDFS读写性能优化需要从多个维度考虑。更多学习教程公众号风哥教程itpux_com

读写性能优化要点:
1. 增大数据块大小,减少NameNode压力
2. 合理设置副本数,平衡可靠性与性能
3. 启用短路读取,减少网络开销
4. 配置客户端缓存,提升读取性能
5. 优化网络拓扑,减少跨机架传输

2.2 网络拓扑规划

HDFS网络拓扑影响数据块放置和读取性能。学习交流加群风哥QQ113257174

# 查看集群网络拓扑
hdfs dfsadmin -printTopology

Rack: /default-rack
192.168.1.101:9866 (fgedu01.net.cn)
192.168.1.102:9866 (fgedu02.net.cn)
192.168.1.103:9866 (fgedu03.net.cn)

# 多机架拓扑
Rack: /rack1
192.168.1.101:9866 (fgedu01.net.cn)
192.168.1.102:9866 (fgedu02.net.cn)
Rack: /rack2
192.168.1.103:9866 (fgedu03.net.cn)
192.168.1.104:9866 (fgedu04.net.cn)

2.3 客户端配置优化

客户端配置对读写性能有重要影响。风哥提示:需要根据实际场景调整客户端参数。

# 查看客户端配置
hdfs getconf -confKey dfs.client.read.shortcircuit
hdfs getconf -confKey dfs.client-write-packet-size

# 短路读取配置
true

# 写入数据包大小
65536

Part03-生产环境项目实施方案

3.1 文件读取流程实战

3.1.1 读取流程详解

HDFS文件读取流程分为以下步骤:更多视频教程www.fgedu.net.cn

HDFS读取流程:
1. 客户端调用open()方法打开文件
2. 客户端向NameNode请求获取数据块位置
3. NameNode返回数据块位置列表
4. 客户端连接最近的DataNode读取数据
5. 读取完成后关闭连接

3.1.2 读取操作实战

# 读取文件内容
hdfs dfs -cat /bigdata/warehouse/fgedu/sample.txt
# 读取文件前N行
hdfs dfs -cat /bigdata/warehouse/fgedu/sample.txt | head -10
# 使用Java客户端读取
hadoop fs -copyToLocal /bigdata/warehouse/fgedu/data.parquet /bigdata/local_data/

# 文件内容
Hello HDFS
This is a test file for HDFS read operation
Data line 1
Data line 2

# 复制到本地成功
2024-01-15 22:00:00,000 INFO hdfs.DFSClient: Successfully copied file to local
# 验证本地文件
ls -lh /bigdata/local_data/data.parquet
-rw-r–r– 1 root root 1.0G Jan 15 22:00 /bigdata/local_data/data.parquet

3.1.3 短路读取配置

# 配置短路读取
cat /bigdata/app/hadoop/etc/hadoop/hdfs-site.xml | grep -A3 “shortcircuit”

<!– 启用短路读取 –>
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>

<!– 短路读取路径 –>
<property>
<name>dfs.domain.socket.path</name>
<value>/var/lib/hadoop-hdfs/dn_socket</value>
</property>

<!– 短路读取缓存大小 –>
<property>
<name>dfs.client.read.shortcircuit.streams.cache.size</name>
<value>4096</value>
</property>

3.2 文件写入流程实战

3.2.1 写入流程详解

HDFS文件写入流程采用管道模式。学习交流加群风哥微信: itpux-com

HDFS写入流程:
1. 客户端调用create()方法创建文件
2. NameNode检查权限并创建文件元数据
3. 客户端申请数据块,NameNode返回DataNode列表
4. 客户端建立管道连接到多个DataNode
5. 数据通过管道依次写入各DataNode
6. 所有副本写入完成后,客户端通知NameNode

3.2.2 写入操作实战

# 上传文件到HDFS
hdfs dfs -put /bigdata/local_data/upload_test.txt /bigdata/warehouse/fgedu/
# 追加写入
hdfs dfs -appendToFile /bigdata/local_data/append_data.txt /bigdata/warehouse/fgedu/upload_test.txt
# 验证写入结果
hdfs dfs -ls /bigdata/warehouse/fgedu/upload_test.txt

# 上传成功
2024-01-15 22:10:00,000 INFO hdfs.DFSClient: Successfully put file

# 追加成功
2024-01-15 22:10:30,000 INFO hdfs.DFSClient: Successfully appended data

# 验证文件
-rw-r–r– 3 fgedu fgedu 10485760 2024-01-15 22:10 /bigdata/warehouse/fgedu/upload_test.txt

3.2.3 管道写入机制

# 查看管道写入配置
hdfs getconf -confKey dfs.replication
hdfs getconf -confKey dfs.client-write-packet-size

# 副本数
3

# 数据包大小
65536

风哥提示:管道写入时,数据从客户端流向第一个DataNode,再依次流向后续DataNode。每个DataNode收到数据后立即转发,实现流水线写入。

3.3 数据块定位与选择

3.3.1 数据块放置策略

# 查看数据块放置策略
hdfs getconf -confKey dfs.block.replicator.classname

org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault

HDFS数据块放置策略:
1. 第一个副本:优先选择同机架的DataNode
2. 第二个副本:选择不同机架的DataNode
3. 第三个副本:选择与第二个副本同机架的不同DataNode
4. 更多副本:随机选择,避免过度集中

3.3.2 读取时数据块选择

# 查看数据块位置信息
hdfs fsck /bigdata/warehouse/fgedu/data.parquet -files -blocks -locations | grep “DatanodeInfo”

# 数据块位置
Live_repl=3 [DatanodeInfoWithStorage[192.168.1.101:9866,DS-1], DatanodeInfoWithStorage[192.168.1.102:9866,DS-2], DatanodeInfoWithStorage[192.168.1.103:9866,DS-3]]

# 客户端优先选择最近的副本读取

3.4 错误处理与重试机制

3.4.1 读取错误处理

# 查看读取重试配置
hdfs getconf -confKey dfs.client.retry.policy.enabled
hdfs getconf -confKey dfs.client.retry.policy.spec

# 启用重试策略
true

# 重试策略配置
“10000,6”

读取错误处理机制:
– DataNode故障时,自动切换到其他副本
– 网络超时自动重试
– 损坏数据块自动报告给NameNode

3.4.2 写入错误处理

# 模拟写入错误
# 查看写入恢复配置
hdfs getconf -confKey dfs.client.block.recover.retries

# 写入恢复重试次数
3

Part04-生产案例与实战讲解

4.1 大文件读取优化案例

大文件读取是生产环境常见场景。更多视频教程www.fgedu.net.cn 以下是大文件读取优化案例。

# 大文件读取优化配置
cat /bigdata/app/hadoop/etc/hadoop/hdfs-site.xml | grep -A3 “read.buffer”

<!– 读取缓冲区大小 –>
<property>
<name>dfs.client.read.prefetcher.enabled</name>
<value>true</value>
</property>

<!– 预读取大小 –>
<property>
<name>io.file.buffer.size</name>
<value>65536</value>
</property>

4.2 高并发写入案例

高并发写入场景需要优化客户端连接池和数据包大小。学习交流加群风哥微信: itpux-com

# 高并发写入测试脚本
#!/bin/bash
# concurrent_write.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

for i in {1..100}; do
hdfs dfs -put -f /bigdata/local_data/test_${i}.txt /bigdata/warehouse/fgedu/concurrent/ &
done
wait
echo “Concurrent write completed”

# 并发写入执行
./concurrent_write.sh
Concurrent write completed

# 验证写入结果
hdfs dfs -ls /bigdata/warehouse/fgedu/concurrent/ | wc -l
100

4.3 读写故障排查案例

4.3.1 读取超时排查

# 查看读取超时配置
hdfs getconf -confKey dfs.client.socket-timeout-ms
hdfs getconf -confKey dfs.datanode.socket.write.timeout
# 查看DataNode状态
hdfs dfsadmin -report | grep -A5 “Live datanodes”

# 读取超时配置
60000

# 写入超时配置
480000

# DataNode状态正常
Live datanodes (3):
Name: 192.168.1.101:9866 (fgedu01.net.cn)
Name: 192.168.1.102:9866 (fgedu02.net.cn)
Name: 192.168.1.103:9866 (fgedu03.net.cn)

4.3.2 写入失败排查

# 查看写入失败日志
grep -i “error\|exception” /bigdata/app/hadoop/logs/hadoop-hdfs-namenode-*.log | tail -20
# 检查磁盘空间
hdfs dfsadmin -report | grep -i “remaining”

# 错误日志
2024-01-15 23:00:00,000 ERROR hdfs.DFSClient: Failed to write block
2024-01-15 23:00:00,123 WARN hdfs.DFSClient: Could not get block locations

# 磁盘空间充足
DFS Remaining: 478150651904 (445.20 GB)

Part05-风哥经验总结与分享

5.1 读写优化最佳实践

在实际生产环境中,HDFS读写优化需要注意以下几点:from bigdata视频:www.itpux.com

风哥经验总结:
1. 启用短路读取,减少网络开销
2. 调整数据包大小,优化传输效率
3. 合理设置超时时间,避免误判
4. 监控读写延迟,及时发现瓶颈
5. 优化网络拓扑,减少跨机架传输

5.2 常见问题解决方案

5.2.1 读取性能慢

风哥提示:读取性能慢通常是由于网络带宽不足、磁盘IO瓶颈或NameNode压力过大导致。

# 诊断读取性能问题
# 1. 检查网络带宽
iftop -i eth0
# 2. 检查磁盘IO
iostat -x 1 10
# 3. 检查NameNode负载
curl http://fgedu01.net.cn:9870/jmx | grep “TotalFiles”

# 网络带宽正常
TX: 500Mbps RX: 300Mbps

# 磁盘IO正常
avg-cpu: %user %nice %system %iowait %steal %idle
10.00 0.00 5.00 2.00 0.00 83.00

# NameNode文件数
“TotalFiles” : 125000

5.2.2 写入失败处理

注意事项:
– 检查DataNode磁盘空间是否充足
– 检查客户端与DataNode网络连通性
– 检查NameNode是否处于安全模式
– 检查用户是否有写入权限

# 写入失败排查步骤
# 1. 检查安全模式
hdfs dfsadmin -safemode get
# 2. 检查权限
hdfs dfs -ls -d /bigdata/warehouse/fgedu/
# 3. 检查配额
hdfs dfs -count -q /bigdata/warehouse/fgedu/

# 安全模式状态
Safe mode is OFF

# 权限正常
drwxr-xr-x – fgedu fgedu 0 2024-01-15 23:30 /bigdata/warehouse/fgedu

# 配额充足
none inf none inf /bigdata/warehouse/fgedu

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息