基于Hadoop的云盘系统客户端技术难点之三 小文件存储优化

简介:

作者:张子良

版权所有,转载请注明出处。

一、概述

首先明确概念,这里的小文件是指小于HDFS系统Block大小的文件(默认64M),如果使用HDFS存储大量的小文件,将会是一场灾难,这取决于HDFS的实现机制和框架结构,每一个存储在HDFS中的文件、目录和块映射为一个对象存储在NameNode服务器内存中,通常占用150个字节。如果有1千万个文件,就需要消耗大约3G的内存空间。如果是10亿个文件呢,简直不可想象。这里需要特别说明的是,每一个小于Block大小的文件,存储是实际占用的存储空间仍然是实际的文件大小,而不是整个block大小

  为解决小文件的存储Hadoop自身提供了两种机制来解决相关的问题,包括HAR和SequeueFile,这两种方式在某些方面解决了本层面的问题,单仍然存在着各自的不足。下文讲详细说明。

二、Hadoop HAR

  Hadoop Archives (HAR files) ,这个特性从Hadoop 0.18.0版本就已经引入了,他可以将众多小文件打包成一个大文件进行存储,并且打包后原来的文件仍然可以通过Map-reduce进行操作,打包后的文件由索引和存储两大部分组成,索引部分记录了原有的目录结构和文件状态。其原理如下图所示:

 

 

  缺点:

  1. HAR 方式虽然能够实现NameNode内存空间的优化,但是他是一个人工干预的过程,同时他既不能够支持自动删除原小文件,也不支持追加操作,当有新文件进来以后,需要重新打包。
  2. HAR files一旦创建就不能修改,要做增加和修改文件必须重新打包。事实上,这对那些写后便不能改的文件来说不是问题,因为它们可以定期成批归档,比如每日或每周。
  3. HAR files目前还不支持文档压缩。

三、SequeuesFile

  Sequence file由一系列的二进制key/value组成,如果key为小文件名,value为文件内容,则可以将大批小文件合并成一个大文件。Hadoop-0.21.0版本开始中提供了SequenceFile,包括Writer,Reader和SequenceFileSorter类进行写,读和排序操作。该方案对于小文件的存取都比较自由,不限制用户和文件的多少,支持Append追加写入,支持三级文档压缩(不压缩、文件级、块级别)。其存储结构如下图所示:

示例代码如下所示:

  private static void writeTest(FileSystem fs, int count, int seed, Path file,
                                CompressionType compressionType, CompressionCodec codec)
    throws IOException {
    fs.delete(file, true);
    LOG.info("creating " + count + " records with " + compressionType +
             " compression");

  //指明压缩方式
    SequenceFile.Writer writer =
      SequenceFile.createWriter(fs, conf, file,
                                RandomDatum.class, RandomDatum.class, compressionType, codec);
    RandomDatum.Generator generator = new RandomDatum.Generator(seed);
    for (int i = 0; i < count; i++) {
      generator.next();

  //keyh
      RandomDatum key = generator.getKey();

  //value
      RandomDatum value = generator.getValue();
//追加写入
      writer.append(key, value);
    }
    writer.close();
  }

  缺点:

  目前为止只发现其Java版本API支持,未在其他开发接口中发现相关版本的实现,尤其是LibHDFS和thrift接口中,可能真是C++阵营狂热支持者的一个悲剧。

四、Hbase

  如果你需要处理大量的小文件,并且依赖于特定的访问模式,可以采用其他的方式,比如Hbase。Hbase以MapFiles存储文件,并支持Map/Reduce格式流数据分析。对于大量小文件的处理,也不失为一种好的选择。

目录
相关文章
|
20天前
|
存储 分布式计算 Hadoop
Hadoop数据块分散存储NameNode管理
【4月更文挑战第17天】Hadoop是一个开源的分布式计算框架,依赖HDFS进行分布式存储。文件被分割成数据块分散在DataNode上,NameNode负责元数据管理和协调,确保数据可靠性。NameNode的高可用性配置能防止单点故障,保证系统稳定性。这套机制支持高效、可靠和可扩展的大数据存储与访问。
16 3
|
1月前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
|
5月前
|
消息中间件 分布式计算 大数据
【大数据技术Hadoop+Spark】Flume、Kafka的简介及安装(图文解释 超详细)
【大数据技术Hadoop+Spark】Flume、Kafka的简介及安装(图文解释 超详细)
77 0
|
1月前
|
存储 分布式计算 Hadoop
Hadoop【基础知识 01】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)
【4月更文挑战第3天】Hadoop【基础知识 01】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)
45 3
|
20天前
|
存储 分布式计算 Hadoop
Hadoop数据块分散存储分散存储
【4月更文挑战第17天】Hadoop是一个开源分布式计算框架,核心是HDFS,用于高可靠性和高吞吐量的大规模数据存储。文件被分割成数据块,分散存储在不同节点,每个块有多个副本,增强容错性。Hadoop根据数据位置将计算任务分发到相关节点,优化处理速度。HDFS支持超大文件,具备高容错性和高数据吞吐量,适合处理和分析海量数据。
18 2
|
20天前
|
存储 分布式计算 Hadoop
Hadoop数据块分散存储数据块大小
【4月更文挑战第17天】Hadoop的 数据块大小影响文件在HDFS中的切分与存储。默认值为64MB、128MB或256MB,可按需调整。选择数据块大小需平衡访问模式、存储效率、网络带宽和磁盘I/O。大块减少元数据,但可能降低读取效率;小块提高读取效率,却增大元数据和网络开销。应用需求决定块大小,如小文件读取频繁则选小块,大文件存储选大块。设置前需全面考虑集群需求,遵循官方文档和最佳实践。
17 3
|
1月前
|
存储 分布式计算 监控
Hadoop【基础知识 01+02】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
77 2
|
19天前
|
存储 分布式计算 Hadoop
Hadoop确定新的存储目录
【4月更文挑战第18天】在Hadoop中设置新存储目录,需创建数据存储目录(如`/data/hadoop/newdata1`、`newdata2`),修改`hdfs-site.xml`配置文件,指定新目录(如`dfs.namenode.name.dir`、`dfs.datanode.data.dir`)。接着重启Hadoop服务,验证新目录是否生效。注意不同环境可能有差异,参照官方文档操作,并确保数据备份、安全性和可扩展性。
17 3
|
24天前
|
存储 分布式计算 负载均衡
Hadoop数据块分散存储与副本创建
【4月更文挑战第15天】Hadoop是一个用于大数据处理的分布式框架,其核心特性包括数据块的分散存储和副本创建。数据块默认为128MB,存储在不同DataNode上,由NameNode管理元数据。每个数据块通常有3个副本,分置于不同节点,确保容错性和可靠性。当节点故障时,Hadoop能自动恢复并根据负载平衡副本位置。这种设计优化了计算资源利用,实现并行处理和高可用性。
23 3
|
26天前
|
存储 分布式计算 监控
Hadoop冗余数据存储
【4月更文挑战第13天】Hadoop的HDFS分布式文件系统通过数据块划分、冗余存储(副本创建)和多样化存储类型提升可靠性与扩展性。NameNode监控副本数量,确保数据安全。使用数据压缩算法节省空间,数据本地化优化提高效率。支持并行处理,实现高效大规模数据处理。
20 1