我正在学习hadoop,首先 HDFS
以及 MapReduce
. 我理解了 HDFS
以及 MapReduce
.
有一点我无法理解,我将在下面解释:
大数据集-->作为块存储在hdfs中,例如b1、b2、b3。
现在,当我们运行mr作业时,每个Map器在单个块上工作(为了简单起见,假设一个Map器处理一个数据块)
1个Map器==>处理1个块
我还看到这个街区被分成 Records
对于给定的块,为该块(数据)中的每个记录调用相同的Map器。
但究竟什么是 Record
?
对于给定的块,因为它必须被“分解”为 records
,该块如何被分解成记录,以及记录的组成部分。
在大多数示例中,我看到一条记录是由新行分隔的整行。
我的疑问是什么决定了某些东西可以作为记录处理的“条件”基础。
我知道hadoop中有很多inputformat,但我的问题是什么条件决定了某个东西被视为记录。
谁能帮我用简单的话来理解这一点。
2条答案
按热度按时间unftdfkk1#
你需要理解
RecordReader
.Block
数据存储在磁盘上的硬绑定字节数。所以,如果说一个256MB的数据块,就意味着磁盘上有256MB的数据块。Map器从块中获取1条记录,对其进行处理;还有下一个——定义记录的责任就在你身上RecordReader
.什么是唱片?如果我把块比作
table
,record
是表中的一行。现在想想这个——如何在mapper中处理一个块数据,毕竟不能在一个随机字节的数据上写逻辑。从Map器的Angular 来看,只有当输入数据“有意义”或具有数据的结构或逻辑块(从Map器逻辑的Angular 来看)时,才能有逻辑。这个逻辑块称为
record
. 默认情况下,一行数据是默认实现中的逻辑块。但有时,将一行数据作为逻辑数据是没有意义的。有时,根本就没有线(假设它是mp4类型的数据,Map器需要一首歌曲作为输入)!假设您在mapper中有一个要求,需要同时处理5条连续的线。在这种情况下,您需要覆盖
RecordReader
实现了5行one record
一起交给制图员。编辑1
你们的理解是正确的
inputformat:打开数据源并将数据分成块
recordreader:实际上将块解析为键/值对。
对于
JavaDoc
输入格式错误inputformat描述map reduce作业的输入规范。map reduce框架依赖于作业的inputformat来:
将输入文件拆分为逻辑InputSplit,然后将每个逻辑InputSplit分配给一个单独的Map器。
提供recordreader实现,用于从逻辑inputsplit中提取输入记录以供Map程序处理。
从第一点开始,一个块并不是Map器的精确输入;这是一个相当复杂的问题
InputSplit
. e、 g.考虑一个zip文件(用GZIP
). zip文件是ZipEntry
(每个压缩文件)。从处理的Angular 来看,zip文件是不可拆分的。意思是InputSplit
对于一个zip文件,它将由几个块组成(实际上是用来存储特定zip文件的所有块)。这是以牺牲数据局部性为代价的。i、 即使zip文件已损坏并存储在HDFS
在不同的节点,整个文件将被移动到运行Map器的节点。这个ZipFileInputFormat
提供默认的记录读取器实现ZipFileRecordReader
,它的逻辑是ZipEntry
(压缩文件)的Map器键值。hof1towb2#
你已经基本上自己回答了这个问题,希望我的解释能有所帮助。
记录是一个特定于mapreduce的术语,用于键值对。一个mapreduce作业可以有几种不同类型的记录-在wordcount示例中,Map器输入记录类型是
<Object, Text>
,Map器输出/还原器输入记录类型为<Text, IntWritable>
,并且减速器输出记录类型也是<Text, IntWritable>
.inputformat负责定义如何将块拆分为单个记录。正如您所确定的,有许多inputformat,每个inputformat都负责实现管理如何将数据拆分为记录的代码。
块本身没有记录的概念,因为在Map器读取数据之前,不会创建记录。可以有两个单独的mapreduce作业,它们读取相同的块,但使用不同的输入格式。就hdfs而言,它只是存储一个大数据块。
没有“条件”来定义如何分割数据-您可以创建自己的inputformat并根据需要分割数据。