Hadoop:为什么在RecordReader实现中使用FileSplit



在Hadoop中,考虑一个场景,如果一个大文件已经加载到hdfs文件系统中,使用hdfs dfs put或hdfs dfs CopyFromLocal命令,大文件将被拆分为块(64 MB)。

在这种情况下,当必须创建一个自定义记录阅读器来读取大文件时,请解释使用FileSplit的原因,当大文件在文件加载过程中已经拆分并以拆分块的形式可用时。

请解释使用FileSplit的原因,当大文件在文件加载过程中已经拆分并以拆分块的形式可用时。

我想你可能会对FileSplit到底是什么感到困惑。 假设您的大文件128MB并且您的块大小为 64MB大文件将占用两个块。 你已经知道了。 当文件在MapReduce中处理时,您还将(通常)得到两个FileSplit。 每个FileSplit都映射到之前加载的块。

请记住,FileSplit类不包含文件的任何实际数据。 它只是指向文件中数据的指针。

HDFS将文件拆分为块以进行存储,并可能根据实际文件大小将数据拆分为多个块。因此,如果您正在编写自定义记录阅读器,则必须告诉您的记录读取器从何处开始和停止读取块,以便您可以处理数据。从每个块的开头读取数据或在每个块的末尾停止读取可能会给您的映射器提供不完整的记录。

你正在比较苹果和橙子。FileSplit的全称是org.apache.hadoop.mapred.FileSplit,强调mapred。是一个MapReduce的约束,而不是一个文件系统的约束。 FileSplit只是InputSplit的专业化:

输入拆分表示要由单个映射器处理的数据。

你不必要地在讨论中增加了像块这样的HDFS概念。MapReduce与HDFS无关(它们一起具有协同作用,这是真的)。MapReduce可以在许多其他文件系统上运行,如本地原始文件系统,S3,Azure blobs等。

从你的角度来看,FileSplit是否碰巧与HDFS块重合纯粹是巧合(这不是巧合,因为作业被拆分以利用HDFS块局部性,但这是一个细节)。

最新更新