基于Hadoop Sequencefile的小文件解决方案

2019-03-28 13:56|来源: 网络

一、 概述

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

 

二、Hadoop自带的解决方案

对于小文件问题,Hadoop本身也提供了几个解决方案,分别为:Hadoop ArchiveSequence fileCombineFileInputFormat

1 Hadoop Archive

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

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

该方案需人工进行维护,适用管理人员的操作,而且har文件一旦创建,Archives便不可改变,不能应用于多用户的互联网操作。

2 Sequence file

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

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

 

该方案对于小文件的存取都比较自由,不限制用户和文件的多少,但是SequenceFile文件不能追加写入,适用于一次性写入大量小文件的操作。

 

3CombineFileInputFormat

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

该方案版本比较老,网上资料甚少,从资料来看应该没有第二种方案好。

三、小文件问题解决方案

在原有HDFS基础上添加一个小文件处理模块,具体操作流程如下:

       1.   当用户上传文件时,判断该文件是否属于小文件,如果是,则交给小文件处理模块处理,否则,交给通用文件处                理模块处理。

       2.  在小文件模块中开启一定时任务,其主要功能是当模块中文件总size大于HDFSblock大小的文件时,则通                     过SequenceFile组件以文件名做key,相应的文件内容为value将这些小文件一次性写入hdfs模块。

       3. 同时删除已处理的文件,并将结果写入数据库。

       4.  当用户进行读取操作时,可根据数据库中的结果标志来读取文件。

相关问答

更多

关于hadoop的问题,进来看看呀

java是执行文件,不是目录 java path默认是java_home/bin/目录 这个目录底下应该 java和javac等文件

hadoop和hbase问题

Hadoop 是一个能够对大量数据进行分布式处理的软件框架。 HBase是一个分布式的、面向列的开源数据库。 HBase在Hadoop之上提供了类似于Bigtable的能力。 HBase是Apache的Hadoop项目的子项目。 HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。 另一个不同的是HBase基于列的而不是基于行的模式。

关于hadoop小文件处理

这不能被实现在现有的Hadoop。 时设置的目录中,文件中的目录信息被读入Hadoop的输入已被确定 房东当时就完成所有文件的MapReduce,Hadoop的还是会等待输入,但房东可以想像,你能不能给Hadoop的信号,让他停止运行

我如何使用hadoop处理大量小文件?(how can i work with large number of small files in hadoop?)

如果你使用类似TextInputFormat东西,问题是每个文件至少有一个分割,所以地图数量的上限是文件的数量,在你的情况下,你将有很多非常小的文件结束许多映射器处理每个非常少的数据。 为了解决这个问题,你应该使用CombineFileInputFormat ,它可以将多个文件打包到同一个CombineFileInputFormat中(我认为最多可以限制块的大小),所以对于这种格式,映射器的数量将独立于文件的数量,它将取决于关于数据量。 您将不得不通过从CombineFileInputFormt扩 ...

SequenceFile Compactor只有一个file.seq中的几个小文件(SequenceFile Compactor of several small files in only one file.seq)

与任何其他InputStream一样,FSDataInputStream不是要序列化的。 什么序列化字节流上的“迭代器”应该做什么? 您最可能想要做的是将文件的内容存储为值。 例如,您可以将值类型从FsDataInputStream切换到BytesWritable,只需从FSDataInputStream中获取所有字节。 为此目的使用Key / Value SequenceFile的一个缺点是每个文件的内容必须适合内存。 对于小文件可能没什么问题,但你必须知道这个问题。 我不确定你到底想要实现什么 ...

hadoop中的小文件(Small files in hadoop)

如果文件都是相同的“架构”,那么就像CSV或JSON一样。 然后,欢迎您编写一个非常基本的Pig / Spark作业来读取整个文件夹的小文件,然后将其写回到其他地方,这很可能会根据HDFS块大小将所有文件合并为更大的文件。 您还提到了Hive,因此对小文件使用外部表,并使用CTAS查询创建一个单独的表,从而创建一个MapReduce作业,就像Pig一样。 IMO,如果可能的话,最佳解决方案是设置Hadoop的“上游”系统,它将较小的文件批处理为较大的文件,然后将它们转储到HDFS。 Apache ...

任何类似于Apache Hadoop的测试框架/解决方案?(Any tested Frameworks/Solutions similar to Apache Hadoop?)

也许。 但是他们中没有一个会在测试中接近hadoop的真实世界体验。 像Facebook和雅虎这样的公司正在付钱来规模hadoop,我也知道没有类似的开源项目值得期待。 Maybe. But none of them will have anywhere near the testing a real world experience that hadoop does. Companies like facebook and yahoo are paying to scale hadoop and ...

在Hadoop中实现故障注入有哪些解决方案[关闭](What are the solutions to implementing the fault-injection in Hadoop [closed])

Hadoop实际上有一个故障注入框架。 看到这个 。 Hadoop actually has a fault injection framework. See this.

Hadoop SequenceFile - 记录的自动增量键(Hadoop SequenceFile - auto increment key for records)

好吧,最终我不可能做我想做的事。 所以我切换到HBase ,我将文件存储为表中的行。 现在表现还可以,而且一切似乎都是以正确的方式进行的。 Well, in the end it's not possible to do what I wanted. So I switched to HBase and I'm storing files as rows in a table. Now the performance are ok and all seems to go in the right ...

Hadoop SequenceFile二进制文件是否安全?(Is Hadoop SequenceFile binary safe?)

冲突在技术上是可行的,但实际上它们极不可能。 来自http://search-hadoop.com/m/VYVra2krg5t1 : 给定的随机16字节字符串出现在PB级(均匀分布的)数据中的概率约为10 ^ -23。 您的数据中心更有可能被陨石消灭( http://preshing.com/20110504/hash-collision-probabilities )。 Clashes are technically possible, but in reality they are incre ...