当前位置:首页 > 实用技巧 >

hdfs小文件合并的方式(hdfs小文件处理方法)

来源:原点资讯(www.yd166.com)时间:2023-11-28 11:31:04作者:YD166手机阅读>>

在HDFS中,任何block,文件或者目录在内存中均以对象的形式存储,每个对象约占150byte,小文件过多会极大占用namonode的内存空间,从而制约集群的扩展。那么怎样处理HDFS中的小文件,下面我们一起看看。

一、采用HAR归档

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

案例实现:对目录/input下的所有小文件存档成/output/zoo.har。

Hadoop archive -archiveName zoo.har -p /input /output

查看结果:

hdfs小文件合并的方式,hdfs小文件处理方法(1)

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

注意:创建HAR的过程是在运行一个MR作业。HAR在对小文件进行存档后,原文件不会被删除,且创建之后不能改变,要增加或移除里面的文件,必须重新创建归档文件。文件名中也不能有空格存在,否则会报异常。可以将空格用其他符号替换(使用-Dhar.space.replacement.enable和-Dhar.space.replacement参数)。

二、采用CombineTextInputFormat

Hadoop框架默认的TextInputFormat切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个MapTask,这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下。

CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样多个小文件就可以交给一个MapTask处理。

可以通过以下参数设置虚拟存储切片最大值,虚拟存储切片最大值设置最好根据实际的小文件大小情况来设置具体的值。

CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); // 4M

切片过程:判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。

hdfs小文件合并的方式,hdfs小文件处理方法(2)

测试案例:有4个小文件大小分别为1.7M、5.1M、3.4M以及6.8M这四个小文件,则最终会形成3个切片,大小分别为:(1.7 2.55)M,(2.55 3.4)M,(3.4 3.4)M。

案例实现:

实现WordcountMapper 。

public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

Text k = new Text();

IntWritable v = new IntWritable(1);

@Override

protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

// 1 获取一行

String line = value.toString();

// 2 切割

String[] words = line.split(" ");

// 3 写出

for (String word : words) {

k.set(word);

context.write(k, v);

}

}

}

实现WordcountReducer 。

public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{

int sum;

IntWritable v = new IntWritable();

@Override

protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {

// 1 累加求和

sum = 0;

for (IntWritable count : values) {

sum = count.get();

}

// 2 写出

v.set(sum);

context.write(key,v);

}

}

实现Driver驱动类。

public class WordcountDriver {

public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

// 1 获取配置信息以及获取job对象

Configuration configuration = new Configuration();

Job job = Job.getInstance(configuration);

// 2 关联本Driver程序的jar

job.setJarByClass(WordcountDriver.class);

// 3 关联Mapper和Reducer的jar

job.setMapperClass(WordcountMapper.class);

job.setReducerClass(WordcountReducer.class);

// 4 设置Mapper输出的kv类型

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(IntWritable.class);

// 5 设置最终输出kv类型

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

// 如果不设置InputFormat,默认用的是TextInputFormat.class

job.setInputFormatClass(CombineTextInputFormat.class);

//虚拟存储切片最大值设置4m

CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);

// 6 设置输入和输出路径

FileInputFormat.setInputPaths(job, new Path(args[0]));

FileOutputFormat.setOutputPath(job, new Path(args[1]));

// 7 提交job

boolean result = job.waitForCompletion(true);

System.exit(result ? 0 : 1);

}

}

查看结果:number of splits:3

最终会形成3个切片,大小分别为:(1.7 2.55)M,(2.55 3.4)M,(3.4 3.4)M。

三、开启JVM重用

一个MapTask运行会启动一个JVM,MapTask完成计算,JVM会销毁。开启JVM重用,让一个JVM可以运行多个MapTask程序。

小文件场景开启JVM重用,如果没有小文件,不要开启JVM重用,因为会一直占用Task卡槽,直到任务完成才释放。

JVM重用可以使得JVM实例在同一个Job中重新使用N次,N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间。

<property>

<name>mapreduce.job.jvm.numtasks</name>

<value>10</value>

<description>How many tasks to run per jvm,if set to -1 ,there is no limit</description>

</property>

四、总结

本文介绍了Hadoop解决小文件问题的方案,包括Hadoop Archive、CombineTextInputFormat和开启JVM重用,同时介绍了部分参数的使用,希望能帮助有需要的人。

栏目热文

vfs合并失败处理方法(vfs global登录显示错误)

vfs合并失败处理方法(vfs global登录显示错误)

智通财经APP注意到,越南电动汽车制造商VinFast(VFS.US)上市首日股价拉升255%,一举超过通用和奔驰等传统...

2023-11-28 11:37:20查看全文 >>

顾一心为什么没演第二季(顾一心为什么换演员)

顾一心为什么没演第二季(顾一心为什么换演员)

砸了。肉叔盼了5年的国产第一青春剧,算是砸了。没错,《一起同过窗3》。7月初上线,最近豆瓣开分,1w多人打出3.3。短评...

2023-11-28 11:24:00查看全文 >>

一起同过窗2顾一心为什么没参演了(一起同过窗第三季顾一心回国了吗)

一起同过窗2顾一心为什么没参演了(一起同过窗第三季顾一心回国了吗)

《一起同过窗》这个IP今年再度被提及,在豆瓣上享有9.1高分的它,光是短评数就突破了2万。纵看演员表,真是连个小点的流量...

2023-11-28 11:17:22查看全文 >>

一起同过窗顾一心为什么出国了(一起同过窗第二季为啥没有顾一心)

一起同过窗顾一心为什么出国了(一起同过窗第二季为啥没有顾一心)

很多人都纳闷为什么上一季的几个主演之一的顾一心不见了。其实顾一心在上部剧中的感情线人物线刻画得还是蛮饱满的,与十三的感情...

2023-11-28 11:13:58查看全文 >>

我们一起同过窗2顾一心回来了吗(一起同过窗2顾一心结局)

我们一起同过窗2顾一心回来了吗(一起同过窗2顾一心结局)

在《一起同过窗》第二季里,那个深谙赚钱之道的顾一心去美国读书,是不辞而别的离开。其实她在这部戏里没有过多的戏份,主要是跟...

2023-11-28 11:25:28查看全文 >>

hdfs 文件分割不完整(hdfs小文件处理方法)

hdfs 文件分割不完整(hdfs小文件处理方法)

阅读此文前,麻烦您点击一下“关注”,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。求关注一、HDFS读...

2023-11-28 11:51:52查看全文 >>

hdfs小文件的处理(hdfs的文件写入步骤)

hdfs小文件的处理(hdfs的文件写入步骤)

一、背景每个文件均按块存储,每个块的元数据存储在NameNode的内存中,因此hdfs存储小文件会非常低效。因为大量的小...

2023-11-28 11:25:24查看全文 >>

vfs文件不存在(vfs文件是什么 求答案)

vfs文件不存在(vfs文件是什么 求答案)

前言为什么 Linux 内核的文件系统类型那么多,都能挂载上呢?为什么系统里可以直接 mount 其他文件系统呢?甚至能...

2023-11-28 11:19:23查看全文 >>

过大的vfs文件会导致无法使用吗(vfs文件删除影响软件使用吗)

过大的vfs文件会导致无法使用吗(vfs文件删除影响软件使用吗)

一.VFS(虚拟文件系统)和Ext2关系:VFS是Linux中的一个虚拟文件文件系统,它为应用程序员提供一层抽象,屏蔽底...

2023-11-28 11:22:37查看全文 >>

hdfs如何在文件中添加内容(hdfs创建文件并写入内容)

hdfs如何在文件中添加内容(hdfs创建文件并写入内容)

HDFS是基于Java的文件系统,可在Hadoop生态系统中提供可扩展且可靠的数据存储。因此,我们需要了解基本的HDFS...

2023-11-28 11:27:18查看全文 >>

文档排行