Hadoop面试题之MapReduce


什么是MapReduce?
它是一种框架或编程模型,用于使用分布式编程在计算机集群上处理大型数据集。

什么是“Map”和“Reduce”?
“Maps”和“Reduces”是在 HDFS 中解决查询的两个阶段。'Map'负责从输入位置读取数据,并根据输入类型生成一个键值对,即本地机器的中间输出。'Reducer'负责处理从输入位置接收到的中间输出映射器并生成最终输出。

Map映射器的四个基本参数是什么?
映射器的四个基本参数是 LongWritable、text、text 和 IntWritable。前两个代表输入参数,后两个代表中间输出参数。
 
Reducer的四个基本参数是什么?
一个reducer的四个基本参数是Text、IntWritable、Text、IntWritable,前两个代表中间输出参数,后两个代表最终输出参数。
 
Master和输出类是做什么的?
Master 被定义为更新 Master 或作业跟踪器,输出类被定义为将数据写入输出位置。
 
默认情况下 MapReduce 中的输入类型/格式是什么?
默认情况下,MapReduce 中的类型输入类型是“文本”。
 
是否必须在 MapReduce 中设置输入和输出类型/格式?
不,在 MapReduce 中设置输入和输出类型/格式不是强制性的。默认情况下,集群将输入和输出类型作为“文本”。
 
文本输入格式有什么作用?
在文本输入格式中,每一行都会创建一个行对象,即一个十六进制数。键被认为是一个行对象,值被认为是一个整行文本。这就是映射器处理数据的方式。映射器将接收作为“LongWritable”参数的“键”和作为“文本”参数的值。
 
工作 conf 类有什么作用?
MapReduce 需要在逻辑上分离运行在同一集群上的不同作业。“Job conf class”有助于进行工作级别设置,例如在真实环境中声明工作。建议作业名称应具有描述性并代表正在执行的作业类型。
 
conf.setMapper 类有什么作用?
Conf.setMapperclass 设置映射器类和所有与映射作业相关的东西,例如读取数据并从映射器中生成键值对。
 
排序和洗牌有什么作用?
排序和改组负责创建唯一键和值列表。在一个位置制作相似键称为排序。映射器的中间输出被排序并发送到reducer的过程称为混洗。
 
 拆分有什么作用?
在将数据从硬盘位置传输到映射方法之前,有一个称为“拆分方法”的阶段或方法。Split 方法将一块数据从 HDFS 拉到框架中。Split 类不写任何东西,而是从块中读取数据并将其传递给映射器。默认情况下,Split 由框架处理。拆分方法等于块大小,用于将块划分为一堆拆分。
 
如果我们的商品硬件存储空间较少,我们如何更改拆分大小?
如果我们的商品硬件存储空间较少,我们可以通过编写“自定义拆分器”来更改拆分大小。Hadoop 中有一个自定义特性,可以从 main 方法中调用。
 
MapReduce 分区器有什么作用?
MapReduce 分区器确保单个键的所有值都进入同一个reducer,从而允许在reducer上均匀分布地图输出。它通过确定哪个reducer负责特定键来将映射器输出重定向到reducer。
 
如何为Hadoop的其他数据处理工具有什么不同?
在 Hadoop 中,您可以根据需要增加或减少映射器的数量,而不必担心要处理的数据量。与可用的其他数据处理工具相比,这是并行处理的美妙之处。
 
我们可以重命名输出文件吗?
是的,我们可以通过实现多格式输出类来重命名输出文件。
 
为什么我们不能在映射器中进行聚合(加法)?为什么我们需要reducer
我们不能在映射器中进行聚合(加法),因为排序不是在映射器中完成的。排序只发生在reducer端。Mapper 方法初始化取决于每个输入拆分。在进行聚合时,我们将丢失前一个实例的值。对于每一行,一个新的映射器将被初始化。对于每一行, inputsplit 再次被划分到映射器中,因此我们没有对前一行值的跟踪。
 
什么是流媒体Streaming?
Streaming 是 Hadoop 框架的一个特性,它允许我们使用 MapReduce 以任何可以接受标准输入并可以产生标准输出的编程语言进行编程。它可以是 Perl、Python、Ruby,不一定是 Java。但是,MapReduce 中的自定义只能使用 Java 完成,而不能使用任何其他编程语言。
 
什么是合路器?
'Combiner' 是一个执行本地 reduce 任务的小型 reducer。它从特定节点上的映射器接收输入,并将输出发送到reducer。组合器通过减少需要发送到化简器的数据量来帮助提高 MapReduce 的效率。
 
HDFS 块和输入拆分有什么区别?
HDFS Block 是数据的物理分割,Input Split 是数据的逻辑分割。
 
在 TextInputFormat 中会发生什么?
在 TextInputFormat 中,文本文件中的每一行都是一条记录。键是行的字节偏移量,值是行的内容。
例如,键:LongWritable,值:文本。
 
您对 KeyValueTextInputFormat 了解多少?
在 KeyValueTextInputFormat 中,文本文件中的每一行都是一个“记录”。第一个分隔符分隔每一行。分隔符之前的所有内容都是键,分隔符之后的所有内容都是值。
例如,键:文本,值:文本。
 
你对 SequenceFileInputFormat 了解多少?
SequenceFileInputFormat 是一种用于读取序列文件的输入格式。键和值是用户定义的。它是一种特定的压缩二进制文件格式,经过优化,可将数据在一个 MapReduce 作业的输出和其他 MapReduce 作业的输入之间传递。
 
您对 NLineOutputFormat 了解多少?
NLineOutputFormat 将 'n' 行输入拆分为一个拆分。
 
Hadoop 中的 JobTracker 是什么?在 Hadoop 集群上运行多少个 JobTracker 实例?
JobTracker 是用于在 Hadoop 中提交和跟踪 MapReduce 作业的守护程序服务。在任何 hadoop 集群上只运行一个作业跟踪器进程。作业跟踪器在其自己的 JVM 进程上运行。在典型的生产集群中,它在单独的机器上运行。每个从节点都配置有作业跟踪器节点位置。JobTracker 是 Hadoop MapReduce 服务的单点故障。如果它出现故障,则所有正在运行的作业都将停止。Hadoop 中的 JobTracker 执行以下操作(来自 Hadoop Wiki:)
客户端应用程序将作业提交给作业跟踪器。
JobTracker 与 NameNode 对话以确定数据的位置
JobTracker 定位具有可用插槽的 TaskTracker 节点在数据处或附近
JobTracker 将工作提交给选定的 TaskTracker 节点。
TaskTracker 节点受到监控。如果他们没有足够频繁地提交心跳信号,他们将被视为失败并且工作被安排在不同的 TaskTracker 上。
TaskTracker 会在任务失败时通知 JobTracker。JobTracker 然后决定做什么:它可能会在别处重新提交作业,可能会将特定记录标记为要避免的内容,甚至可能会将 TaskTracker 列入不可靠的黑名单。
当工作完成时,JobTracker 更新其状态。
客户端应用程序可以轮询 JobTracker 以获取信息。
 
JobTracker 如何安排任务?
TaskTracker 通常每隔几分钟向 JobTracker 发送心跳消息,以确保 JobTracker 仍然活着。这些消息还通知 JobTracker 可用槽的数量,因此 JobTracker 可以随时了解集群中可以委派工作的位置。当 JobTracker 试图在 MapReduce 操作中寻找某个地方来安排任务时,它首先在托管包含数据的 DataNode 的同一台服务器上寻找一个空槽,如果没有,它在机器上寻找一个空槽同一个机架。
 
什么是 Hadoop 中的任务跟踪器?有多少 TaskTracker 实例在 Hadoop 集群上运行
TaskTracker 是集群中的一个从节点守护进程,它接受来自 JobTracker 的任务(Map、Reduce 和 Shuffle 操作)。在任何 hadoop 从节点上只运行一个 Task Tracker 进程。任务跟踪器在其自己的 JVM 进程上运行。每个 TaskTracker 都配置了一组槽,这些槽表示它可以接受的任务数量。TaskTracker 启动一个单独的 JVM 进程来执行实际工作(称为 Task Instance),这是为了确保进程失败不会关闭任务跟踪器。TaskTracker 监视这些任务实例,捕获输出和退出代码。当 Task 实例完成时,无论成功与否,任务跟踪器都会通知 JobTracker。TaskTracker 还会向 JobTracker 发送心跳消息,通常每隔几分钟,以向 JobTracker 保证它仍然活着。
 
什么是 Hadoop 中的 Task 实例?它在哪里运行?
任务实例是在每个从节点上运行的实际 MapReduce 作业。TaskTracker 启动一个单独的 JVM 进程来执行实际工作(称为 Task Instance),这是为了确保进程失败不会关闭任务跟踪器。每个任务实例都在自己的 JVM 进程上运行。一个从节点上可以运行多个任务实例进程。这是基于任务跟踪器上配置的槽数。默认情况下,会为任务生成一个新的任务实例 JVM 进程。
 
一个 Hadoop 系统上运行多少个守护进程?
Hadoop 由五个独立的守护进程组成。这些守护进程中的每一个都在自己的 JVM 中运行。以下 3 个守护进程在主节点 NameNode 上运行——该守护进程存储和维护 HDFS 的元数据。辅助 NameNode – 为 NameNode 执行内务管理功能。JobTracker – 管理 MapReduce 作业,将单个任务分发到运行 Task Tracker 的机器。以下 2 个守护进程在每个 Slave 节点上运行 DataNode – 存储实际的 HDFS 数据块。TaskTracker – 负责实例化和监控单个 Map 和 Reduce 任务。
 
Hadoop集群上典型的slave节点的配置是什么?一个从节点上运行了多少个 JVM?
Task Tracker 的单个实例在每个 Slave 节点上运行。任务跟踪器作为单独的 JVM 进程运行。
DataNode 守护进程的单个实例在每个从节点上运行。DataNode 守护进程作为单独的 JVM 进程运行。
在每个从节点上运行一个或多个 Task Instance 实例。每个任务实例都作为单独的 JVM 进程运行。可以通过配置控制 Task 实例的数量。通常,高端机器被配置为运行更多的任务实例。 
 
HDFS 和 NAS 有什么区别?
Hadoop 分布式文件系统 (HDFS) 是一种分布式文件系统,旨在运行在商品硬件上。它与现有的分布式文件系统有很多相似之处。但是,与其他分布式文件系统的区别是显着的。以下是 HDFS 和 NAS 之间的差异
在 HDFS 中,数据块分布在集群中所有机器的本地驱动器上。而在 NAS 中,数据存储在专用硬件上。
HDFS 旨在与 MapReduce 系统一起使用,因为计算已转移到数据上。NAS 不适合 MapReduce,因为数据与计算分开存储。
HDFS 在一组机器上运行,并使用复制协议提供冗余。而 NAS 由单台机器提供,因此不提供数据冗余。
 
NameNode 如何处理数据节点故障?
NameNode 会定期从集群中的每个 DataNode 接收 Heartbeat 和 Blockreport。收到心跳意味着 DataNode 运行正常。Blockreport 包含 DataNode 上所有块的列表。当 NameNode 注意到在一定时间后没有收到数据节点的心跳消息时,该数据节点被标记为死亡。由于块将被复制不足,系统开始复制存储在死数据节点上的块。NameNode 协调数据块从一个数据节点到另一个数据节点的复制。复制数据传输直接发生在数据节点之间,并且数据永远不会通过名称节点。
MapReduce 编程模型是否为 reducer 提供了一种相互通信的方式?在 MapReduce 作业中,reducer 可以与另一个 reducer 通信吗?
不,MapReduce 编程模型不允许reducer相互通信。reducer是孤立运行的。
 
我可以将reducer的数量设置为零吗?
是的,将reducer的数量设置为零是 Hadoop 中的有效配置。当您将 reducer 设置为零时,将不会执行任何 reducer,并且每个映射器的输出将存储到 HDFS 上的一个单独文件中。[这与reducer设置为大于零的数字并且Mappers输出(中间数据)写入每个mappter从节点的本地文件系统(不是HDFS)的情况不同。]
 
映射器输出(中间值数据)存储在哪里?
映射器输出(中间数据)存储在每个单独映射器节点的本地文件系统(非 HDFS)上。这通常是一个临时目录位置,可以由 hadoop 管理员在配置中设置。Hadoop 作业完成后会清理中间数据。
 
什么是合路器?我什么时候应该在我的 MapReduce 作业中使用组合器?
组合器用于提高 MapReduce 程序的效率。它们用于在单个映射器输出上本地聚合中间映射输出。组合器可以帮助您减少需要传输到reducer的数据量。如果执行的操作是可交换和关联的,您可以将您的 reducer 代码用作组合器。不保证组合器的执行,Hadoop 可能会也可能不会执行组合器。此外,如果需要,它可以执行超过 1 次。因此,您的 MapReduce 作业不应依赖于组合器的执行。
 
什么是 Writable & WritableComparable 接口?
org.apache.hadoop.io.Writable 是一个 Java 接口。Hadoop Map-Reduce 框架中的任何键或值类型都实现了这个接口。实现通常实现一个静态 read(DataInput) 方法,该方法构造一个新实例,调用 readFields(DataInput) 并返回该实例。
org.apache.hadoop.io.WritableComparable 是一个 Java 接口。任何在 Hadoop Map-Reduce 框架中用作键的类型都应该实现这个接口。WritableComparable 对象可以使用 Comparator 相互比较。
 
什么是键和值类的 Hadoop MapReduce API 契约?
Key 必须实现 org.apache.hadoop.io.WritableComparable 接口。
该值必须实现 org.apache.hadoop.io.Writable 接口。
 
MapReduce 中的 IdentityMapper 和 IdentityReducer 是什么?
org.apache.hadoop.mapred.lib.IdentityMapper 实现身份函数,将输入直接映射到输出。如果 MapReduce 程序员没有使用 JobConf.setMapperClass 设置 Mapper 类,则使用 IdentityMapper.class 作为默认值。
org.apache.hadoop.mapred.lib.IdentityReducer 不执行归约,将所有输入值直接写入输出。如果 MapReduce 程序员没有使用 JobConf.setReducerClass 设置 Reducer 类,则使用 IdentityReducer.class 作为默认值。
 
Hadoop中推测执行的含义是什么?它为什么如此重要?
推测执行是一种应对单个机器性能的方式。在涉及数百或数千台机器的大型集群中,可能有些机器的性能不如其他机器快。由于只有一台机器性能不佳,这可能会导致整个作业的延迟。为了避免这种情况,hadoop 中的推测执行可以在不同的从节点上运行相同 map 或 reduce 任务的多个副本。使用从第一个节点到完成的结果。
 
什么时候在 MapReduce 作业中启动reducer
在 MapReduce 作业中,reducers 在所有 Map 作业完成之前不会开始执行 reduce 方法。一旦映射器可用,Reducer 就开始从映射器复制中间键值对。程序员定义的 reduce 方法只有在所有映射器都完成后才会被调用。
如果在所有映射器完成之前reducer没有启动,那么为什么 MapReduce 作业的进度会显示类似于 Map(50%) Reduce(10%) 的内容?为什么在映射器尚未完成时显示减速器进度百分比?
一旦映射器可用,Reducer 就开始从映射器复制中间键值对。进度计算还考虑了由reduce 进程完成的数据传输处理,因此只要映射器的任何中间键值对可用于传输到reducer,reduce 进度就会开始显示。尽管reducer 进度仍然更新,但程序员定义的reduce 方法仅在所有映射器完成后才被调用。
 
什么是 HDFS?它与传统文件系统有何不同?
HDFS,即Hadoop分布式文件系统,负责在集群上存储海量数据。这是一个分布式文件系统,旨在在商品硬件上运行。它与现有的分布式文件系统有很多相似之处。但是,与其他分布式文件系统的区别是显着的。
HDFS 具有高度容错性,旨在部署在低成本硬件上。
HDFS 提供对应用程序数据的高吞吐量访问,适用于具有大量数据集的应用程序。
HDFS 旨在支持非常大的文件。与 HDFS 兼容的应用程序是那些处理大型数据集的应用程序。这些应用程序只写入一次数据,但读取一次或多次,并要求以流速度满足这些读取。HDFS 支持文件的一次写入多次读取语义。
 
什么是 HDFS 块大小?它与传统文件系统块大小有何不同?
在 HDFS 中,数据被分成块并分布在集群中的多个节点上。每个块的大小通常为 64Mb 或 128Mb。每个块都被复制多次。默认是将每个块复制 3 次。副本存储在不同的节点上。HDFS 利用本地文件系统将每个 HDFS 块存储为单独的文件。HDFS 块大小无法与传统文件系统块大小相比。
 
什么是 NameNode?一个 Hadoop 集群上运行了多少 NameNode 实例?
NameNode 是 HDFS 文件系统的核心。它保存文件系统中所有文件的目录树,并跟踪文件数据在集群中的保存位置。它本身不存储这些文件的数据。在任何 hadoop 集群上只运行一个 NameNode 进程。NameNode 运行在它自己的 JVM 进程上。在典型的生产集群中,它在单独的机器上运行。NameNode 是 HDFS 集群的单点故障。当 NameNode 宕机时,文件系统会脱机。每当客户端应用程序希望定位文件,或者希望添加/复制/移动/删除文件时,它们都会与 NameNode 通信。NameNode 通过返回数据所在的相关 DataNode 服务器列表来响应成功的请求。
 
什么是数据节点?一个 Hadoop 集群上运行了多少个 DataNode 实例?
DataNode 将数据存储在 Hadoop 文件系统 HDFS 中。在任何 hadoop 从节点上只运行一个 DataNode 进程。DataNode 运行在它自己的 JVM 进程上。启动时,DataNode 连接到 NameNode。DataNode 实例可以相互通信,这主要是在复制数据期间。
 
客户端如何与 HDFS 通信?
客户端与 HDFS 的通信使用 Hadoop HDFS API。每当客户端应用程序希望定位文件,或者当他们想要在 HDFS 上添加/复制/移动/删除文件时,它们都会与 NameNode 通信。NameNode 通过返回数据所在的相关 DataNode 服务器列表来响应成功的请求。一旦 NameNode 提供了数据的位置,客户端应用程序就可以直接与 DataNode 对话。
 
如何复制 HDFS 块?
HDFS 旨在可靠地跨大型集群中的机器存储非常大的文件。它将每个文件存储为一个块序列;文件中除最后一个块外的所有块的大小都相同。复制文件的块以实现容错。每个文件的块大小和复制因子是可配置的。应用程序可以指定文件的副本数。复制因子可以在文件创建时指定,以后可以更改。HDFS 中的文件是一次写入的,并且在任何时候都只有一个写入器。NameNode 做出有关块复制的所有决定。HDFS 使用机架感知副本放置策略。在默认配置中,HDFS 上的数据块共有 3 个副本,2 个副本存储在同一机架上的数据节点上,第三个副本存储在不同机架上。