Hadoop二十道面试问题(2)

21. 如果上传一个 500MB 的文件到 HDFS。如果 100MB 的数据已经在 HDFS 中成功上传,而另一个客户端即将读取上传的数据,而上传仍在进行中。那么会发生什么呢?上传的那100MB数据是否会显示?
Hadoop1x 的默认块大小为 64MB,Hadoop2x 的默认块大小为 128MB。 
设block-size为100MB,即5个block要复制3次(默认replication-factor)
以下过程描述了如何将块写入 HDFS:
如果我们有 A、B、C、D 和 E 是客户端、文件、名称节点和数据节点的五个块。然后首先,客户端获取块 A 并接近名称节点以获取数据节点位置,以便存储当前块和它的复制副本。一旦数据节点信息可供客户端使用,他将直接到达数据节点并开始复制块 A,同时将复制到第二个数据节点。当块被复制并复制到数据节点时,块 A 存储的确认将到达客户端,然后客户端将重新启动下一个块即块 B 的相同过程。
因此,如果一个客户端正在将 500MB 的文件上传到 HDFS,其中 100MB 的数据已成功上传到 HDFS,而另一个客户端即将读取上传的数据,而上传仍在进行中,那么只有当前块正在写入将不会对读者可见。
 
22. 为什么我们要在停用 Hadoop 集群中的节点时停止所有任务跟踪器?
Hadoop集群中数据节点退役的完整过程应该非常清楚,但是当任务跟踪器在被退役的数据节点上运行MapReduce作业时需要注意这一点。与数据节点不同,没有任何优雅的方式来解除任务跟踪器,其中假设每当当前任务要移动到另一个节点时,就应该依赖任务制作过程来阻止失败,并进一步将其重新安排在集群上。可能性是,当任务的最终尝试在任务跟踪器上运行时,最终失败将导致整个作业失败。因此,停用会停止数据节点,但是为了将当前任务移动到另一个节点,
 
23. NameNode什么时候进入安全模式?
NameNode 负责管理集群的元存储,如果集群中缺少任何东西,那么 NameNode 将在集群可用于写入用户之前在安全模式期间检查所有关键信息。 
NameNode在启动过程中进入安全模式有几个原因:

  • NameNode 从 fsimage 加载文件系统状态并编辑日志文件,并等待数据节点以报告块。因此,如果块已存在于另一个集群中,则无法开始复制。
  • 来自数据节点的心跳和损坏的块存在于集群中。一旦 NameNode 验证了所有相关信息,它就会离开安全模式,然后集群就可以访问了。 

为了从 NameNode 手动进入或离开安全模式,在命令行中使用以下命令:“hdfs dfsadmin -safemode enter/leave”
 
24. 你有没有做过不平衡的工作,导致内存不足?如果是,那么您将如何处理?
在 MapReduce 作业中,“OutOfMemoryError”是随着数据以不同大小增长而发生的常见错误,这对开发人员来说是一个挑战,以便估计分配作业所需的内存量。 
因此,必须以适当的方式设置以下属性,以考虑集群中可用的资源,以避免内存不足错误:
容器中映射器使用的最大内存。
映射器使用的最大堆大小。它必须小于 mapreduce.map.memory.mb 的大小。
  • mapreduce.reduce.memory.mb

容器中 reducer 使用的最大内存。
  • mapreduce.reduce.java.opts

reducer 使用的最大堆大小。它必须小于 mapreduce.reduce.memory.mb 的大小。
  • yarn.schedule.maximum-allocation-mb

容器允许的最大分配大小,也需要管理权限。
 
25. 解释 Hadoop 中的纠删码?
默认情况下,HDFS 在 Hadoop 中将每个块复制到 3 次。HDFS 复制简单且具有健壮的形式冗余,以屏蔽数据节点的故障。但是,复制非常昂贵。3x 复制方案在存储空间中有 200% 的开销。 
Hadoop2.x 引入了擦除编码来代替复制。在此还提供了具有较少空间存储和 50% 开销存储的相同级别的容错。擦除编码使用RAID(廉价磁盘冗余阵列),它通过条带化实现,其中逻辑顺序数据被划分为字节、位或块等小单元。然后,在不同的磁盘上存储此数据。 
编码:这里,RAID对每条数据单元计算奇偶校验单元并对其进行排序,并通过奇偶校验恢复错误。EC 使用冗余数据扩展消息以实现容错。纠删码编解码器对大小一致的数据单元进行操作。它将数据单元作为输入并产生奇偶校验单元作为输出。数据单元和奇偶校验单元一起称为 EC 组。
存在两种可用于 EC 的算法: 
  • 异或算法
  • 里德-所罗门算法

 
26. 如果 Hadoop 中 reducer 的数量为“0”会怎样?
如果 reducer 的数量设置为“0”,则不会执行 reducer,也不会发生聚合。因此,在这种情况下,Hadoop 中首选“仅 Map 作业”,其中 map 使用 InputSplit 执行所有任务,而 reducer 不完成任何作业。在这里,map输出将是最终输出。
在 map 和 reduce 阶段之间有 sort、key 和 shuffle 阶段。其中 shuffle 和 sort 阶段负责按升序对键进行排序,然后对相同键的值进行分组。但是,如果这里不需要,我们可以避免 reduce 阶段。避免reduce阶段也将消除排序和混洗阶段,从而自动节省网络中的拥塞。
 
27. 区分结构化、非结构化和半结构化数据。
大数据包括高速、海量和可扩展的数据种类,分为结构化数据、非结构化数据和半结构化数据三种类型。


结构化数据    非结构化数据    半结构化数据
数据以有组织的方式格式化    无组织形式的数据    数据正在部分组织
使用固定数据方案    存在未知架构     它缺乏数据模型的形式结构
基于关系数据库表    基于字符和二进制数据    基于 XML/RDF
结构化数据的事务处理成熟,各种并发技术也被使用。    既没有事务管理,也没有并发。    这里的事务基本上是改编自不成熟的数据库管理系统。
版本超过元组和表    整体版本    可以在此处使用图或元组的版本
因为,结构化数据依赖于方案,因此灵活性较低    由于缺少模式,半结构化数据非常灵活    比结构化数据更灵活,但不如非结构化数据灵活
它允许复杂的连接    这里只有文本查询是可能的    它允许在同一个节点上进行查询
难以扩展数据库模式    非常可扩展    与结构化数据相比,缩放在这方面很简单
示例:关系数据库管理系统数据    示例:多媒体文件    示例:XML 和 JSON 文件

 
28. 如果一个文件包含 1000 亿个 URL。那么你将如何找到第一个唯一的 URL?
这个问题有大量的数据,即1000亿个URL,因此必须将其划分为适合内存的块,然后需要对这些块进行处理,然后将结果组合起来以获得最终答案。在这种情况下,使用哈希函数中的一致性将文件划分为较小的文件,该哈希函数产生 N/M 个块,每个块为 M(即,主存储器的大小)。这里从输入文件中读取每个 URL,并对其应用哈希函数以找到写入的块文件并进一步附加原始行号的文件。然后从内存中读取每个文件并为 URL 构建哈希表,该哈希表用于计算每个 URL 的出现次数,然后存储每个 URL 的行号。在哈希表构建完成后,扫描计数值为 1 的行号的最低条目,它是块文件中的第一个 URL,它本身是唯一的。对所有块文件重复上述步骤,并在处理后比较每个 URL 的行号。因此,在处理完所有块文件之后,1ST唯一的URL从所有处理输入发现。
 
29. 区分 MapReduce InputSplit 和 HDFS 块?
Block:

  • 块Block是存储 HDFS 数据的硬盘驱动器上的连续位置。FileSystem 将数据存储为块的集合。同样,HDFS 将每个文件存储为一个块,并将其分布在 Hadoop 集群上。
  • 块是数据的物理表示。
  • HDFS 的默认块大小为 128MB,可根据需要进行配置。除了最后一个块外,每个块的大小相同。最后一个块可以更小或相同大小。在 Hadoop 系统中,文件被拆分为 128MB 的块,并进一步存储在 Hadoop 文件系统中

InputSplit:
  • InputSplit 表示要处理的单个 Mapper 的数据。拆分被划分为记录,其中每个记录都由一个映射处理。
  • InputSplits 是数据的逻辑表示。 
  • 默认情况下,拆分的大小约为。等于块大小。
  • 逻辑记录不适合 HDFS 块。
  • 逻辑记录是穿过块边界的线。
  • 第一个拆分包含五行,尽管它跨越了块。

 
30. 我们可以在 Hive 中使用 LIKE 运算符吗?
我们可以使用 LIKE 运算符,因为 HIVE 支持 LIKE 运算符。但是 Hive 不支持多值 Like 查询,如下所示:
SELECT*FROM tablename WHERE firstname LIKE ANY 'root~%','user~%';
因此,只要在 HIVE 中需要,就可以轻松地使用 LIKE 运算符。如果需要使用多值 LIKE 运算符,我们将其打破,以便在 HIKE 中工作。
WHERE tbl2.product LIKE concat('%', tbl1.brand, '%')
 
31.区分静态和动态分区。
将数据插入表中时,会创建分区,这取决于数据的加载方式。因此,它是最好的性能调整技术。
Hive 中基本上有两种类型的分区,例如:
  • 静态分区
  • 动态分区

静态分区:
当大文件加载到 HIVE 表中时,首选静态分区,与动态分区相比,这可以节省我们加载数据的时间。 
这里手动添加分区列,并手动在分区表中移动文件。 
无需完全读取文件即可从文件名中获取分区列的名称。
必须为每个负载指定分区列的值。
由于静态分区是 Hive 的一种默认模式,因此可以在下面的属性集中找到
hive-site.xml
set hive.mapred.mode=strict

动态分区:
文件中可用的每个数据行都通过 MapReduce 作业进行读取和分区。 
在执行 ETL 作业时,动态分区已完成。
Hive 中没有任何默认模式,因此必须在 hive 中设置以下属性-
site.xml file.
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

在动态分区中,并非在每个加载语句中都指定了分区列的值。因此,以下是一些用于使用数据创建动态分区表的步骤。
  • 创建X,一个非分区表并加载数据
  • 创建Y,一个用于指定列分区的分区表。
  • 将数据从“X”加载到“Y”为:

hive>INSERT INTO TABLE Y PARTITIONstate SELECT*FROM X;
这里分区列是非分区表的最后一列。
 
32.列出Hadoop的一些工业用途。
Hadoop 是一种处理结构化和非结构化数据的方法。以下是 hadoop 和大数据将产生良好推动作用的几个领域。
  • 流量管理
  • 处理流的入口和出口
  • CMS 和电子邮件
  • 利用hadoop计算集群分析动物脑神经信号
  • 欺诈检测和预防
  • 分析点击流、交易、视频、社交媒体数据,向目标受众投放合适的广告
  • 内容、帖子、图像、视频等社交媒体实体处理得很好
  • 通过实时分析客户数据改善业务
  • 情报、国防、网络安全和科学研究等政府机构
  • 医疗器械、医嘱、影像报告、实验室结果、临床数据和财务数据等医疗领域数据

 
33. 列出与大数据相关的 5V。
在处理批量数据时,我们需要预见与处理数据相关的情况。以下方面有助于我们描述大数据的性质。
  • Volume 卷 - 数据的大小可能以 PB 或 Exabytes 为单位。数据的指数增长证明了在一段时间内收集的大量数据是合理的。
  • Velocity 速度——数据增长的速度。数据正在从各种来源积累。例如,如今来自社交媒体的数据输入非常庞大。
  • Variety 多样性——数据具有不同的格式,如视频、音频、csv、word 文件等。数据类型的这种异质性带来了许多挑战和好处。
  • Veracity 准确性——不完整或不一致的数据会导致数据的不确定性。随着数据变得庞大且来源多样,准确性和质量难以管理。变得难以信任。
  • Value 价值——难以获取和处理大数据。通过这个过程有什么好处?大数据是否为业务增加了任何价值?我们是否获得了良好的投资回报率,该过程是否有利可图?

 
34. 解释 Hadoop 与使用关系数据库管理的传统处理系统有何不同?
关系数据库管理系统    Hadoop
关系数据库管理系统依赖于数据方案始终已知的结构化数据。    在 Hadoop 中,要存储的数据是任何类型的,即结构化数据、半结构化数据或非结构化数据。
它不提供或提供有限的处理能力    它允许并行分布数据以进行处理。
基于“写入时模式”的关系数据库管理系统,其中模式的验证必须在加载数据之前完成。    Hadoop 遵循读取策略模式。
在关系数据库管理系统中,由于数据的模式是已知的,因此读取速度更快。    在 Hadoop 中,HDFS 写入期间不存在任何方案验证,因此写入速度更快。
在线事务处理 (OLTP) 是合适的。    在线分析处理 (OLAP) 是合适的。
计算速度很快。    这里的计算速度通常较慢。
它是一个许可软件。    它是一个开源框架。
 

35.列出Hadoop的主要配置文件。
以下是Hadoop的主要确认文件:
  • hadoop-env.sh
  • core-site.xml
  • hdfs-site.xml
  • yarn-site.xml
  • mapred-site.xml
  • masters
  • slaves

 
36、HDFS使用硬件商品存储数据,故障几率较高。然后解释一下HDFS是如何保证系统的容错能力的?
Hadoop 还创建一个备份,称为复制。因此,如果发生任何故障,Hadoop 中也不应该因为其复制而出现任何错误。
如果 HDFS 使用硬件商品存储数据,失败的可能性更高。然后HDFS通过块复制来保证系统的容错能力。 

  • HDFS 复制块,然后将其存储在不同的数据节点上。
  • 这里默认的复制因子是 3。

 
37、如果HDFS有很多小文件会出现什么问题?还提供了克服这个问题的方法。
HDFS 的问题在于,如果我们有很多小文件,那么它们的块就太多了。对于太多的块,存在太多的元数据。因此,为了管理如此大量的元数据是非常困难的。 
但是,我们可以通过使用 Hadoop Archive 来克服这个问题,它将所有 HDFS 小文件合并到一个具有 .HAR 扩展名的存档文件中
>hadoop archieve-archiveName myfilearchive.har /input/location /output/location
 
38. 假设有一个大小为 514MB 的文件存储在 Hadoop (Hadoop 2.x) 中,使用默认的块大小配置和默认复制因子。那么,总共将创建多少个块,每个块的大小是多少?
在 Hadoop 2.x 中,默认复制因子为 3,默认块大小为 128MB。 

因此,514MB 的文件可以拆分为:

a    b    C    d    e
128MB    128MB    128MB    128MB    2MB

  • 默认块大小为 128MB
  • 块数:514MB128MB=4.05 ≈5块
  • 复制因子:3
  • 总块数:5*3=15
  • 总大小:514*3=1542MB

因此,有 15 个大小为 1542MB 的块。
 
39. 如何将文件复制到HDFS中与现有block-size配置不同的block-size?
将文件复制到具有与现有块大小配置不同的块大小的 HDFS 可以如下完成: 
32MB=33554432 字节(默认块大小:128MB)
hadoop fs-Ddfs.blocksize=33554432-copyFromLocal /local/test.txt /sample_hdfs
  • 检查 test.txt 的块大小:

hadoop fs-stat %o /sample_hdfs/test.txt
 
40. HDFS 中的块扫描器是什么意思?
HDFS 中的块扫描器:
  • 块扫描器基本上保持数据块的完整性。
  • 它定期在每个数据节点上运行,以验证数据块是否正确存储。

以下是执行此操作的步骤:
  • DataNode 向 NameNode 报告。
  • NameNode 通过使用好的副本来安排新副本的创建。
  • 一旦复制因子达到所需级别,损坏的块将被删除。