HDFS小文件处理

本文探讨了HDFS中小文件带来的内存占用和计算资源浪费问题,提出通过har归档、CombineTextInputFormat和JVM重用等手段进行优化。重点介绍了Hadoop归档文件及其在内存管理上的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、HDFS中小文件会有什么影响
(1)存储层面:
1个文件块,占用namenode多大内存150字节,大量小文件占用namenode内存。
128G能存储多少文件块? 128 g* 1024m1024kb1024byte/150字节 = 9.1亿文件块
(2)计算层面:
增加了切片数量,每个小文件都会起到一个MapTask,1个MapTask默认内存1G,增加了MapTask数量就增加了大量计算内存。浪费资源。

二、常见的解决方式
(1)采用har归档(企业中常用)方式,har是类似一种文件压缩方式,它能够将多个小文件打包成一个后缀为.har文件,这样减少namenode内存使用的同时,仍然允许对文件进行透明的访问。Hadoop存档是特殊格式的存档。 Hadoop归档文件映射到文件系统目录。 Hadoop归档文件始终具有* .har扩展名。 Hadoop存档目录包含元数据(以_index和_masterindex的形式)和数据(part- *)文件。 _index文件包含作为归档文件一部分的文件名以及这些文件内的位置。

(2)采用CombineTextInputFormat
(3)有小文件场景开启JVM重用;如果没有小文件,不要开启JVM重用,因为会一直占用使用到的task卡槽,直到任务完成才释放。
JVM重用可以使得JVM实例在同一个job中重新使用N次,N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间

<property>
    <name>mapreduce.job.jvm.numtasks</name>
    <value>10</value>
    <description>How many tasks to run per jvm,if set to -1 ,there is  no limit</description>
</property> 
### HDFS小文件处理方法与优化方案 #### 存储层面上的小文件优化 为了减少NameNode的压力以及提升存储效率,可以通过以下方式进行优化。在数据采集阶段,可以考虑将多个小文件合并成较大的文件后再上传至HDFS[^1]。这种方式能够有效降低NameNode中元数据的数量,从而节省内存资源。 另一种常见的做法是在HDFS上运行MapReduce程序来实现小文件的合并操作。通过这种方法可以在不改变现有业务逻辑的情况下完成对已有小文件的整理工作。 #### 执行过程中的性能改进措施 当面对大量的小文件时,如果直接使用普通的`TextInputFormat`作为输入格式,则可能会导致过多的任务被创建出来,进而增加系统的负担。因此建议改用`CombineTextInputFormat`类来进行读取操作。该类允许单个Mapper任务处理来自不同路径下的若干个小文件的内容,这样就可以显著减少总的Mapper数目并改善整体作业的表现效果。 另外需要注意的是,由于每一个独立存在的小文件通常会被分配给单独的一个map task去负责解析运算,而这些额外产生的task不仅消耗更多的CPU周期还会占用更多宝贵的集群RAM空间;所以应该尽量避免让系统处于这种高负载状态之中[^2]。 ```python from pyspark import SparkConf, SparkContext conf = SparkConf().setAppName("combine_text_input_format_example") sc = SparkContext(conf=conf) # 使用 CombineTextInputFormat 来加载数据 input_data = sc.newAPIHadoopFile( path="hdfs://path/to/small/files", inputformatClass="org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat", keyClass="org.apache.hadoop.io.LongWritable", valueClass="org.apache.hadoop.io.Text" ) result = input_data.collect() for record in result: print(record) ``` 上述代码片段展示了如何利用PySpark框架配合`newAPIHadoopFile()`函数指定自定义InputFormat为`CombineTextInputFormat`以达到合并小文件的目的。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值