【问题标题】:Distributed file processing in Hadoop?Hadoop中的分布式文件处理?
【发布时间】:2015-08-05 08:19:01
【问题描述】:

我有大量压缩的 tar 文件,其中每个 tar 本身包含多个文件。我想提取这些文件,我想使用 hadoop 或类似的技术来加速处理。有解决这类问题的工具吗?据我所知,hadoop 和 spark 或 flink 等类似框架不直接使用文件,也不让您直接访问文件系统。我还想对提取的文件进行一些基本的重命名并将它们移动到适当的目录中。

我可以创建一个创建所有 tar 文件列表的解决方案。然后将该列表传递给映射器,单个映射器从列表中提取一个文件。这是一个合理的方法吗?

【问题讨论】:

  • 您可能必须为 Hadoop、Flink 或 Spark 编写自定义输入格式来实现这一点。在 InputFormat 代码中,您可以按照自己的方式处理文件。

标签: hadoop apache-spark batch-processing apache-flink


【解决方案1】:

可以指示 MapReduce 使用输入格式,其中每个 Mapper 的输入是单个文件。 (来自https://code.google.com/p/hadoop-course/source/browse/HadoopSamples/src/main/java/mr/wholeFile/WholeFileInputFormat.java?r=3

public class WholeFileInputFormat extends FileInputFormat<NullWritable, BytesWritable> {

  @Override
  protected boolean isSplitable(JobContext context, Path filename) {
    return false;
  }

  @Override
  public RecordReader<NullWritable, BytesWritable> createRecordReader(
    InputSplit inputSplit, TaskAttemptContext context) throws IOException,
  InterruptedException {
    WholeFileRecordReader reader = new WholeFileRecordReader();
    reader.initialize(inputSplit, context);
    return reader;
  }
}

然后,在你的mapper中,你可以使用Apache commons compress library解压tar文件https://commons.apache.org/proper/commons-compress/examples.html

您不需要将文件列表传递给 Hadoop,只需将所有文件放在单个 HDFS 目录中,并将该目录用作您的输入路径。

【讨论】:

  • 这听起来是个不错的解决方案。我会努力实现的。
  • 如果 tar 很少而且很大,那么少量的 mapper 将成为性能瓶颈
  • 问题说明“我有大量压缩的 tar 文件”
  • 这就是我想知道的,什么是 OP 理解中的“大”
  • 可能更好的办法是使用一个作业解压缩 jars 和第二个作业来处理解压文件
【解决方案2】:

Distcp 将文件从一个地方移动到另一个地方,您可以查看它的文档,但我认为它不提供任何解压缩或解压缩功能?如果文件大于主内存,您可能会遇到一些内存不足的错误。 8gb对于一个Hadoop集群来说不是很大,你有几台机器?

【讨论】:

  • 我不认为我可以使用distcp,但它的功能应该与我的需求相似。我正在研究它的源代码(我还不完全理解它),似乎映射器接收输入文件名和输入文件的状态作为键/值并执行复制。但也许你是对的,我应该只处理整个打开的文件。
  • 好的,我认为 distcp 创建了一个要复制的文件和目录的列表。
猜你喜欢
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多