将多个文本文件连接到HDFS中的一个非常大的文件中

时间:2016-12-29 13:06:35

标签: hadoop

我有多个文本文件。 它们的总大小超过了我可用的最大磁盘大小(~1.5TB)

spark程序从HDFS读取单个输入文本文件。所以我需要将这些文件合并为一个。 (我无法重写程序代码。我只获得了* .jar文件来执行)

HDFS有这样的能力吗?我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

我从您的问题中了解到您希望将多个文件连接成一个文件。这是一个解决方案,可能不是最有效的方法,但它的工作原理。假设您有两个文件:file1file2,并且您希望合并文件为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中的许多小文件。

所以你有两个解决方案:

  1. 编写自己的简单MapReduce / Spark作业,将文本文件与 你的格式。
  2. 找到已经实现的解决方案 目的。
  3. 关于解决方案#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意味着,所有这些数据都会在客户端节点中处理并降低网络性能