HDFS 小文件问题及处理方法【重要】

简介: HDFS 小文件问题及处理方法【重要】

一、小文件形成的原因:

(1)动态分区插入数据,产生大量的小文件,从而导致 map 数量剧增;

(2)reduce 数量越多,小文件也越多,reduce 的个数和输出文件个数一致;

(3)数据源本身就是大量小文件;

二、小文件的危害:

(1)在 HDFS 中,每个文件均按块存储,每个文件在 NameNode 中存储大约占 150 个字节,与块大小无关,如果小文件过多,则会耗尽 NameNode 中的大多数内存。

(2)从 Hive 角度看,小文件过多也会影响 MR 的执行任务的数量,一个小文件会开启一个 MapTask,同时一个 map 会开一个 JVM 去执行 任务过多则会导致频繁的开启关闭,浪费大量的资源,严重影响性能。

三、解决小文件问题常见方法:

解决小文件问题的本质就是将小文件进行合并,可以通过以下几种方式解决小文件问题:

(1)使用 Hadoop Archive(HAR)将小文件进行归档:使用 Hadoop 自带的 HAR 将小文件进行归档,将多个小文件打包成一个 HAR 文件,这样 NameNode 中的元数据也就存储一份。在减少 namenode 内存使用的同时,仍然可以对文件进行透明的访问。

使用 HAR 时需要注意两点:

  • 对小文件进行存档后,原文件不会自动被删除,需要用户自己删除;
  • 创建 HAR 文件的过程实际上是在运行一个 MapReduce 作业,因而需要有一个 Hadoop 集群运行此命令

此外,HAR 还有一些缺陷:

  • 不支持修改,一旦创建,Archives 便不可改变。要增加或移除里面的文件,必须重新创建归档文件。
  • 要归档的文件名中不能有空格,否则会抛出异常,可以将空格用其他符号替换。

(2)使用 SequenceFile 合并小文件:可以使用 SequenceFile 格式将大批的小文件合并成一个大文件,再使用 MapReduce 程序进行操作,从而提高系统性能。

(SequenceFile 由一系列二进制 key-value 组成,key 是小文件名,value 是小文件内容,这样就可以将大量小文件合并为一个大文件。)

注意:和 HAR 不同的是,这种方式还支持压缩。该方案对于小文件的存取都是比较自由的,不限制用户和文件的多少,但 SequenceFile 文件不能追加写入,也不能修改,适用于一次性写入大量小文件的操作。

(3)使用 CombineFileInputFormat 合并小文件:在 MR 读取数据时将多个小文件合并成一个文件进行处理,只开启一个 MapTask,提高了任务的执行效率。

(这样就不会因为大量小文件而开启大量的 MapTask,把大量的时间花费在启动和释放 task 上面)

(4)开启 JVM 重用:JVM 重用可以使得 JVM 实例在同一个 job 中重新使用 N 次,提高效率。N 的值可以在 Hadoop 的 mapred-site.xml 中配置。通常在 10-20 之间。

注意:有小文件场景时可以开启 JVM 重用;如果没有产生小文件,不要开启 JVM 重用,因为会一直占用 task 卡槽,直到任务完成才释放。

参考:大数据 Hadoop 之 ——HDFS 小文件问题与处理实战操作

相关文章
|
分布式计算 Hadoop 大数据
【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作
【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作
199 0
|
分布式计算 Hadoop 大数据
【大数据开发技术】实验04-HDFS文件创建与写入
【大数据开发技术】实验04-HDFS文件创建与写入
318 0
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
58 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
1月前
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
40 3
|
1月前
|
分布式计算 Java Hadoop
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
40 2
|
1月前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
30 1
|
1月前
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
44 1
|
3月前
|
存储 缓存 分布式计算
|
3月前
|
存储 分布式计算 Hadoop
|
4月前
|
分布式计算 Hadoop 关系型数据库
实时计算 Flink版操作报错合集之Hadoop在将文件写入HDFS时,无法在所有指定的数据节点上进行复制,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。