【问题标题】:Number of Mappers映射器数量
【发布时间】:2015-09-09 21:16:38
【问题描述】:

我在 hdfs 上有 4 个文件。

1.txt、2.txt、3.txt 和 4.txt。在这 4 个文件中,前 3 个文件的数据内容如下,4.txt 文件为空。映射器如何执行。

映射器数 = 输入拆分数。

我的问题是,所有这些文件是存储在一个 64 MB 块还是 4 个不同的块中?因为每个文件的数据小于 64MB。

1.txt 这是文本文件 1

2.txt 这是文本文件2

3.txt 这是文本文件 3

4.txt“空”

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    它将存储在 4 个不同的块中,除非您将其打包并存储在 HAR 文件中。这个概念是,如果您的文件大小大于块大小,那么您的单个文件将被拆分并存储在不同的块中,否则如果它小于块大小,那么文件将独立存储在不同的块中。但是,即使块大小为 64 MB 或更大,它也不会使用超过实际文件大小。引用权威指南:

    HDFS 存储小文件的效率很低,因为每个文件都存储在一个块中,而块元数据由名称节点保存在内存中。因此,大量的小文件会占用 namenode 上的大量内存。

    所以在你的情况下它仍然会使用 4 个映射器,因为我们有 4 个块。

    【讨论】:

      【解决方案2】:

      默认情况下,HDFS 不会将小文件合并到一个块中。 HDFS 会将所有文件存储在单独的块中,因此您的 HDFS 将使用 4 个块来存储您的 4 个文件(每个文件都小于 dfs.block.size)。这并不意味着 HDFS 将占用 4*64MB 的大小。因此您的 MR 作业将产生 4 个 Mapper 来读取所有文件

      理想情况下,您不应该在 HDFS 上存储小文件,因为这会增加 Namenode 的负载。

      您可以在上传到 HDFS 之前使用 unix 实用程序合并文件,或将文件转换为序列文件或编写 pig 脚本/hive 脚本/mapreduce 将所有小文件合并为更大的文件。 HDFS 上的小文件在这里描述得很好:http://blog.cloudera.com/blog/2009/02/the-small-files-problem/

      【讨论】:

        猜你喜欢
        • 2014-06-09
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-14
        • 2013-11-03
        • 1970-01-01
        相关资源
        最近更新 更多