Hadoop I\O之一

1,保持数据完整性:常用的检测方法就是CRC (循环冗余校验和)

HDFS以透明方式校验所有写入的数据,针对数据的io.bytes.per.checksum字节创建一个单独的校验和,如果节点检测数据错误,就会报CheckSumException异常;除了在读取数据时进行验证,数据节点也会在后台运行一个进程 DataBlockScanner(数据块检测程序)验证存储在数据节点上的所有块。

我们可以使用FileSystem.setVerifyChecksum(false)来禁用校验和验证,也可以在shell命令中使用-ignoreCrc选项

禁用校验的另一种可能:底层RawLocalFileSystem原生支持校验和,通过设置fs.file.impl的值为org.apache.hadoop.fs.RawLocalFileSystem或者建立它的实例

LocalFileSystem使用ChecksumFileSystem ,它的两个有用方法 getChecksumFile()和reportChecksumFailure()

2,压缩

常见的用于hadoop的压缩格式

特别注意:gzip和zip是通用压缩工具,空间和时间处理上相对平衡,bzip2压缩更有效,但比较慢,lzo使用速度最优算法,但压缩效率低;在分割性上,zip和bzip2可以分割,bzip2提供了块与块的同步标记,支持随机分割,zip支持文件边界处分割。适合mapreduce算法!

3,编码解码器

使用CompressionCodec createOutputStream--CompressionOutputStream  createInputStream--CompressionInputStream

使用CompressionCodecFactory.getCodec(path)--CompressionCodec 通过 removeSuffix移除文件后缀

压缩池CodecPool 来处理大量的解压缩任务  getCompressor(CompressionCodec),returnCompressor(compressor)

在MapReduce中引入压缩 设置:mapred.output.compress  true, mapred.output.compression.codec 某种编码类;

map输出结果的压缩:setCompressionMapOutput(true) setMapOutputCompressorClass(GzipCodec.Class)

 

### Hadoop 初次查询性能优化 对于Hadoop初次查询速度较慢的问题,可以从多个方面进行分析并采取相应的措施来提升性能。 #### 1. 数据预加载与缓存机制 为了改善第一次访问的速度,可以在启动MapReduce作业之前预先加载部分常用数据到内存中。通过配置`dfs.client.read.shortcircuit`参数为true启用短路读取功能[^1]。这使得客户端可以直接从本地磁盘读取文件而需要经过DataNode服务端转发,减少了网络传输开销。 另外,利用Linux操作系统自带的页面缓存(Page Cache),可以显著减少I/O延迟。适当调整JVM堆外内存大小(-XX:MaxDirectMemorySize)以便更好地支持PageCache的有效利用[^2]。 #### 2. 文件系统元数据管理 由于NameNode负责维护整个文件系统的命名空间及块映射信息,在大规模集群环境下其重启时间较长会影响整体响应效率。针对这一点可以通过优化Checkpoint流程、增加Secondary NameNode数量或者引入HA(High Availability)架构下的Standby NameNodes等方式缩短恢复周期。 同时建议定期运行FsImage合并操作以保持较小的日志长度,并合理设置安全检查点间隔(`dfs.namenode.checkpoint.txns`)防止过多的小事务累积影响性能。 #### 3. 数据布局策略 考虑到HDFS适合频繁随机写入的特点,应尽量采用批量导入模式而非逐条记录追加的方式向目标路径上传新数据集。如果业务场景允许的话还可以考虑使用BulkLoad工具绕过Write-Ahead Log(WAL)直接将外部表格转换成内部格式存储于RegionServer之上,以此规避因日志刷盘带来的额外负载[^3]。 此外,合理的分区设计有助于分散热点区域集中度高的情况发生概率,降低单个节点的压力水平。比如按照日期维度拆分目录结构或将大表按照行键范围切分成若干子表等方法均能有效缓解此类瓶颈现象[^5]。 ```bash # 设置 dfs.client.read.shortcircuit 参数 hdfs-site.xml: <property> <name>dfs.client.read.shortcircuit</name> <value>true</value> </property> # 调整 JVM 堆外内存大小 export JAVA_OPTS="-XX:MaxDirectMemorySize=8G" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值