`
退役的龙弟弟
  • 浏览: 453740 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hadoop小文件处理以及解决方案(压缩技术)

 
阅读更多

小文件太多的问题:

hdfs上每个文件都要在namenode上建立索引,索引大小大约为150byte。所以大量小文件会产生很多索引,占用大量namenode内存,而且索引太多导致检索速度变慢。

 

小文件解决方案:

1、hadoop自身提供一些文件压缩方案

2、从系统层面改变现有hdfs存在的问题,其实还是小文件的合并,然后建立比较快速的索引

 

下面分别对这两种解决方案做一些解析

1、hadoop自身提供一些文件压缩方案

 hadoop对每个压缩格式的支持,详细见下表:

 压缩格式  工具  算法  文件扩展名  多文件  可分割性
 DEFLATE  无  DEFLATE  .deflate  不  不
 gzip  gzip  DEFLATE  .gz  不  不
 ZIP  zip  DEFLATE  .zip  是  是,在文件范围内
 bzip2  bzip2  bzip2  .bz2  不  是
 LZO  lzop  LZO  .lzo  不  否

hadoop下各种压缩算法的压缩比,压缩时间,解压时间见下表:

压缩算法 原始文件大小 压缩后的文件大小 压缩速度 解压缩速度
gzip   8.3GB   1.8GB 17.5MB/s 58MB/s
bzip2 8.3GB 1.1GB 2.4MB/s 9.5MB/s
LZO-bset 8.3GB 2GB 4MB/s 60.6MB/s
LZO 8.3GB 2.9GB 49.3MB/S 74.6MB/s

 

现在最常用的压缩方式是gzip和lzo。两者相比:gzip压缩想过更好能达到原大小的25%,LZO则能到30%-40%。lzo的压缩和解压速度更快,lzo的解压速度大概是gzip的3倍左右

对输出文件进行压缩很简单,只需要     1、指定作业使用压缩 2、指定压缩格式

Java代码 
  1. Configuration conf = new Configuration();  
  2.             //map任务中间输出使用gzip压缩-------不能用  
  3. //          conf.setBoolean("mapred.compress.map.output", true);    
  4. //          conf.setClass("mapred.map.output.compression.codec",GzipCodec.class, CompressionCodec.class);  
  5.               
  6.             Job job = new Job(conf, "wordcount Job");  
  7.             job.setOutputKeyClass(Text.class);  
  8.             job.setOutputValueClass(IntWritable.class);  
  9.             job.setMapperClass(mapperString.class);  
  10. //          job.setCombinerClass(reduceStatistics.class);  
  11.             job.setReducerClass(reduceStatistics.class);  
  12.               
  13.             FileInputFormat.addInputPath(job, new Path(in));  
  14.             FileOutputFormat.setOutputPath(job, new Path(out));  
  15.               
  16.             //将reduce输出文件压缩  
  17.             FileOutputFormat.setCompressOutput(job, true);  //job使用压缩  
  18.             FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class); //设置压缩格式  
  19.               
  20.             job.waitForCompletion(true);  

 

执行结果:

Xml代码 
  1. nange@ubuntu:~/work/test/word$ hadoop fs -ls /hdfs/test/wordcount/out/  
  2. Found 6 items  
  3. -rw-r--r--   3 nange supergroup          0 2014-04-24 09:57 /hdfs/test/wordcount/out/_SUCCESS  
  4. drwxr-xr-x   - nange supergroup          0 2014-04-24 09:57 /hdfs/test/wordcount/out/hadoop  
  5. -rw-r--r--   3 nange supergroup         28 2014-04-24 09:57 /hdfs/test/wordcount/out/hello-r-00000.gz  
  6. -rw-r--r--   3 nange supergroup         29 2014-04-24 09:57 /hdfs/test/wordcount/out/other-r-00000.gz  
  7. -rw-r--r--   3 nange supergroup         20 2014-04-24 09:57 /hdfs/test/wordcount/out/part-r-00000.gz  
  8. -rw-r--r--   3 nange supergroup         28 2014-04-24 09:57 /hdfs/test/wordcount/out/world-r-00000.gz  

 查看gzip文件

Xml代码 
  1. nange@ubuntu:~/work/test/word$ hadoop fs -text /hdfs/test/wordcount/out/hadoop/-r-00000.gz  
  2. hadoop  1  

2、从系统层面改变现有hdfs存在的问题,其实还是小文件的合并,然后建立比较快速的索引

转载自董的博客

1、  概述

 

小文件是指文件size小于HDFS上block大小的文件。这样的文件会给hadoop的扩展性和性能带来严重问题。首先,在HDFS中,任何block,文件或者目录在内存中均以对象的形式存储,每个对象约占150byte,如果有1000 0000个小文件,每个文件占用一个block,则namenode大约需要2G空间。如果存储1亿个文件,则namenode需要20G空间(见参考资料[1][4][5])。这样namenode内存容量严重制约了集群的扩展。 其次,访问大量小文件速度远远小于访问几个大文件。HDFS最初是为流式访问大文件开发的,如果访问大量小文件,需要不断的从一个datanode跳到另一个datanode,严重影响性能。最后,处理大量小文件速度远远小于处理同等大小的大文件的速度。每一个小文件要占用一个slot,而task启动将耗费大量时间甚至大部分时间都耗费在启动task和释放task上。

本文首先介绍了hadoop自带的解决小文件问题的方案(以工具的形式提供),包括Hadoop Archive,Sequence file和CombineFileInputFormat;然后介绍了两篇从系统层面解决HDFS小文件的论文,一篇是中科院计算所2009年发表的,用以解决HDFS上存储地理信息小文件的方案;另一篇是IBM于2009年发表的,用以解决HDFS上存储ppt小文件的方案。

2、  HDFS文件读写流程

在正式介绍HDFS小文件存储方案之前,我们先介绍一下当前HDFS上文件存取的基本流程。

(1)  读文件流程

1)client端发送读文件请求给namenode,如果文件不存在,返回错误信息,否则,将该文件对应的block及其所在datanode位置发送给client

2) client收到文件位置信息后,与不同datanode建立socket连接并行获取数据。

(2) 写文件流程

1) client端发送写文件请求,namenode检查文件是否存在,如果已存在,直接返回错误信息,否则,发送给client一些可用datanode节点

2) client将文件分块,并行存储到不同节点的datanode上,发送完成后,client同时发送信息给namenode和datanode

3)  namenode收到的client信息后,发送确信信息给datanode

4)  client同时收到namenode和datanode的确认信息后,提交写操作。

3、  Hadoop自带的解决方案

对于小文件问题,Hadoop本身也提供了几个解决方案,分别为:Hadoop Archive,Sequence file和CombineFileInputFormat。

(1) Hadoop Archive

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

对某个目录/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

使用HAR时需要两点,第一,对小文件进行存档后,原文件并不会自动被删除,需要用户自己删除;第二,创建HAR文件的过程实际上是在运行一个mapreduce作业,因而需要有一个hadoop集群运行此命令。

此外,HAR还有一些缺陷:第一,一旦创建,Archives便不可改变。要增加或移除里面的文件,必须重新创建归档文件。第二,要归档的文件名中不能有空格,否则会抛出异常,可以将空格用其他符号替换(使用-Dhar.space.replacement.enable=true 和-Dhar.space.replacement参数)。

(2) Sequence file

sequence file由一系列的二进制key/value组成,如果为key小文件名,value为文件内容,则可以将大批小文件合并成一个大文件。

Hadoop-0.21.0中提供了SequenceFile,包括Writer,Reader和SequenceFileSorter类进行写,读和排序操作。如果hadoop版本低于0.21.0的版本,实现方法可参见[3]。

(3)CombineFileInputFormat

CombineFileInputFormat是一种新的inputformat,用于将多个文件合并成一个单独的split,另外,它会考虑数据的存储位置。

4、  小文件问题解决方案

上一节中提到的方案均需要用户自己编写程序,每隔一段时间对小文件进行merge以便减少小文件数量。那么能不能直接将小文件处理模块嵌到HDFS中,以便自动识别用户上传的小文件,然后自动对它们进行merge呢?

本节介绍了两篇论文针试图在系统层面解决HDFS小文件问题。这两篇论文对不同的应用提出了解决方案,实际上思路类似:在原有HDFS基础上添加一个小文件处理模块,当一个文件到达时,判断该文件是否属于小文件,如果是,则交给小文件处理模块处理,否则,交给通用文件处理模块处理。小文件处理模块的设计思想是,先将很多小文件合并成一个大文件,然后为这些小文件建立索引,以便进行快速存取和访问。

论文[4]针对WebGIS系统的特点提出了解决HDFS小文件存储的方案。WebGIS是结合web和地理信息系统(GIS)而诞生的一种新系统。在WebGIS中,为了使浏览器和服务器之间传输的数据量尽可能地少,数据通常被切分成KB的小文件存储在分布式文件系统中。论文结合WebGIS中数据相关性特征,将保存相邻地理位置信息的小文件合并成一个大的文件,并为这些小文件建立索引以便对小文件进行存取。

该论文将size小于16MB的文件当做小文件,需将它们合并成64MB(默认的block size),并建立索引,索引结构和文件存储方式见上图。索引方式是一般的定长hash索引。

论文[5]针对Bluesky系统(http://www.bluesky.cn/)的特点提出了解决HDFS小文件存储的方案。Bluesky是中国电子教学共享系统,里面的ppt文件和视频均存放在HDFS上。该系统的每个课件由一个ppt文件和几张该ppt文件的预览快照组成。当用户请求某页ppt时,其他相关的ppt可能在接下来的时间内也会被查看,因而文件的访问具有相关性和本地性。本文主要有2个idea:第一,将属于同一个课件的文件合并成一个大文件,以提高小文件存储效率。第二,提出了一种two-level prefetching机制以提高小文件读取效率,即索引文件预取和数据文件预取。索引文件预取是指当用户访问某个文件时,该文件所在的block对应的索引文件被加载到内存中,这样,用户访问这些文件时不必再与namenode交互了。数据文件预取是指用户访问某个文件时,将该文件所在课件中的所有文件加载到内存中,这样,如果用户继续访问其他文件,速度会明显提高。

下图展示的是在BlueSky中上传文件的过程:

下图展示的是在BlueSky中阅览文件的过程:

5、  总结

Hadoop目前还没有一个系统级的通用的解决HDFS小文件问题的方案。它自带的三种方案,包括Hadoop Archive,Sequence file和CombineFileInputFormat,需要用户根据自己的需要编写程序解决小文件问题;而第四节提到的论文均是针对特殊应用提出的解决方案,没有形成一个比较通用的技术方案。

分享到:
评论

相关推荐

    大数据Hadoop存储与分析处理平台建设方案-大数据Hadoop平台集成实施服务解决方案.docx

    大数据Hadoop存储与分析处理平台建设方案-大数据Hadoop平台集成实施服务解决方案 大数据Hadoop存储与分析处理平台建设方案是基于Hadoop平台的集成实施服务解决方案,旨在解决大数据存储和分析处理的难题。该方案...

    376页页8万字大数据Hadoop存储与分析处理平台建设方案.docx

    大数据Hadoop存储与分析处理平台建设方案是基于Hadoop技术的数据存储和分析处理平台的解决方案,该方案旨在帮助企业和组织更好地存储、处理和分析大数据,从而获取有价值的商业_insights。 Hadoop概述 Hadoop是一...

    7万字大数据Hadoop存储与分析处理平台建设方案.docx

    大数据Hadoop存储与分析处理平台建设方案是指通过Hadoop平台来存储和分析大数据的解决方案。该方案主要分为两个部分:Hadoop平台集成实施服务和大数据Hadoop存储与分析处理平台建设方案。 Hadoop平台集成实施服务是...

    大数据Hadoop存储与分析处理平台建设方案.docx

    Hadoop是Apache基金会下的开源项目,旨在提供大规模数据存储和处理解决方案。Hadoop的主要特点是分布式计算、可扩展性和高可用性,它可以处理大量数据,支持PB级别的数据存储和处理。 Hadoop能做什么 Hadoop能够对...

    本地hadoop支持文件.rar

    标题中的“本地Hadoop支持文件.rar”表明这是一个与Hadoop相关的本地环境配置文件,...请注意,由于Hadoop在Windows上的支持不如Linux成熟,可能会遇到一些特有的问题,这时需要查阅官方文档或社区论坛寻找解决方案。

    基于Greenplum Hadoop- 分布式平台的大数据解决方案15.定义数据库对象(5)-压缩存储.zip

    在大数据处理领域,分布式平台如Greenplum和Hadoop已经成为不可或缺的工具。这些系统能够处理海量数据,并提供高效的数据分析能力。本主题聚焦于在Greenplum与Hadoop结合的环境中,如何通过定义数据库对象来优化...

    Hadoop海量文本处理3-中国电信

    综上所述,Hadoop及其相关组件构成了一套完整的解决方案,能够满足从数据存储、处理到查询分析等多个层面的需求。无论是电信行业还是其他行业,都可以通过这些技术实现对海量数据的有效管理和利用。

    HDFS小文件处理方案

    综上所述,HDFS在处理小文件时存在明显的局限性。通过Hadoop Archive、SequenceFile、CombineFileInputFormat等内置解决方案可以有效缓解这些问题。此外,WebGIS解决方案和BlueSky解决方案等外部实践也为我们提供了...

    hadoop上传文件共5页.pdf.zip

    PDF中的5页内容可能详细阐述了这些步骤,包括具体命令、最佳实践以及可能遇到的问题和解决方案。此外,"赚钱项目"这部分可能涵盖了实际案例、数据分析策略或利用Hadoop进行商业智能的方法,以展示如何将Hadoop技术...

    hadoop相关技术原理

    【Hadoop 技术原理概览】 Hadoop 是一个开源的大数据处理框架,核心由 HDFS(Hadoop Distributed File System)和 MapReduce 组成,它允许...了解它们的原理和适用场景,可以帮助我们更好地设计和实施大数据解决方案。

    hadoop2.7.2 之 snappy压缩支持包.zip

    总结来说,Hadoop 2.7.2的Snappy压缩支持包提供了一种高效的数据压缩解决方案,适用于大数据环境。通过替换Hadoop的原生库文件并适当配置,可以充分利用Snappy的高速压缩性能,优化存储和计算资源的利用,提升整个...

    (orc + snappy / zlib ) 多线程并行合并小文件工具类 (出自:flink自定义合并orc小文件处)

    通过多线程并行处理和优化的压缩策略,它可以在不牺牲性能的前提下,有效解决小文件问题,提高数据处理的效率和存储的利用率。在实际应用中,可以根据集群资源和数据量调整参数,以达到最佳的合并效果。

    基于LZO的Hadoop文件归档优化方法.docx

    通过对Hadoop架构、LZO压缩算法以及文件归档优化的详细分析,本文为读者揭示了大数据处理和分析中的关键技术和优化策略,有助于计算机科学与技术、软件工程等相关专业的学生以及从业者更好地理解和应用Hadoop,以...

    hadoop毅哥的压缩包.7z

    Hadoop并不只是一个单独的工具,它有一个庞大的生态系统,包括HBase(分布式数据库)、Hive(数据仓库工具)、Pig(数据分析平台)等,这些工具通常与Hadoop一起使用,以构建大数据处理解决方案。 总之,这个压缩包...

    hadoop.zip hadoop2.7.1安装包

    在Windows环境下使用Hadoop时,由于Hadoop原生支持Linux系统,所以需要额外的工具来与Hadoop文件系统(HDFS)交互。这正是`winutils-master.zip`的作用。这个文件包含了Windows平台上的Hadoop实用工具,比如用于设置...

    hadoop-lzo-0.4.20.jar

    总的来说,Hadoop-LZO是一个针对Hadoop的高效压缩解决方案,适合对数据处理速度有较高要求的场景,但需要根据实际需求和资源限制来选择是否使用。对于Hadoop `3.1.3`版本,使用Hadoop-LZO `0.4.20`是一个合理的版本...

    大数据云计算技术 Hadoop运维笔记(共21页).pptx

    【大数据云计算技术 Hadoop运维笔记】的PPT涵盖了Hadoop在蓝汛公司的应用实践,以及Cloudera的产品和运维经验。以下是对其中知识点的详细解释: 1. **Hadoop在蓝汛的应用**: - 蓝汛使用了6000台设备,300个集群,...

    Hadoop集群

    Cloudera是最早提供Hadoop商业解决方案的公司之一,其产品线涵盖CDH、Cloudera Manager和Cloudera Support等。CDH是完全开源的发行版,增强了Hadoop的兼容性、安全性、稳定性。Cloudera Manager可以快速部署Hadoop...

Global site tag (gtag.js) - Google Analytics