在HDFS中将小文件合并成单个文件

3
在一个HDFS群集中,我每天都会收到多个文件,这些文件可以分为以下三种类型:
1) product_info_timestamp 2) user_info_timestamp 3) user_activity_timestamp 接收到的文件数量可能是任意的,但它们只属于这三个类别之一。
我想将属于同一类别的所有文件合并成一个文件(在检查它们是否小于100MB后)。例如:名为product_info_* 的三个文件应该合并成一个名为product_info的文件。
我该如何实现这个目标?

Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange更适合提问。 - jww
3个回答

4
您可以使用getmerge来实现此操作,但结果将存储在本地节点(边缘节点)中,因此您需要确保在那里有足够的空间。
hadoop fs -getmerge /hdfs_path/product_info_* /local_path/product_inf

你可以使用put命令将它们移回到hdfs

hadoop fs -put  /local_path/product_inf /hdfs_path

谢谢,我会尝试的 :) - user3829376
我们能否使用MapReduce来完成这个任务,并将其馈送给Oozie,以便它可以每天自动运行? - user3829376
不知道如何在MapReduce中实现,但您可以在oozie中运行脚本。该脚本可以执行所需的操作或任何其他操作。如果这个答案有帮助,请随意点赞或接受它,以便其他有相同问题的用户可以轻松找到它。 - SCouto
我刚试了一下,这似乎是一个简单的解决方案。那么对于小文件问题,所有大惊小怪的事情是什么呢?getmerge 是一个较新的命令,所以这是传统吗?@Scouto - thebluephantom

1
你可以使用Hadoop归档(.har文件)或序列文件(sequence file)。使用起来非常简单-只需搜索“Hadoop归档”或“序列文件”。

1

以下是与@SCouto建议类似的一组命令

hdfs dfs -cat /hdfs_path/product_info_* > /local_path/product_info_combined.txt

hdfs dfs -put /local_path/product_info_combined.txt /hdfs_path/


尝试使用每天1TB的数据,需要数小时才能完成。最好有一个纯HDFS解决方案,而不是将数据复制到本地节点。 - ulkas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接