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

小文件是指那些size比HDFS的block size(默认64m)小的多的文件。任何一个文件,目录和bolck,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个object占用150bytes的内存空间。所以,如果有10milion个文件,每一个文件对应一个block,那么就会消耗namenode 3G来保存这些block的信息。如果规模再大一点,那么将会超出现阶段计算机硬件所能满足的极限。

控制小文件的方法有:

1应用程序自己控制

2archieve

第一种是我采用的方法,感觉使用起来还是比较方便的,我的需求是要对几千个文件进行分布式运算,每个文件占用的空间是2m左右,如果不进行合并的话,那样子运行效率太低了,这里我打算把50个小文件合并为一个大文件放到hdfs系统里面进行运算,代码如下:

final File dir=new File(/home/user/mapinput");
int filename=0;
while(dir.listFiles().length!-0){
    Path path=new Path("/input/+filename);
    FSDataOutputStream create=fs.creat(path);
int num=0;
for(File fileName:dir.listFiles()){
   System.out.println(fileName.getAbsolutePath());
   final FileInputStream fileInputStream=new FileInputStream(fileName.getAbsolutePath());
   final List<String> readLines=IOUtils.readLines(fileInputStream);
  for(String line=readLines)
  {
      create.write(line.getBytes());
      create.write(‘\n‘);
  }
     fileInputStream.close();
    File f=new File("/home/user/mapinput/"+fileName);
   if(fileName.exists())fileName.delete();
   mun++;
   if(num==50){
    break;
  }
}
  filename++;
   create.close();
}  

这样,原本几千个小文件就变成了若干个100m左右的文件了,文件的大小可以通过参数num的数目来决定。

2使用Archive来操作

hadoop不适合小文件的存储,小文件本省就占用了很多的metadata,就会造成namenode越来越大。Hadoop Archives的出现视为了缓解大量小文件消耗namenode内存的问题。

通过HAR来读取一个文件并不会比直接从HDFS中读文件高效,而且实际上可能还会稍微低效一点,因为对每一个HAR文件的访问都需要完成两层读取,index文件的读取和文件本身的读取,而且尽管HAR文件可以被用来作为mapreduce job的input,但是并没有特殊的方法来使maps将HAR文件中打包的文件当做一个HDFS文件处理。

命令:

hadoop archive -archiveName user.har -p /user output /user/har

查看内容:hadoop fs -lsr har:///user/har/user.har

时间: 2024-10-29 00:18:46

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

【POI】对于POI无法处理超大xls等文件,官方解决方法【未研究,待定】

本次使用POI处理xlsx文件,莫名的遇到了一个无法逾越的问题. 总共71个xlsx文件,单个文件最大达到50M以上,71个xls文件摆在那里就有3-4G的大小. 在起始处理的时候,发现原本适用于正常大小的POI处理xls程序竟然屡次的报错GC outofmemory 的内存移除的问题. [当前状况] ①一个50M大小的xlsx文件,使用压缩文件打开,可以看到xml文件达到900M以上 ②一个50M大小以上的xlsx文件,单个工作簿,行数平均在15W行---40W之间,列数在64列左右 ③单方面

“fatal error: hdf5.h: 没有那个文件或目录”解决方法

問題一: Installing Caffe without CUDA: fatal error: cublas_v2.h No such file: 在Makefile.config中修改,將CPU_ONLY := 1打開. 問題二:“fatal error: hdf5.h: 没有那个文件或目录”解决方法 参考自http://blog.csdn.net/hongye000000/article/details/51043913 Step 1 在Makefile.config文件的第85行,添加/

64位系统使用Access 数据库文件的彻底解决方法

最近,有PDF.NET用户问我怎么在64位系统下无法访问Access数据库的问题,我第一反应是我怎么没有遇到呢?今天一看自己的VS和Office都是32位版本的,所以在VS里面调试访问Access是没有问题的,但是直接使用编译好的.NET程序访问Access,就出问题了,报: 未在本地计算机上注册“Microsoft.Jet.Oledb.4.0”提供程序. 于是,又在公司的电脑上(Win7 64位)做了实验,发现跟家里面的Win8.1 64位 问题一样,上网搜索了一下,大部分都建议将.NET程序

VMware ESXi中不能显示CPU及内存使用情况的解决方法

今天一个网友问我,他管理的机房有4台ESXi 5.1的服务器,其中三台ESXi Server不能显示各个虚拟机占用的CPU.内存情况了,如图1-1所示. 图1-1在"虚拟机"选项卡中不能显示每个启动虚拟机的资源占用情况 另外,在VMware ESXi的"摘要"中,CPU与内存的使用情况也统计出错,如图1-2所示. 图1-2 摘要统计出错 在出现这个问题时,各个ESXi Server上的虚拟机可以正常启动.关闭,并且各虚拟机运行的系统及应用不受影响. 从上面两个图我看

Hyper-V虚拟机启动时报&ldquo;账户没有足够的权限打开VHD文件&rdquo;原因及解决方法

前段时间,准备做一套Exchange Server 2010仿真环境,用于后期企业内各项变更及平台上线时测试工作,由于需要准备的服务器较多,一台一台装虚机,感谢非常费时间,所以想到,做一个模版来快速完成虚拟机部署工作,大概的过程我想大家也有做过,就是装一台Hyper-V虚机,然后把VHD硬盘文件拷贝出来,分别替换所有建好没有系统的虚拟机硬盘,看似简单,但是在实际操作时发现,模版硬盘没有被识别?各种报错,如下图所示: 当看到上图所示这些报错时,很不理解,已经将这台机器的VHD文件指向了新拷入的模版

错误:readline/readline.h:没有那个文件或目录解决方法

make linux在包含自 lua.h:16 的文件中,从 lua.c:15:luaconf.h:275:31: 错误:readline/readline.h:没有那个文件或目录luaconf.h:276:30: 错误:readline/history.h:没有那个文件或目录lua.c: In function 'pushline':lua.c:182: 警告:隐式声明函数 'readline'lua.c:182: 警告:赋值时将整数赋给指针,未作类型转换lua.c: In function

aix 显示文件存在,删除提示文件不存在 解决方法

今天在aix解压一个文件,中间报错,解压失败.产生了一个 abc文件,用rm 删除,提示文件不存在. 用了个更狠的 rm -f ,依然提示文件不存在.猜想一定是文件名中包含有空格,google了一下,终于找到了解决方法 rm *abc*  或者rm -fr *abc* 但是一定要注意,不要误删除其他文件,否则后悔莫及,一定要小心. aix 显示文件存在,删除提示文件不存在 解决方法,布布扣,bubuko.com

关于tomcat网站目录下apk文件无法下载解决方法

今天公司网站要添加一个手机app,我直接把apk文件传到了网站根目录下,并且在页面中添加了路径   <area shape="rect" coords="533,290,672,328" href="<c:url value='/wswhly.apk'/>" /> 可是在网站中点击,怎么也下载不了,可是换成别的文件类型(xls.flv等等)就可以下载,查询了很多资料,后来发现在web.xml文件中,需要添加以apk为后缀的

无法打开文件“freeglut.lib”解决方法:

资源: 链接:https://pan.baidu.com/s/1eSctT5K 密码:174s VS2010问题: 无法打开文件"freeglut.lib"解决方法: (1)下载freeglut-2.8.1.tar.gz压缩包并解压. (2)将freeglut-2.8.1\freeglut-2.8.1\include\GL文件夹下的freeglut.h.freeglut_ext.h.freeglut_std.h.glut.h文件复制到C:\Program Files\Microsoft