Hadoop二十道面试问题

22-01-09 banq
本文将列出您在面试当天可能遇到的一些最常见的问题。无论您的接触程度如何,此列表都包含从基础到高级问题的所有内容,涉及 Hadoop 集群、HDFS、MapReduce、HBase、Pig 和 Hive。
1.什么是大数据?
任何难以捕获、整理或分析的数据形式都可以称为“大数据”。然而,在分析领域,大数据通常被称为大量复杂信息的集合。通过传统方法和工具无法使用这些套件。此类数据的一个示例可以是收集世界上存在并拥有永久地址的每个人的信息。
Apache Hadoop 及其扩展软件系列等工具可用于分析此类大数据。 
 
2. 描述 Hadoop 及其组件
Hadoop 是一个可用于存储、分析和处理大数据的软件系列。它挖掘大数据并提供企业可以用来改善其行业发展的见解。在上面的示例中,一个国家的政府可以使用该数据来创建可靠的人口普查报告。
Hadoop的两个主要组件是:
  • 存储单元称为 Hadoop 分布式文件系统 (HDFS)
  • 被称为又一个资源协商器 (YARN) 的处理框架

这两个组件还有执行多个任务的子组件
以下是系统中的各种 Hadoop 守护进程及其功能:
  • NameNode——主节点;负责存储所有文件和目录的元数据
  • DataNode——从节点;包含实际数据
  • Secondary NameNode——在NameNode失败的情况下使用;它会定期刷新内容
  • ResourceManager——中央权威;管理资源和调度
  • NodeManager – 在从机上运行并执行大多数任务,例如应用程序执行和监控 CPU 使用率;向资源管理器报告

 
4. 部署大数据解决方案的各个步骤是什么?
大数据解决方案涉及的各个步骤是:
数据摄取是部署大数据解决方案时最重要的过程,以便从 ERP 系统 (SAP)、任何 CRM(如 Siebel 和 Salesforce)、关系数据库管理系统(如 Oracle 和 MySQL)等多种来源中提取数据,或者可以是平面文件、日志文件、图像、文档和社交媒体源。此特定数据将存储在 HDFS 中。 
摄取数据后,后续过程是将数据存储在 NoSQL 数据库中,例如 HBase 或 HDFS。HDFS 针对顺序访问进行了优化,而 HBase 存储用于随机读取或写入的访问。
数据处理是使用任何这些处理框架(如 Spark、Pig、MapReduce、Hive 等)处理数据的最终步骤。
 
5. 什么是 Hadoop MapReduce?
Hadoop MapReduce 是一个框架,用于处理 Hadoop 集群中的大量数据。与数据分析的替代方法相比,它减少了时间消耗。MapReduce 的独特之处在于它跨集群同时运行任务以减少处理时间。
 
6. 在 Map Reduce 编程中,为什么我们使用排序和洗牌阶段。使用它的目的是什么?
在 Map Reduce 编程中,mapper 和 reducer 是两个重要的阶段,其中排序和 shuffle 洗牌是 map-reduce 中的两个主要操作。因为,Hadoop 框架基本上采用结构化或非结构化数据,然后将这些数据分离为键、值对,其中映射器程序将键和值中的数据分离和排列以用于进一步处理。排序和洗牌混洗阶段由框架完成,其中来自每个映射器的数据按键分组并在reducer 之间拆分,并进一步按键排序。每个 reducer 获取与同一个键关联的所有值。
Shuffle 是从 mapper 到 reducer 的数据传输过程,因此对于 reducer 来说是必要的。洗牌过程可以在映射map阶段完成之前开始,以节省一些时间。这就是reduce状态大于0%但小于33%,而map-status没有同时达到100%的原因。
排序,当排序后的输入数据中的下一个键与前一个不同时,启动新的 reduce 任务。每个reduce任务都获取键值对列表,以便按键对值进行分组,方法是调用输入为键列表(值)的reduce()方法。 
在 Shuffle洗牌 过程中,来自 mapper 的中间数据被传输到 0、1 或更多的 reducer。每个reducer获得一个或多个键,其关联值取决于平衡负载的reducer数量。另一方面,每个键的值在本地排序。如果我们指定零个reducer(即setNumReduceTasks(0)),则不会执行排序和混洗。在这种情况下,MapReduce 停止在 map 阶段并且不包括任何类型的排序。
 
7. Hadoop 输入格式有哪些?
有三种众所周知的输入格式,即:
  • 文本——文本行
  • 值 - 纯文本文件
  • 序列——按顺序输入的多个文件

文本是默认使用的输入格式。
 
8. Hadoop 中的心跳是什么?
Heartbeat 是数据节点和 NameNode 之间共享的一种通信形式(信号)。如果 NameNode 或作业跟踪器没有响应此通信尝试,则意味着系统中存在错误。
 
9. NameNode宕机时如何修复?
可以按照以下步骤修复 NameNode:
  • FsImage,文件系统元数据副本,应该用于启动一个新的 NameNode
  • 配置数据节点以确认这个新 NameNode 的创建
  • NameNode 将开始运行,集群将在完全加载最后一个 FsImage 检查点后恢复正常。

在某些情况下,NameNode 的复兴可能需要很长时间。
 
10. 区分 Hadoop 1 和 Hadoop 2
Hadoop 1和Hadoop 2的区别可以通过两个参数来体现,如下表所示:

参数                 Hadoop 1                                   Hadoop 2
Passive NameNode    由于它是单点故障,因此必须重新启动 NameNode 以恢复应用程序     不是单点故障;被动 NameNode 可以迅速取而代之
Processing (YARN)    仅限于其他工具无法承担处理任务的 MRV1 结构                MRV2结构


11.什么是FsImage?说明其显着特点
FsImage 是命名空间检查点的日志。最新的检查点允许在必要时恢复 NameNode 和其他元素。
 
12. 什么是检查点?
检查点是保存数据的最后一次加载。它捕获 FsImage 并编辑命名空间日志,然后将两者压缩成一个新的 FsImage。这是一个连续的过程。这个创建检查点的任务是由Secondary NameNode 执行的。
 
13、定义JobTracker在Hadoop中的作用?
资源管理、在添加或更新资源时跟踪资源以及任务生命周期管理是 JobTracker 的一些关键职责。更详细地说:
  • 它识别数据位置并与 NameNode 通信
  • 通过 TaskTracker 查找最佳可用节点来执行任务
  • 必要时将过载分配给从节点
  • 监控 TaskTracker

本质上,JobTracker 就像 Hadoop 生态系统中的维护人员一样工作。
 
14. 说出 Hadoop 的一大缺点?
Hadoop 的一个主要缺点是限制函数的安全性。它是用 Java 编写的,并且是众包的,因此极易受到黑客攻击。这是一个严重的问题,因为关键数据在这里存储和处理。
 
15. 如果您尝试从现有输出目录中拉取 Hadoop 作业,会发生什么?
该对话框将抛出一个错误并说输出文件目录已经存在。这并不理想,因为要运行 MapReduce 作业,需要确保不存在目录。在这种情况下,它必须被删除。shell 可用于删除目录
  
16. 解释您将如何选择各种文件格式以使用 Apache Hadoop 存储和处理数据?
选择特定文件格式的决定基于以下因素,例如:
  • 模式演变以更改、添加和重命名字段。
  • 使用模式,例如访问 50 列中的 5 列 大部分列的 V/S 访问。
  • 并行处理的分裂能力。 
  • 传输/读/写性能到节省存储空间的块压缩。

Hadoop 使用了多种文件格式,例如 JSON、CSV、顺序文件、列式、Parquet 文件和 AVRO。
  • JSON 文件

每个 JSON 文件都有自己的记录。JSON 将模式和数据的记录存储在一起。它还完全启用了模式演变和拆分能力。但是,JSON 文件格式不支持块级压缩。
  • CSV 文件 

对于 Hadoop 和外部系统之间的数据交换,CSV 文件非常适合。使用 CSV 文件格式时不使用页眉和页脚行。
  • Parquet 文件

Parquet 文件基本上是支持块级压缩的列文件格式。它还针对查询性能进行了优化,因为它允许从大约 50 多个列记录中选择十个或最少数量的列。
  • AVRO 文件

对于长期模式存储,AVRO 文件格式最适合。AVRO 文件将元数据与数据一起存储,并指定独立的模式以读取文件。
Hadoop fs –rmr /path/to/your/output/
 
17. 列出 Apache Pig 相对于 MapReduce 的优势
以下是 Apache Pig 的一些主要优点:
  • 无需 Java 实现即可进行高级数据交换。有可用的预设
  • 代码长度减少 20 倍(与 MapReduce 相比)
  • 添加几个内置操作,如连接、过滤器和排序,无需额外实现
  • 一个 Join 操作可以单独执行而不需要额外的资源
  • 支持嵌套数据类型。

总而言之,Apache Pig 作为高级数据流语言的工作效率更高。
 
18. 列出在 Hadoop 中调试代码的一般步骤
以下是调试代码所涉及的步骤:
  • 检查当前运行的 MapReduce 作业列表
  • 如果孤立作业正在运行,请通过执行以下代码检查 ResourceManager
    • ps -ef | grep –I  ResourceManager
  • 检查日志目录以检测可能显示的任何错误消息
  • 根据上述步骤中找到的日志,检查操作中可能存在错误代码的工作节点
  • 通过执行以下代码登录节点
    • ps -ef | grep –iNodeManager
  • 检查 MapReduce 日志以找出错误来源。 

这是 Hadoop 集群系统中大多数错误检测任务的过程。
  
19. 如果每个节点有 8TB 的可用磁盘空间(即,10 个磁盘具有 1TB,2 个磁盘用于操作系统等,被排除在外)。那么你将如何估计数据节点的数量(n)?(假设初始数据大小为 600 TB)
在 Hadoop 环境中,由于组织中随时都在增加数据,因此对硬件需求的估计具有挑战性。因此,必须根据当前场景对集群有适当的了解,这取决于以下因素:
  1. 要存储的实际数据大小约为 600TB。
  2. 未来(日/周/月/季/年)数据的增长速度取决于对数据趋势分析的预测和业务的合理需求。
  3. Hadoop 有一个默认的 3 倍副本因子。
  4. 对于硬件机器的开销(例如日志、操作系统等),考虑了两个磁盘。
  5. 对于中间 reducer 和 mapper,硬盘上的输出数据是 1x。
  6. 空间利用率在 60-70% 之间。

查找存储 600TB 数据所需的数据节点数量的步骤:
  • 给定复制因子:3

数据大小:600TB 
中间数据:1
总存储要求:3+1*600=2400 TB
可用磁盘大小:8TB
所需的数据节点总数:24008=300 台机器。
  • 实际计算 = 磁盘空间利用率 + 粗略计算 + 压缩率

磁盘空间利用率:65%
压缩比:2.3
存储总需求:24002.3=1043.5TB
可用磁盘大小:8*0.65=5.2 TB
所需的数据节点总数:1043.55.2=201 台机器。
集群实际可用大小(100%):201*8*2.34=925 TB
  • 案例:预计季度数据有20%的增长,我们都需要预测的是特定年份新增的机器

数据增长:每季度增长 20%
附加数据: 
1第一季度:1043.5 * 0.2 = 208.7 TB
2第二季度:1043.5 * 1.2 * 0.2 = 250.44 TB
3 RD季度:1043.5 * 1.2 * 1.2 * 0.2 = 300.5 TB
第4季度:1043.5*1.2*1.2*1.2*0.2=360.6 TB
其他数据节点: 
1第一季度:208.75.2 = 41个机
2第二季度:250.445.2 = 49个机
3第三季度:300.55.2 = 58个机
第4季度:360.65.2=70 台机器
 
20. 如果您的目录包含这些文件 - HadoopTraining.txt、_SpartTraining.txt、#DataScienceTraining.txt、.SalesforceTraining.txt。那么如果将此目录传递给 Hadoop MapReduce 作业,将处理多少个文件?
#DataScienceTraining.txt 和 HadoopTraining.txt 将为 MapReduce 作业处理,同时使用任何 FileInputFormat 作为 KeyValueInputFormat、TextInputFormat 或 SequenceFileInputFormat 在 Hadoop 中处理文件(单个或目录中),必须确认没有其中的文件包含隐藏的文件前缀,如“_”或“.” 原因是 mapreduce FileInputFormat 将默认使用 hiddenFileFilter 类以忽略具有任何这些前缀名称的文件。

private static final PathFilter hiddenFileFilter = new PathFilter() {
public boolean accept(Path p) {
String name = p.getName();
return !name.startsWith(“_”) && !name.startsWith(“.”);
}
};


但是,即使使用 FileInputFormat.setInputPathFilter 之类的自定义过滤器来消除此类条件, hiddenFileFilter 也将始终处于活动状态。