我有多个文本文件。 它们的总大小超过了我可用的最大磁盘大小(~1.5TB)
spark程序从HDFS读取单个输入文本文件。所以我需要将这些文件合并为一个。 (我无法重写程序代码。我只获得了* .jar文件来执行)
HDFS有这样的能力吗?我怎样才能做到这一点?
答案 0 :(得分:1)
我从您的问题中了解到您希望将多个文件连接成一个文件。这是一个解决方案,可能不是最有效的方法,但它的工作原理。假设您有两个文件:file1
和file2
,并且您希望合并文件为ConcatenatedFile
这是脚本。
hadoop fs -cat /hadoop/path/to/file/file1.txt /hadoop/path/to/file/file2.txt | hadoop fs -put - /hadoop/path/to/file/Concatenate_file_Folder/ConcatenateFile.txt
希望这有帮助。
答案 1 :(得分:1)
HDFS本身并不提供此类功能。所有开箱即用的功能(例如hdfs dfs -text *
带管道或FileUtil的复制方法)都使用您的客户端服务器传输所有数据。
根据我的经验,我们总是使用自己编写的MapReduce作业以分布式方式合并HDFS中的许多小文件。
所以你有两个解决方案:
关于解决方案#2:有一个简单的项目FileCrush,用于组合HDFS中的文本或序列文件。它可能适合你,检查它。
使用示例:
hadoop jar filecrush-2.0-SNAPSHOT.jar crush.Crush -Ddfs.block.size=134217728 \
--input-format=text \
--output-format=text \
--compress=none \
/input/dir /output/dir 20161228161647
在没有这些选项的情况下运行它有问题(特别是-Ddfs.block.size和输出文件日期前缀20161228161647),所以请确保正确运行它。
答案 2 :(得分:1)
你可以做猪工作:
A = LOAD '/path/to/inputFiles' as (SCHEMA);
STORE A into '/path/to/outputFile';
执行 hdfs cat然后将其放回到hdfs意味着,所有这些数据都会在客户端节点中处理并降低网络性能