2020-08-24:什么是小文件?很多小文件会有什么问题?很多小文件怎么解决?(大数据)
【摘要】 福哥答案2020-08-24:[知乎答案](https://www.zhihu.com/question/417040766)1.小文件:小文件是指文件大小明显小于 HDFS 上块(block)大小(默认64MB,在Hadoop2.x中默认为128MB)的文件。2.小文件问题:HDFS的小文件问题:(1)HDFS 中任何一个文件,目录或者数据块在 NameNode 节点内存中均以一个对象形式...
福哥答案2020-08-24:
[知乎答案](https://www.zhihu.com/question/417040766)
1.小文件:
小文件是指文件大小明显小于 HDFS 上块(block)大小(默认64MB,在Hadoop2.x中默认为128MB)的文件。
2.小文件问题:
HDFS的小文件问题:
(1)HDFS 中任何一个文件,目录或者数据块在 NameNode 节点内存中均以一个对象形式表示(元数据),而这受到 NameNode 物理内存容量的限制。每个元数据对象约占 150 byte,所以如果有1千万个小文件,每个文件占用一个block,则 NameNode 大约需要2G空间。如果存储1亿个文件,则 NameNode 需要20G空间,这毫无疑问1亿个小文件是不可取的。
(2)处理小文件并非 Hadoop 的设计目标,HDFS 的设计目标是流式访问大数据集(TB级别)。因而,在 HDFS 中存储大量小文件是很低效的。访问大量小文件经常会导致大量的 seek,以及不断的在 DatanNde 间跳跃去检索小文件。这不是一个很有效的访问模式,严重影响性能。
(3)处理大量小文件速度远远小于处理同等大小的大文件的速度。每一个小文件要占用一个slot,而任务启动将耗费大量时间甚至大部分时间都耗费在启动任务和释放任务上。
MapReduce上的小文件问题:
Map任务一般一次只处理一个块的输入(input。如果文件非常小,并且有很多,那么每一个 Map 任务都仅仅处理非常小的输入数据,并会产生大量的 Map 任务,每一个 Map 任务都会额外增加bookkeeping 开销。
3. 为什么会产生大量的小文件
至少在两种场景下会产生大量的小文件:
(1)这些小文件都是一个大逻辑文件的一部分。由于 HDFS 在2.x版本才开始支持对文件进行追加,所以在此之前保存无边界文件(例如日志文件)一种常用的方式就是将这些数据以块的形式写入HDFS中。
(2)文件本身就是很小。比如对于一个很大的图片语料库,每一个图片都是一个单独的文件,并且没有一种很好的方法来将这些文件合并为一个大的文件。
4. 解决方案
这两种情况需要有不同的解决方式:
(1)对于第一种情况,文件是许多记录组成的,那么可以通过调用 HDFS 的 sync() 方法(和 append 方法结合使用),每隔一定时间生成一个大文件。或者,可以通过写一个 MapReduce 程序来来合并这些小文件。
(2)对于第二种情况,就需要容器通过某种方式来对这些文件进行分组。Hadoop提供了一些选择:
①使用HAR File。Hadoop Archives (HAR files)是在 0.18.0 版本中引入到 HDFS 中的,它的出现就是为了缓解大量小文件消耗 NameNode 内存的问题。HAR 文件是通过在 HDFS 上构建一个分层文件系统来工作。HAR 文件通过 hadoop archive 命令来创建,而这个命令实际上是运行 MapReduce 作业来将小文件打包成少量的 HDFS 文件。对于客户端来说,使用 HAR 文件系统没有任何的变化:所有原始文件都可见以及可以访问(只是使用 har://URL,而不是 hdfs://URL),但是在 HDFS 中中文件个数却减少了。
②使用SequenceFile存储。文件名作为 key,文件内容作为 value。在实践中这种方式非常有效。比如对于10,000个100KB大小的小文件问题,可以编写一个程序将合并为一个 SequenceFile,然后你可以以流式方式处理(直接处理或使用 MapReduce) SequenceFile。
③使用HBase。如果你产生很多小文件,根据访问模式的不同,应该进行不同类型的存储。HBase 将数据存储在 Map Files(带索引的 SequenceFile)中,如果你需要随机访问来执行 MapReduce 流式分析,这是一个不错的选择。
***
[评论](https://user.qzone.qq.com/3182319461/blog/1598224329)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
- 2025-06-13:最多可收集的水果数目。用go语言,有一个由 n x n 格子组成的游戏地图,每个格子代表一个房间。给定一个
- 2025-06-12:零数组变换Ⅲ。用go语言,给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中每
- 2025-06-11:两个字符串的切换距离。用go语言,给定两个长度相同的字符串 s 和 t,以及两个整数数组 nextCost
- 2025-06-10:移除石头游戏。用go语言,Alice 和 Bob 玩一个拿石头的游戏,规则如下: - 他们轮流从一堆石头中
- 2025-06-09:最小化相邻元素的最大差值。用go语言,给定一个整数数组 nums,其中部分元素被标记为 -1,表示这些元素
评论(0)