Blocks如何转换为Records以及Hadoop中Record的定义到底是什么

How Blocks gets converted into Records and what exactly is the definition of Record in Hadoop

我正在学习 Hadoop,并从 HDFSMapReduce 开始。我了解 HDFSMapReduce.

的基础知识

有一点我不太理解,下面解释一下:

大数据集 --> 以块的形式存储在 HDFS 中,例如 B1、B2、B3。

现在,当我们 运行 一个 MR 作业时,每个映射器都在一个块上工作(为简单起见,假设 1 个映射器处理一个数据块)

1 个映射器 ==> 处理 1 个块

我还读到该块被划分为 Records,对于给定的块,该块(数据)中的每个记录都调用相同的映射器。

但是 Record 到底是什么?

对于给定的块,由于它必须 "broken" 分解为 records,该块如何分解为记录以及记录的组成部分。

在大多数示例中,我看到一条记录是由新行分隔的整行。

我的疑问是什么决定了某些东西可以被视为记录的 "conditions" 基础。

我知道 Hadoop 中有很多 InputFormat,但我的问题是决定某些东西被视为记录的条件是什么。

谁能用简单的话帮我理解一下。

你基本上已经自己回答了这个问题,所以希望我的解释能对你有所帮助。

一条记录是 MapReduce-specific 项对应 key-value 对。单个 MapReduce 作业可以有几种不同类型的记录 - 在 wordcount 示例中,映射器输入记录类型为 <Object, Text>,映射器 output/reducer 输入记录类型为 <Text, IntWritable>,reducer 输出记录类型也是 <Text, IntWritable>.

InputFormat 负责定义如何将块拆分为单独的记录。如您所见,有许多 InputFormat,每个 InputFormat 都负责实现管理将数据拆分为记录的方式的代码。

块本身没有记录的概念,因为在映射器读取数据之前不会创建记录。您可以有两个单独的 MapReduce 作业,它们读取同一个块但使用不同的 InputFormats。就 HDFS 而言,它只是存储一个大数据块。

没有 "condition" 定义数据的拆分方式 - 您可以创建自己的 InputFormat 并根据需要拆分数据。

你需要理解RecordReader的概念。

Block 是数据存储在磁盘上的硬限制字节数。因此,说一个 256 MB 的块,意味着磁盘上恰好有 256 MB 的数据。 映射器从块中获取 1 条记录,对其进行处理;并获得下一个 - 定义记录的责任在 RecordReader.

什么是记录?如果我将块类比为 table,则 record 是 table 中的一行。 现在想想这个——如何在映射器中处理块数据,毕竟你不能在随机数据字节上编写逻辑。从映射器的角度来看,如果输入数据“有意义”或具有结构或逻辑数据块(从映射器逻辑的角度来看),您只能有一个逻辑。

该逻辑块称为 record。默认情况下,一行数据是默认实现中的逻辑块。但有时,将一行数据作为逻辑数据是没有意义的。有时,根本没有线(假设它是 MP4 类型的数据,映射器需要一首歌曲作为输入)!

假设您在映射器中有一个要求,需要同时处理 5 个连续的行。在这种情况下,您需要使用一个实现来覆盖 RecordReader,其中 5 行是 one record 并一起传递给映射器。

编辑 1

你的理解是对的

InputFormat: opens the data source and splits the data into chunks

RecordReader: actually parses the chunks into Key/Value pairs.

对于InputFormat的JavaDoc

InputFormat 描述 input-specification 用于 Map-Reduce 作业。 Map-Reduce 框架依赖作业的 InputFormat 来:

  • Split-up 输入文件到 逻辑 InputSplits,然后将每个文件分配给一个单独的 Mapper。
  • 提供用于从逻辑 InputSplit 中提取输入记录以供 Mapper 处理的 RecordReader 实现。

从第一点开始,一个块正好是映射器的输入;它更像是一个 InputSplit。例如考虑一个 Zip 文件(用 GZIP 压缩)。 Zip 文件是 ZipEntry(每个压缩文件)的集合。从处理的角度来看,zip 文件是 non-splitable。这意味着,Zip 文件的 InputSplit 将包含几个块(实际上是用于存储特定 ZIP 文件的所有块)。这是以牺牲数据局部性为代价的。即,即使 zip 文件已损坏并存储在不同节点的 HDFS 中,整个文件也会移动到映射器的节点 运行。 ZipFileInputFormat 提供默认记录 reader 实现 ZipFileRecordReader,它具有为映射器 key-value.[=28= 读取一个 ZipEntry(压缩文件)的逻辑]