【问题标题】:How to make Hadoop Map Reduce process multiple files in a single run ?如何使 Hadoop Map Reduce 一次运行处理多个文件?
【发布时间】:2014-11-02 10:19:20
【问题描述】:

对于 Hadoop Map Reduce 程序,当我们通过执行此命令 $hadoop jar my.jar DriverClass input1.txt hdfsDirectory 运行它时。如何使 Map Reduce 在一次运行中处理多个文件( input1.txt 和 input2.txt )?

【问题讨论】:

  • 您是指输入*.txt 还是少数文件,如 1.txt、2,txt?
  • 我的意思是 1.txt,2.txt,.....
  • @user2192023 有没有对你有用的答案?

标签: hadoop


【解决方案1】:

这样:

hadoop jar my.jar DriverClass hdfsInputDir hdfsOutputDir 

在哪里

  • hdfsInputDir 是 HDFS 上存储输入文件的路径(即 input1.txtinput2.txt 的父目录)
  • hdfsOutputDir 是 HDFS 上将存储输出的路径(在运行此命令之前它不应该存在)。

请注意,在运行此命令之前,应将您的输入复制到 HDFS 上。 要将其复制到 HDFS,您可以运行:

hadoop dfs -copyFromLocal localPath hdfsInputDir

【讨论】:

    【解决方案2】:

    这是您的小文件问题。每个文件映射器都会运行。

    小文件是明显小于 HDFS 块大小(默认 64MB)的文件。如果您要存储小文件,那么您可能会有很多文件(否则您不会转向 Hadoop),问题是 HDFS 无法处理大量文件。

    根据经验,HDFS 中的每个文件、目录和块都表示为 namenode 内存中的一个对象,每个对象占用 150 个字节。因此,1000 万个文件,每个文件使用一个块,将使用大约 3 GB 的内存。扩大到这个水平是当前硬件的一个问题。当然十亿个文件是不可行的。

    解决方案

    HAR 文件

    Hadoop 存档(HAR 文件)在 0.18.0 中被引入 HDFS,以缓解大量文件对 namenode 内存造成压力的问题。 HAR 文件通过在 HDFS 之上构建分层文件系统来工作。使用 hadoop archive 命令创建 HAR 文件,该命令运行 MapReduce 作业以将正在归档的文件打包到少量 HDFS 文件中。对于使用 HAR 文件系统的客户端来说,没有任何改变:所有原始文件都是可见且可访问的(尽管使用 har:// URL)。但是,HDFS 中的文件数量有所减少。

    序列文件

    对“小文件问题”问题的通常回答是:使用 SequenceFile。这里的想法是使用文件名作为键,文件内容作为值。这在实践中非常有效。回到 10,000 个 100KB 的文件,您可以编写一个程序将它们放入单个 SequenceFile,然后您可以在 SequenceFile 上以流式方式(直接或使用 MapReduce)处理它们。还有一些奖金。 SequenceFile 是可拆分的,因此 MapReduce 可以将它们分成块并独立地对每个块进行操作。与 HAR 不同,它们也支持压缩。在大多数情况下,块压缩是最佳选择,因为它会压缩多条记录的块(而不是每条记录)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2017-10-25
      • 2016-11-16
      相关资源
      最近更新 更多