阻止和拆分 HDFS

  1. HDFS 中的块大小和块 :HDFS 具有在加载文件时以块的形式存储数据的概念。块是 HDFS 中数据的物理分区(或者在任何其他文件系统中)。

    无论何时将文件加载到 HDFS 上,它都会被物理地分割(是的,文件被分割)到称为块的不同部分。块数取决于 hdfs-site.xmldfs.block.size 的值

    理想情况下,块大小设置为较大的值,例如 64/128/256 MB(与普通 FS 中的 4 KB 相比)。Hadoop 2.x 的大多数发行版上的默认块大小值为 128 MB。更大块大小的原因是因为 Hadoop 用于处理 PetaBytes 数据,每个文件的范围从几百兆字节到 TeraBytes。

    比如说你有一个大小为 1024 MB 的文件。如果你的块大小为 128 MB,你将获得 8 块 128 MB 的块。这意味着你的 namenode 将需要存储 8 x 3 = 24 文件的元数据(3 是复制因子)。

    考虑块大小为 4 KB 的相同方案。它将导致 1GB / 4KB = 250000 块,这将需要 namenode 为 750000 块保存仅 1GB 文件的元数据。由于所有这些与元数据相关的信息都存储在内存中,因此较大的块大小是首选,以便在 NameNode 上节省额外的负载。

    同样,块大小不会设置为像 1GB 等极高的值,因为理想情况下,为每个数据块启动 1 个映射器。因此,如果将块大小设置为 1GB,则可能会失去并行性,这可能会导致整体吞吐量降低。

2.) HDFS 中的分割大小 :Hadoop 处理中的分割是数据的逻辑块。当文件被分成块时,hadoop 不尊重任何文件 bopundaries。它只是根据块大小拆分数据。假如你有一个 400MB 的文件,有 4 行,每行有 100MB 的数据,你将得到 3 块 128 MB x 316 MB x 1。但是当在数据的 prceossing 中计算输入分割时,记住文件/记录边界,在这种情况下,如果你使用 NLineInputFormat,我们将有 4 个输入分割,每个 100 MB。

也可以使用属性 mapreduce.input.fileinputformat.split.maxsize 为每个作业设置分割大小

SO 和 Splits 的一个非常好的解释可以在这个 SO 答案 /中找到