BlockSize 和大数据
BlockSize and big data
每个人都知道 Hadoop 对小文件的处理很差,因为它必须使用大量的映射器。
但是比块大小大一点的大文件呢。
举个例子,假设 hdfs 块大小为 128mb,hadoop 接收 126mb 到 130mb 之间的文件。
126mb 到 128mb 之间的文件适合存储在 hadoop 中,但是 129mb-130mb 的文件呢,hadoop 需要 2 个映射器才能读取这些文件吗?除了使 hdfs 块变大之外,如何在 hadoop 中处理这个问题?
提前致谢:)
跨越 128Mb 边界后,您需要第二个区块。
例如,文件 130mb 将显示为 2 个块:第一个 128,第二个是文件的其余部分
HDFS 是用来处理大文件的。假设您有一个 1000Mb 的文件。对于 4k 块大小,您必须发出 256,000 个请求才能获取该文件(每个块 1 个请求)。在 HDFS 中,这些请求通过网络传输并带来大量开销。每个请求都必须由名称节点处理,以确定可以在何处找到该块。那是很多流量!如果您使用 64Mb 块,请求数量将减少到 16,大大降低名称节点上的开销和负载成本。
我觉得你对HDFS和mapreduce的关系有误解。 HDFS 是底层文件系统,mapreduce 是计算框架。 HDFS 本身根本不使用 mapreduce 框架进行操作。 Mapreduce 作业在查找其作业 jar、写入临时处理数据、拉取文件以进行处理或任何其他文件操作时使用 HDFS 作为文件系统。 mappers/reducers 的数量在作业提交时设置,由提交作业的 mapreduce 客户端决定。
如果您有一个 500MB 的文件被分成 4 个 128MB 的块并且您想要 运行 一个读取文件并输出每个出现的单词的计数的字数统计 mapreduce 作业,并且您 运行 它有 4 个映射器和 2 个缩减器,您最终将在每个映射任务中处理 4 x 128MB 块中的一个。该作业将与 HDFS namenode 通信以请求文件,namenode 将响应构建文件所需的所有块,并给出块的位置。映射阶段将从它们的数据节点读取这些文件并在处理它们后生成 4 个文件(例如 part-0000、part-0001、part-0002、part-0003),reduce 阶段将对每个文件中的单词进行排序和统计,然后给出它的最终输出。
您不需要仅仅因为您的文件大于块大小就使块变大。这违背了分布式文件系统或任何现有文件系统的目的。 HDFS(以及我使用过的所有文件系统)可以有一个 8GB 的文件——它仍然会将它分成 128MB 的块或任何你设置的块大小。
映射器的数量取决于框架计算的输入分割数,而不是构成文件的块数。输入拆分可以超过一个块。在这种情况下,超过块大小的数据仍将由单个映射任务处理。输入拆分是计算的逻辑单元(通过映射器),而块是存储的逻辑单元(通过 HDFS)。
也就是说,如果文件有第二个输入拆分,则需要第二个映射器。
每个人都知道 Hadoop 对小文件的处理很差,因为它必须使用大量的映射器。 但是比块大小大一点的大文件呢。
举个例子,假设 hdfs 块大小为 128mb,hadoop 接收 126mb 到 130mb 之间的文件。
126mb 到 128mb 之间的文件适合存储在 hadoop 中,但是 129mb-130mb 的文件呢,hadoop 需要 2 个映射器才能读取这些文件吗?除了使 hdfs 块变大之外,如何在 hadoop 中处理这个问题?
提前致谢:)
跨越 128Mb 边界后,您需要第二个区块。
例如,文件 130mb 将显示为 2 个块:第一个 128,第二个是文件的其余部分
HDFS 是用来处理大文件的。假设您有一个 1000Mb 的文件。对于 4k 块大小,您必须发出 256,000 个请求才能获取该文件(每个块 1 个请求)。在 HDFS 中,这些请求通过网络传输并带来大量开销。每个请求都必须由名称节点处理,以确定可以在何处找到该块。那是很多流量!如果您使用 64Mb 块,请求数量将减少到 16,大大降低名称节点上的开销和负载成本。
我觉得你对HDFS和mapreduce的关系有误解。 HDFS 是底层文件系统,mapreduce 是计算框架。 HDFS 本身根本不使用 mapreduce 框架进行操作。 Mapreduce 作业在查找其作业 jar、写入临时处理数据、拉取文件以进行处理或任何其他文件操作时使用 HDFS 作为文件系统。 mappers/reducers 的数量在作业提交时设置,由提交作业的 mapreduce 客户端决定。
如果您有一个 500MB 的文件被分成 4 个 128MB 的块并且您想要 运行 一个读取文件并输出每个出现的单词的计数的字数统计 mapreduce 作业,并且您 运行 它有 4 个映射器和 2 个缩减器,您最终将在每个映射任务中处理 4 x 128MB 块中的一个。该作业将与 HDFS namenode 通信以请求文件,namenode 将响应构建文件所需的所有块,并给出块的位置。映射阶段将从它们的数据节点读取这些文件并在处理它们后生成 4 个文件(例如 part-0000、part-0001、part-0002、part-0003),reduce 阶段将对每个文件中的单词进行排序和统计,然后给出它的最终输出。
您不需要仅仅因为您的文件大于块大小就使块变大。这违背了分布式文件系统或任何现有文件系统的目的。 HDFS(以及我使用过的所有文件系统)可以有一个 8GB 的文件——它仍然会将它分成 128MB 的块或任何你设置的块大小。
映射器的数量取决于框架计算的输入分割数,而不是构成文件的块数。输入拆分可以超过一个块。在这种情况下,超过块大小的数据仍将由单个映射任务处理。输入拆分是计算的逻辑单元(通过映射器),而块是存储的逻辑单元(通过 HDFS)。
也就是说,如果文件有第二个输入拆分,则需要第二个映射器。