微信搜索lxw1234bigdata | 邀请体验:数阅–数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

合并HDFS和本地文件系统中的小文件

Hadoop lxw1234@qq.com 27976℃ 4评论

关键字:hadoop hdfs 小文件、appendToFile、getmerge

众所周知,HDFS中过多的小文件,会给NameNode造成很大的压力,所谓的小文件,是指远远小于文件块大小的文件。

在使用HDFS的过程中,应尽量避免生成过多的小文件。

本文以TextFile为例,介绍一下从本地–>HDFS、HDFS–>本地、以及HDFS–>HDFS的文件上传下载移动过程中,对小文件的合并方法。

将本地的小文件合并,上传到HDFS

假设存放在本地的数据由很多个小文件组成,需要上传到HDFS。一般的做法是在本地使用脚本、程序先把小文件合并后再上传。

其实没有必要,HDFS中提供了一个很有用的命令 appendToFile,就可以解决这个问题。

假设本地有两个小文件1.txt和2.txt,里面内容如下:

[liuxiaowen@dev ~]$ cat 1.txt 
111111
111111
111111
111111
[liuxiaowen@dev ~]$ cat 2.txt 
222222
222222
222222
222222

使用下面的命令,可以将1.txt和2.txt合并,并上传到HDFS:

[liuxiaowen@dev ~]$ hadoop fs -appendToFile 1.txt 2.txt hdfs://cdh5/tmp/lxw1234.txt
[liuxiaowen@dev ~]$ hadoop fs -cat hdfs://cdh5/tmp/lxw1234.txt
111111
111111
111111
111111
222222
222222
222222
222222
华丽的分割线:您可以关注 lxw的大数据田地 ,或者 加入邮件列表 ,随时接收博客更新的通知邮件。

下载HDFS的小文件到本地,合并成一个大文件

假设在HDFS的/tmp/lxw1234/目录下,有两个小文件1.txt和2.txt

需要将它们下载到本地的一个文件中。

[liuxiaowen@dev ~]$ hadoop fs -cat /tmp/lxw1234/1.txt
111111
111111
111111
111111
[liuxiaowen@dev ~]$ hadoop fs -cat /tmp/lxw1234/2.txt
222222
222222
222222
222222

使用下面的命令:

[liuxiaowen@dev ~]$ hadoop fs -getmerge hdfs://cdh5/tmp/lxw1234/*.txt local_largefile.txt
[liuxiaowen@dev ~]$ cat local_largefile.txt 
111111
111111
111111
111111
222222
222222
222222
222222

合并HDFS上的小文件

如果需要合并HDFS上的某个目录下有很多小文件,可以尝试使用下面的命令:

[liuxiaowen@dev ~]$ hadoop fs -cat hdfs://cdh5/tmp/lxw1234/*.txt | hadoop fs -appendToFile - hdfs://cdh5/tmp/hdfs_largefile.txt
[liuxiaowen@dev ~]$ hadoop fs -cat hdfs://cdh5/tmp/hdfs_largefile.txt
111111
111111
111111
111111
222222
222222
222222
222222

注意:这种处理方法在数据量非常大的情况下可能不太适合,最好使用MapReduce来合并。

华丽的分割线:您可以关注 lxw的大数据田地 ,或者 加入邮件列表 ,随时接收博客更新的通知邮件。

 

 

如果觉得本博客对您有帮助,请 赞助作者

转载请注明:lxw的大数据田地 » 合并HDFS和本地文件系统中的小文件

喜欢 (13)
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(4)个小伙伴在吐槽
  1. 多谢,文章很有含量。由于hadoop小文件太多,导致了map task实在太多非常耗时的说!
    修仙途道2016-01-12 14:53 回复
  2. 本想在HDFS上合并,但是1.2.1不支持appendToFile
    修仙途道2016-01-12 15:00 回复
  3. 需要注意一点的就是hadoop fs -getmerge /output/* 这样在1.x的时候是不会再本地生成文件的,直接写成/output/就行了 :razz:
    修仙途道2016-01-12 15:18 回复
  4. 合并hdfs上的小文件可以用 FileUtil.copyMerge()的方法,不过需要写程序 参考链接 http://blog.csdn.net/t1dmzks/article/details/62891640
    time漫步2017-04-18 17:22 回复