我的hdfs中有几个压缩文件(.tar.gz),其中包含不相关的tsv文件(类似于下面的列表)。我想以编程方式解压这些文件夹,可能利用mpp架构(例如hadoop或spark)并将它们保存到hdfs中。
- browser.tsv
- connection_type.tsv
- country.tsv
- color_depth.tsv
- javascript_version.tsv
- languages.tsv
- operating_systems.tsv
- plugins.tsv
- referrer_type.tsv
- resolution.tsv
- search_engine.tsv
到目前为止,我只能想出一个bash脚本,从hdfs下载每个文件,untars并将文件夹保存回hdfs。我甚至可以并行脚本,但我也不满意的解决方案。
谢谢:)
编辑:
很有意思的是,我们可以通过以下任何一种方法来解决问题:
Spark2.4.5
Hive2.3.6
清管器0.17.0
hadoop 2.8.5版本
2条答案
按热度按时间kcrjzv8t1#
我能看到的唯一方法是迭代每个文件,然后用spark读取,然后用spark本身将其写回hdfs,不压缩。类似这样的东西(使用pyspark):
注意:我还没有测试过这段代码,在hdfs和tar文件中复制它很复杂,可能需要添加一些额外的参数来解析tar文件,但我希望这个想法很清楚。
imho不可能在一次迭代中同时读取所有这些文件,因为它们具有不同的结构(以及它们表示的不同数据)。
jw5wzhpr2#
我终于找到了一个解决我的问题的方法,它由一个只支持mapper的hadoop作业组成。每个Map程序在tar文件夹中获取一个未压缩的文件,并使用
MultipleOutput
来自hadoop的实用程序。此外,我实现了一个自定义的不可拆分hadoop输入格式来处理tarball提取,称为
TarballInputFormat
.tarballrecordreader处理原始tarball文件中所有文件的提取。
每个tarball都将被提取出来,通过将每个文件相对于其父文件夹写入来保持原始结构。在这个解决方案中,我们使用Map器同时读取和写入提取的文件。这显然性能较差,但对于那些需要将提取的文件保存为原始格式(有序输出)的人来说,这可能是一个很好的折衷方案。另一种方法可以利用reducer将每个提取的文件行写入文件系统,这将以一致性(无序文件内容)为代价增加写入吞吐量。
输出文件夹如下所示: