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

时间:2014-12-31 07:26:48

标签: hadoop

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

在这种情况下,当必须创建customRecordReader来读取bigfile时,请解释使用FileSplit的原因,当bigfile在文件加载过程中已经拆分并以分割块的形式提供时。

3 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:0)

HDFS将块中的文件拆分以用于存储目的,并且可以基于实际文件大小将数据拆分为多个块。 因此,如果您正在编写customRecordReader,则必须告诉您的记录阅读器从哪里开始和停止读取块,以便您可以处理数据。从每个块的开头读取数据或在每个块结束时停止读取可能会给映射器提供不完整的记录。

答案 2 :(得分:0)

您正在比较苹果和橘子。 FileSplit的全名是org.apache.hadoop.mapred.FileSplit,强调 mapred 。是MapReduce的组合,而不是文件系统。 FileSplit只是InputSplit的专业化:

  

InputSplit表示单个Mapper要处理的数据。

您正在不必要地添加讨论HDFS概念,例如块。 MapReduce与HDFS无关(它们具有协同作用,真实)。 MapReduce可以在许多其他文件系统上运行,如本地原始,S3,Azure blob等。

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