1.存储大量小文件存在的问题

  1. 大量小文件的存在势必占用大量的 NameNode 内存
    HDFS 中的每一个文件、目录以及文件块,在 NameNode 内存都会有记录,每一条记录大约占用150字节的内存空间(该大小与文件、目录及文件块的大小无关),namenode的内存就会成为HDFS 的横向扩展能力的一个限制因素。

  2. 如果我们使用 MapReduce 任务来处理这些小文件,因为每个 Map 会处理一个 HDFS 块;这会导致程序启动大量的 Map 来处理这些小文件,( 读取小文件数据的任务执行时,消耗过多的集群资源。因为map task在执行的时候一般只处理1个文件,如果这个时候要读取的文件过多,就会造成大量的map task启动。) 虽然这些小文件总的大小并非很大,却占用了集群的大量资源!

2.大量小文件产生的情况

  • **实时流处理:**比如我们使用 Spark Streaming 从外部数据源接收数据,然后经过 ETL 处理之后存储到 HDFS 中。这种情况下在每个 Job 中会产生大量的小文件。
  • **MapReduce 产生:**我们使用 Hive 查询一张含有海量数据的表,然后存储在另外一张表中,而这个查询只有简单的过滤条件(比如 select * from iteblog where from = ‘hadoop’),这种情况只会启动大量的 Map 来处理,这种情况可能会产生大量的小文件。也可能 Reduce 设置不合理,产生大量的小文件。
  • **数据本身的特点:**比如我们在 HDFS 上存储大量的图片、短视频、短音频等文件,由于这些文件的特点,而且数量众多,也可能给 HDFS 大量灾难。

Hadoop提供的解决方案

分别为:Hadoop Archive,Sequence file和CombineFileInputFormat。

(1)Hadoop Archive

Hadoop Archive或者HAR,是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时,仍然允许对文件进行透明的访问。

从上图我们可以看出,Hadoop在归档文件时通过二层索引文件的查找,进行最终文件的读取。所以在效率上会比普通HDFS读取文件慢一些。

对某个目录/foo/bar下的所有小文件存档成/outputdir/ zoo.har:

hadoop archive -archiveName zoo.har -p /foo/bar /outputdir

当然,也可以指定HAR的大小(使用-Dhar.block.size)。

HAR是在Hadoop file system之上的一个文件系统,因此所有fs shell命令对HAR文件均可用,只不过是文件路径格式不一样,HAR的访问路径可以是以下两种格式:

har://scheme-hostname:port/archivepath/fileinarchive

har:///archivepath/fileinarchive(本节点)

可以这样查看HAR文件存档中的文件:

hadoop dfs -ls har:///user/zoo/foo.har

输出:

har:///user/zoo/foo.har/hadoop/dir1

har:///user/zoo/foo.har/hadoop/dir2

创建存档文件的问题:
1、存档文件的源文件目录以及源文件都不会自动删除需要手动删除
2、存档的过程实际是一个mapreduce过程,所以需要需要hadoop的mapreduce的支持
3、存档文件本身不支持压缩
4、存档文件一旦创建便不可修改,要想从中删除或者增加文件,必须重新建立存档文件
5、创建存档文件会创建原始文件的副本,所以至少需要有与存档文件容量相同的磁盘空间
6、要归档的文件名中不能有空格,否则会抛出异常,可以将空格用其他符号替换(使用-Dhar.space.replacement.enable=true 和-Dhar.space.replacement参数)。
7、对于一个mapreduce任务来说,如果使用HAR文件作为其输入,仍旧是其中每个小文件对应一个map task,效率低下。所以,HAR files最好是用于文件归档。

(2)Sequence File

sequence file由一系列的二进制key/value组成,其中key为小文件名,value为文件内容,则可以将大批小文件合并成一个大文件,通过改变文件的写出方式,写入到SequenceFile格式的文件中。这主要是因为SequenceFile独有的存储格式决定了它可以很好的满足小文件存储的需求。SequenceFile文件内部存储数据的方式是以下面key-value的形式拼接而成。

因为考虑到小文件中的内容少,在这里我们可以以文件名作为key,文件内容作为value,直接写到SequenceFile中。
通常对于"小文件问题"的回应会是:使用序列文件(SequenceFile)。这种方法的思路是,使用文件名(filename)作为key,并且文件内容(file contents)作为value。
将大量小文件放入一个单一的SequenceFile,流式处理操作SequenceFile的两个优势:

  1. SequenceFiles是可拆分的,因此MapReduce可以将它们分成块并独立地对每个块进行操作;
  2. 它们同时支持压缩,不像HAR。 在大多数情况下,块压缩是最好的选择,因为它将压缩几个记录为一个块,而不是一个记录压缩一个块。
(3)CombineFileInputFormat

CombineFileInputFormat是一种新的inputformat,用于将多个文件合并成一个单独的split。功能,是将一个目录(可能包括多个小文件,不包括子目录)作为一个map的输入,而不是通常使用一个文件作为输入。

HDFS存储大量小文件的问题及解决方案相关推荐

  1. HDFS存储大量小文件居然有这样的问题!看我怎么搞定它!

    写在前面 本文隶属于专栏<1000个问题搞定大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见1000个问题搞定大数 ...

  2. HDFS无法对大量小文件进行存储

    (1)存储大量小文件的话,它会占用NameNode大量的内存来存储文件.目录和块信息.这样是不可取的,因为NameNode的内存总是有限的: (2)小文件存储的寻址时间会超过读取时间,它违反了HDFS ...

  3. HDFS小文件问题及解决方案

    1.  概述 小文件是指文件size小于HDFS上block大小的文件.这样的文件会给hadoop的扩展性和性能带来严重问题.首先,在HDFS中,任何block,文件或者目录在内存中均以对象的形式存储 ...

  4. HDFS小文件的危害

    一.black块 举例: black块官方设置的是64m,现在多数用的是128m 举例: 一个文件130M % 128M=1-2m 结果是1个块128m,1个块2m 一碗水130ml 一个瓶子规格容量 ...

  5. HDFS小文件治理总结

    目录 背景 第一部分 回本溯源 第二部分 HDFS大量小文件的危害 第三部分 小文件治理方案总结 第四部分 总结 参考文献及资料 背景 企业级Hadoop大数据平台在实际使用过程中,可能大部分会遭遇小 ...

  6. 关于U盘存储大量小容量文件速度慢的解释(摘抄)

    闪存以块为单位进行擦除操作.闪存的写入操作必须在空白区域进行,如果目标区域已经有数据,必须先擦除后写入,因此擦除操作是闪存的基本操作. 一般每个块包含32个512字节的页,容量16KB:而大容量闪存采 ...

  7. FastDFS小文件存储原理

    小文件存储 需要小文件存储的原因 小文件应用场景 小文件存储带来的问题 FastDFS小文件机制配置 FastDFS合并存储文件命名与文件 启动小文件存储时服务返回给客户端的fileid有变化 Tru ...

  8. 【云原生AI】Fluid + JindoFS 助力微博海量小文件模型训练速度提升 18 倍

    简介: 深度学习平台在微博社交业务扮演着重要的角色.计算存储分离架构下,微博深度学习平台在数据访问与调度方面存在性能低效的问题.本文将介绍微博内部设计实现的一套全新的基于 Fluid(内含 Jindo ...

  9. 关于hadoop处理大量小文件情况的解决方法

    小文件是指那些size比HDFS的block size(默认64m)小的多的文件.任何一个文件,目录和bolck,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个obje ...

  10. hive小文件过多问题解决方法

    小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into table A values (1 ...

最新文章

  1. python之地基(三)
  2. struts2实现拦截器的方法
  3. VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstati
  4. android二分查找法简书,【PYTHON】二分查找算法
  5. emc存储java打开后报错_连接EMC存储系统 - osc_mk8rqvg4的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. MATLAB中median函数的用法
  7. Python datetime timedelta
  8. 查看有哪些表被锁住 如何杀死oracle死锁进程
  9. 关于系统响应函数OnSysCommand
  10. Kubernetes详解(十八)——Pod就绪性探针实战
  11. 手机ttl刷机linux,机顶盒刷机基础,TTL科普及简单介绍,TTL安装应用方法
  12. 【历史上的今天】1 月 1 日:惠普诞生;互联网的规范化;百度成立
  13. 使用CSS将图标进行旋转无效
  14. 中国新能源汽车行业十四五展望规划与投资决策建议报告2022版
  15. 4071 国际象棋(枚举)
  16. python描述对象静态特性的数据为_The couple wanted to adopt the black boy they had been _______._学小易找答案...
  17. 测试用例的设计-提高测试覆盖率
  18. 强大且超实用的论文阅读工具——ReadPaper
  19. win10修改用户名_win7如何设置局域网共享无需输入用户名和密码
  20. @media 的使用规范

热门文章

  1. 创维机顶盒E900刷LinuxNas系统
  2. centos7安装中文字体
  3. 《学生信息管理系统》论文
  4. Hadoop安装教程(Hadoop3.3.1版本),centos7系统,避免踩坑
  5. PTA C语言程序设计 单项链表
  6. 力软敏捷开发框架源码7.0.6解析
  7. anylogic中编写java代码_anylogic 使用
  8. 全志 Allwinner V3S 开发环境搭建 (二)安装必要工具
  9. Subversive-connectors 下载地址
  10. 贝叶斯优化混合核极限学习机回归预测