目录大纲
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进行数据传输。
1.2 数据块与副本机制
HDFS将文件切分成固定大小的数据块(默认128MB),每个数据块有多个副本。学习交流加群风哥微信: itpux-com 副本分布在不同DataNode上,保证数据可靠性。
hdfs fsck /bigdata/warehouse/fgedu/data.parquet -files -blocks -locations
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 主要交互包括:获取数据块位置、创建文件、添加数据块等。
– 读取操作:获取数据块位置信息
– 写入操作:创建文件、申请数据块
– 删除操作:删除元数据
– 权限操作:检查访问权限
Part02-生产环境规划与建议
2.1 读写性能优化规划
HDFS读写性能优化需要从多个维度考虑。更多学习教程公众号风哥教程itpux_com
1. 增大数据块大小,减少NameNode压力
2. 合理设置副本数,平衡可靠性与性能
3. 启用短路读取,减少网络开销
4. 配置客户端缓存,提升读取性能
5. 优化网络拓扑,减少跨机架传输
2.2 网络拓扑规划
HDFS网络拓扑影响数据块放置和读取性能。学习交流加群风哥QQ113257174
hdfs dfsadmin -printTopology
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
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
1. 客户端调用create()方法创建文件
2. NameNode检查权限并创建文件元数据
3. 客户端申请数据块,NameNode返回DataNode列表
4. 客户端建立管道连接到多个DataNode
5. 数据通过管道依次写入各DataNode
6. 所有副本写入完成后,客户端通知NameNode
3.2.2 写入操作实战
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
3.3 数据块定位与选择
3.3.1 数据块放置策略
hdfs getconf -confKey dfs.block.replicator.classname
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 读取性能慢
# 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
