Hadoop最全面试题整理(附目录)

Hadoop最全面试题整理(附目录)


2024年1月14日发(作者:)

Hadoop面试题目及答案(附目录)

选择题

1.下面哪个程序负责 HDFS 数据存储。

a)NameNode b)Jobtracker c)Datanode d)secondaryNameNode e)tasktracker

答案 C datanode

2. HDfS 中的 block 默认保存几份?

a)3 份 b)2 份 c)1 份 d)不确定

答案 A 默认 3 份

3.下列哪个程序通常与 NameNode 在一个节点启动?

a)SecondaryNameNode b)DataNode c)TaskTracker d)Jobtracker

答案 D

分析:hadoop 的集群是基于 master/slave 模式,namenode 和 jobtracker 属于 master,datanode 和tasktracker 属于 slave,master 只有一个,而 slave 有多个SecondaryNameNode

内存需求和 NameNode 在一个数量级上,所以通常 secondaryNameNode(运行在单独的物理机器上)和 NameNode 运行在不同的机器上。

JobTracker 和 TaskTracker

JobTracker 对应于 NameNode,TaskTracker 对应于 DataNode,DataNode 和 NameNode

是针对数据存放来而言的,JobTracker 和 TaskTracker 是对于 MapReduce 执行而言的。mapreduce 中几个主要概念,mapreduce 整体上可以分为这么几条执行线索:jobclient,JobTracker 与 TaskTracker。

1、JobClient 会在用户端通过 JobClient 类将应用已经配置参数打包成 jar 文件存储到

hdfs,并把路径提交到 Jobtracker,然后由 JobTracker 创建每一个 Task(即 MapTask 和ReduceTask)并将它们分发到各个 TaskTracker 服务中去执行。

2、JobTracker 是一个 master 服务,软件启动之后 JobTracker 接收 Job,负责调度 Job

的每一个子任务 task 运行于 TaskTracker 上,并监控它们,如果发现有失败的 task 就重新运行它。一般情况应该把 JobTracker 部署在单独的机器上。

3、TaskTracker 是运行在多个节点上的 slaver 服务。TaskTracker 主动与 JobTracker 通信,接收作业,并负责直接执行每一个任务。TaskTracker 都需要运行在 HDFS 的 DataNode

上。

4. Hadoop 作者

a)Martin Fowler b)Kent Beck c)Doug cutting

答案 C Doug cutting

5. HDFS 默认 Block Size

a)32MB b)64MB c)128MB

答案:B

6. 下列哪项通常是集群的最主要瓶颈

a)CPU b)网络 c)磁盘 IO d)内存

答案:C 磁盘

首先集群的目的是为了节省成本,用廉价的 pc 机,取代小型机及大型机。小型机和大型机

有什么特点?

处理能力强

2.内存够大,所以集群的瓶颈不可能是 a 和 d

3.如果是互联网有瓶颈,可以让集群搭建内网。每次写入数据都要通过网络(集群是内网),然后还要写入 3 份数据,所以 IO 就会打折扣。

7.关于 SecondaryNameNode 哪项是正确的?

a)它是 NameNode 的热备 b)它对内存没有要求

c)它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间

d)SecondaryNameNode 应与 NameNode 部署到一个节点

答案 C。

多选题:

8. 下列哪项可以作为集群的管理?

a)Puppet b)Pdsh c)Cloudera Manager d)Zookeeper

答案 ABD

具体可查看什么是 Zookeeper,Zookeeper 的作用是什么,在 Hadoop 及 hbase 中具体作用是什么。

9. 配置机架感知的下面哪项正确

a)如果一个机架出问题,不会影响数据读写

b)写入数据的时候会写到不同机架的 DataNode 中

c)MapReduce 会根据机架获取离自己比较近的网络数据

答案 ABC

具体可以参考hadoop 机架感知--加强集群稳固性,该如何配置 hadoop 机架感知

10. Client 端上传文件的时候下列哪项正确

a)数据经过 NameNode 传递给 DataNode

b)Client 端将文件切分为 Block,依次上传

c)Client 只上传数据到一台 DataNode,然后由 NameNode 负责 Block 复制工作

答案 B

分析:Client 向 NameNode 发起文件写入的请求。NameNode 根据文件大小和文件块配置情况,返回给 Client 它所管理部分 DataNode 的信息。Client 将文件划分为多个 Block,根据 DataNode 的地址信息,按顺序写入到每一个DataNode 块中。具体查看HDFS 体系结构简介及优缺点。

11. 下列哪个是 Hadoop 运行的模式

a)单机版 b)伪分布式 c)分布式

答案 ABC 单机版,伪分布式只是学习用的。

12. Cloudera 提供哪几种安装 CDH 的方法

a)Cloudera manager b)Tarball c)Yum d)Rpm

答案:ABCD 具体可以参考Hadoop CDH 四种安装方式总结及实例指导。

简答题

集群可以运行的3个模式?单机(本地)模式伪分布式模式全分布式模式

2. 单机(本地)模式中的注意点?在单机模式(standalone)中不会存在守护进程,所有东西都运行在一个JVM上。这里同样没有DFS,使用的是本地文件系统。单机模式适用于开

发过程中运行MapReduce程序,这也是最少使用的一个模式。

3. 伪分布模式中的注意点?伪分布式(Pseudo)适用于开发和测试环境,在这个模式中,所有守护进程都在同一台机器上运行。

4. VM是否可以称为Pseudo?不是,两个事物,同时Pseudo只针对Hadoop。

5. 全分布模式又有什么注意点?全分布模式通常被用于生产环境,这里我们使用N台主机组成一个Hadoop集群,Hadoop守护进程运行在每台主机之上。这里会存在Namenode运行的主机,Datanode运行的主机,以及task tracker运行的主机。在分布式环境下,主节点和从节点会分开。

6. Hadoop是否遵循UNIX模式?是的,在UNIX用例下,Hadoop还拥有“conf”目录。7. Hadoop安装在什么目录下?Cloudera和Apache使用相同的目录结构,Hadoop被安装在cd/usr/lib/hadoop-0.20/。

8. Namenode、Job tracker和task tracker的端口号是?Namenode,70;Job tracker,30;Task

tracker,60。

9. Hadoop的核心配置是什么?Hadoop的核心配置通过两个xml文件来完成:1,;2,。这些文件都使用xml格式,因此每个xml中都有一些属性,包括名称和值,但是当下这些文件都已不复存在。

10. 那当下又该如何配置?Hadoop现在拥有3个配置文件:1,;2,;3,。这些文件都保存在conf/子目录下。

11. RAM的溢出因子是?溢出因子(Spill factor)是临时文件中储存文件的大小,也就是Hadoop-temp目录。

12. 只是单一的目录?只是一个目录。

13. 的3个主要属性?决定的是元数据存储的路径以及DFS的存储方式(磁盘或是远端)决定的是数据存储的路径用于第二Namenode

14. 如何退出输入模式?退出输入的方式有:1,按ESC;2,键入:q(如果你没有输入任何当下)或者键入:wq(如果你已经输入当下),并且按下Enter。

15. 当你输入hadoopfsck /造成“connection refused java exception’”时,系统究竟发生了什么?这意味着Namenode没有运行在你的VM之上。

16. 我们使用Ubuntu及Cloudera,那么我们该去哪里下载Hadoop,或者是默认就与Ubuntu一起安装?这个属于Hadoop的默认配置,你必须从Cloudera或者Edureka的dropbox下载,然后在你的系统上运行。当然,你也可以自己配置,但是你需要一个Linux box,Ubuntu或者是Red Hat。在Cloudera网站或者是Edureka的Dropbox中有安装步骤。

17. “jps”命令的用处?这个命令可以检查Namenode、Datanode、Task Tracker、 Job Tracker是否正常工作。

18. 如何重启Namenode?点击,再点击。键入sudo hdfs(Enter),su-hdfs

(Enter),/etc/init.d/ha(Enter),及/etc/init.d/hadoop-0.20-namenode start(Enter)。

19. Fsck的全名?全名是:File System Check。

20. 如何检查Namenode是否正常运行?如果要检查Namenode是否正常工作,使用命令/etc/init.d/hadoop-0.20-namenode status或者就是简单的jps。

21. r命令的作用?可以让你知道哪个节点是Job Tracker。

22. /etc /init.d命令的作用是?/etc /init.d说明了守护进程(服务)的位置或状态,其实是LINUX特性,和Hadoop关系不大。

23. 如何在浏览器中查找Namenode?如果你确实需要在浏览器中查找Namenode,你不再需要localhost:8021,Namenode的端口号是50070。

24. 如何从SU转到Cloudera?从SU转到Cloudera只需要键入exit。

25. 启动和关闭命令会用到哪些文件?Slaves及Masters。

26. Slaves由什么组成?Slaves由主机的列表组成,每台1行,用于说明数据节点。

27. Masters由什么组成?Masters同样是主机的列表组成,每台一行,用于说明第二Namenode服务器。

28. 是用于做什么的?提供了Hadoop中. JAVA_HOME的运行环境。

29. Master文件是否提供了多个入口?是的你可以拥有多个Master文件接口。30. 文件当下的位置?现在位于conf。

31. 在Hadoop_PID_DIR中,PID代表了什么?PID代表了“Process ID”。

32. /var/hadoop/pids用于做什么?/var/hadoop/pids用来存储PID。33. ties文件的作用是?ties被用做“Reporting”,控制Hadoop报告,初始状态是“not to report”。

34. Hadoop需求什么样的网络?Hadoop核心使用Shell(SSH)来驱动从节点上的服务器进程,并在主节点和从节点之间使用password-less SSH连接。

35. 全分布式环境下为什么需求password-less SSH?这主要因为集群中通信过于频繁,Job

Tracker需要尽可能快的给Task Tracker发布任务。

36. 这会导致安全问题吗?完全不用担心。Hadoop集群是完全隔离的,通常情况下无法从互联网进行操作。与众不同的配置,因此我们完全不需要在意这种级别的安全漏洞,比如说通过互联网侵入等等。Hadoop为机器之间的连接提供了一个相对安全的方式。

37. SSH工作的端口号是?SSH工作的端口号是NO.22,当然可以通过它来配置,22是默认的端口号。

38. SSH中的注意点还包括?SSH只是个安全的shell通信,可以把它当做NO.22上的一种协议,只需要配置一个密码就可以安全的访问。

39. 为什么SSH本地主机需要密码?在SSH中使用密码主要是增加安全性,在某些情况下也根本不会设置密码通信。

40. 如果在SSH中添加key,是否还需要设置密码?是的,即使在SSH中添加了key,还是需要设置密码。

41. 假如Namenode中没有数据会怎么样?没有数据的Namenode就不能称之为Namenode,通常情况下,Namenode肯定会有数据。

42. 当Job Tracker宕掉时,Namenode会发生什么?当Job Tracker失败时,集群仍然可以正常工作,只要Namenode没问题。

43. 是客户端还是Namenode决定输入的分片?这并不是客户端决定的,在配置文件中以及决定分片细则。

44. 是否可以自行搭建Hadoop集群?是的,只要对Hadoop环境足够熟悉,你完全可以这么做。

45. 是否可以在Windows上运行Hadoop?你最好不要这么做,Red Hat Linux或者是Ubuntu才是Hadoop的最佳操作系统。在Hadoop安装中,Windows通常不会被使用,因为会出现各种各样的问题。因此,Windows绝对不是Hadoop的推荐系统。

1 请列出你所知道的 hadoop 调度器 并简要说明其工作方法

随着MapReduce的流行,其开源实现Hadoop也变得越来越受推崇。在Hadoop系统中,有一个组件非常重要,那就是调度器,它的作用是将系统中空闲的资源按一定策略分配给作业。在Hadoop中,调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计调度器。

Hadoop中常见的调度器有三种,分别为:

(注:本文介绍的Hadoop调度器不够系统化,如果想了解更系统化的Hadoop调度器,可阅读我的最新书籍《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》(购买说明)第10章 “Hadoop多用户作业调度器分析”,分析了当前比较流行的FIFO、Capacity个Fair三种调度器的配置方法、实现机制和优缺点对比,当然,也介绍了其他类型的几种调度器。)

(1)默认的调度器FIFO

Hadoop中默认的调度器,它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业。

(2) 计算能力调度器Capacity Scheduler

支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。调度时,首先按以下策略选择一个合适队列:计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列;然后按以下策略选择该队列中一个作业:按照作业优先级和提交时间顺序选择,同时考虑用户资源量限制和内存限制。

(3)公平调度器Fair Scheduler

同计算能力调度器类似,支持多队列多用户,每个队列中的资源量可以配置,同一队列中的作业公平共享队列中所有资源,具体算法参见我的博文《Hadoop公平调度器算法解析》

实际上,Hadoop的调度器远不止以上三种,最近,出现了很多针对新型应用的Hadoop调度器。

2 MapReduce 中的两表 join 几种方案

1. 概述

在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的。而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的技巧。

本文首先介绍了Hadoop上通常的JOIN实现方法,然后给出了几种针对不同输入数据集的优化方法。

2. 常见的join方法介绍

假设要进行join的数据分别来自File1和File2.

2.1 reduce side join

reduce side join是一种最简单的join方式,其主要思想如下:

在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签(tag),比如:tag=0表示来自文件File1,tag=2表示来自文件File2。即:map阶段的主要任务是对不同文件中的数据打标签。

在reduce阶段,reduce函数获取key相同的来自File1和File2文件的value list, 然后对于同一个key,对File1和File2中的数据进行join(笛卡尔乘积)。即:reduce阶段进行实际的连接操作。

REF:hadoop join之reduce side join

/huashetianzu/article/details/7819244

2.2 map side join

之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中。Reduce side join是非常低效的,因为shuffle阶段要进行大量的数据传输。

Map side join是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多份,让每个map

task内存中存在一份(比如存放到hash table中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table中查找是否有相同的key的记录,如果有,则连接后输出即可。

为了支持文件的复制,Hadoop提供了一个类DistributedCache,使用该类的方法如下:

(1)用户使用静态方法heFile()指定要复制的文件,它的参数是文件的URI(如果是HDFS上的文件,可以这样:hdfs://namenode:9000/home/XXX/file,其中9000是自己配置的NameNode端口号)。JobTracker在作业启动之前会获取这个URI列表,并将相应的文件拷贝到各个TaskTracker的本地磁盘上。(2)用户使用alCacheFiles()方法获取文件目录,并使用标准的文件读写API读取相应的文件。

REF:hadoop join之map side join

/huashetianzu/article/details/7821674

2.3 Semi Join

Semi Join,也叫半连接,是从分布式数据库中借鉴过来的方法。它的产生动机是:对于reduce

side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不会参加join操作的数据,则可以大大节省网络IO。

实现方法很简单:选取一个小表,假设是File1,将其参与join的key抽取出来,保存到文件File3中,File3文件一般很小,可以放到内存中。在map阶段,使用DistributedCache将File3复制到各个TaskTracker上,然后将File2中不在File3中的key对应的记录过滤掉,剩下的reduce阶段的工作与reduce side join相同。

更多关于半连接的介绍,可参考:半连接介绍:/view/

REF:hadoop join之semi join

/huashetianzu/article/details/7823326

2.4 reduce side join + BloomFilter

在某些情况下,SemiJoin抽取出来的小表的key集合在内存中仍然存放不下,这时候可以使用BloomFiler以节省空间。

BloomFilter最常见的作用是:判断某个元素是否在一个集合里面。它最重要的两个方法是:add() 和contains()。最大的特点是不会存在 false negative,即:如果contains()返回false,则该元素一定不在集合中,但会存在一定的 false positive,即:如果contains()返回true,则该元素一定可能在集合中。

因而可将小表中的key保存到BloomFilter中,在map阶段过滤大表,可能有一些不在小表中的记录没有过滤掉(但是在小表中的记录一定不会过滤掉),这没关系,只不过增加了少量的网络IO而已。

更多关于BloomFilter的介绍,可参考:/jiaomeng/article/details/1495500

3. 二次排序

在Hadoop中,默认情况下是按照key进行排序,如果要按照value进行排序怎么办?即:对于同一个key,reduce函数接收到的value list是按照value排序的。这种应用需求在join操作中很常见,比如,希望相同的key中,小表对应的value排在前面。

有两种方法进行二次排序,分别为:buffer and in memory sort和 value-to-key conversion。

对于buffer and in memory sort,主要思想是:在reduce()函数中,将某个key对应的所有value保存下来,然后进行排序。 这种方法最大的缺点是:可能会造成out of memory。

对于value-to-key conversion,主要思想是:将key和部分value拼接成一个组合key(实现

WritableComparable接口或者调用setSortComparatorClass函数),这样reduce获取的结果便是先按key排序,后按value排序的结果,需要注意的是,用户需要自己实现Paritioner,以便只按照key进行数据划分。Hadoop显式的支持二次排序,在Configuration类中有个setGroupingComparatorClass()方法,可用于设置排序group的key值,具体参考:/xuxm2007/archive/2011/09/03/

4. 后记

最近一直在找工作,由于简历上写了熟悉Hadoop,所以几乎每个面试官都会问一些Hadoop相关的东西,而 Hadoop上Join的实现就成了一道必问的问题,而极个别公司还会涉及到DistributedCache原理以及怎样利用DistributedCache进行Join操作。为了更好地应对这些面试官,特整理此文章。

4 介绍一下hbase 过滤器

一、过滤器(Filter)

基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter。Filter可以根据簇、列、版本等更多的条件来对数据进行过滤,基于Hbase本身提供的三维有序(主键有序、列有序、版本有序),这些Filter可以高效的完成查询过滤的任务。带有Filter条件的RPC查询请求会把Filter分发到各个RegionServer,是一个服务器端(Server-side)的过滤器,这样也可以降低网络传输的压力。

要完成一个过滤的操作,至少需要两个参数。一个是抽象的操作符,Hbase提供了枚举类型的变量来表示这些抽象的操作符:LESS/LESS_OR_EQUAL/EQUAL/NOT_EUQAL等;另外一个就是具体的比较器(Comparator),代表具体的比较逻辑,如果可以提高字节级的比较、字符串级的比较等。有了这两个参数,我们就可以清晰的定义筛选的条件,过滤数据。

Java代码 收藏代码

CompareFilter(CompareOp compareOp, WritableByteArrayComparable valueComparator)

CompareFilter是高层的抽象类,下面我们将看到它的实现类和实现类代表的各种过滤条件。这里实现类实际上代表的是参数中的过滤器过滤的内容,可以使主键、簇名、列值等,这就是由CompareFilter决定了。

行过滤器(RowFilter)

行过滤器的比较对象是行主键

Java代码 收藏代码

Scan scan = new Scan();

Filter filter1 = new RowFilter(_OR_EUQAL, new

BinaryComparator(s("hello")));

ter(filter1);

();

例中的Filter会将所有的小于等于“Hello”的主键过滤出来。

簇过滤器(FamilyFilter)

簇过滤器过滤的是簇的名字。

列过滤器(QualifierFilter)

列过滤器过滤的是列的名字。

值过滤器(ValueFilter)

值过滤器过滤的是扫描对象的值。

单值过滤器(SingleColumnValueFilter)

单值过滤器是以特定列的值为过滤内容,与值过滤器不同的是,这里是特定的列,而值过滤器比较的是行内的所有列。所有在使用单值过滤器的时候要指定比较的列的坐标。

Java代码 收藏代码

SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOp compareOp,

WritableByteArrayComparable comparator)

对于找不到该列的行,可以有特殊的处理

Java代码 收藏代码

void setFilterIfMissing(boolean filterIfMissing)

默认缺省行将被包含进过滤的结果集中。

前缀过滤器(PrefixFilter)

前缀过滤器将会过滤掉不匹配的记录,过滤的对象是主键的值。

Java代码 收藏代码

PrefixFilter(byte[] prefix)

页过滤器(PageFilter)

页过滤器可以根据主键有序返回固定数量的记录,这需要客户端在遍历的时候记住页开始的地方,配合scan的startkey一起使用。

Java代码 收藏代码

PageFilter(int size)

键过滤器(KeyOnlyFilter)

键过滤器可以简单的设置过滤的结果集中只包含键而忽略值,这里有一个选项可以把结果集的值保存为值的长度。

FirstKeyOnlyFilter

在键过滤器的基础上,根据列有序,只包含第一个满足的键。

ColumnPrefixFilter

这里过滤的对象是列的值。

TimestampsFilter

Java代码 收藏代码

TimestampsFilter(List times)

这里参数是一个集合,只有包含在集合中的版本才会包含在结果集中。

包装类过滤器,此类过滤器要通过包装其他的过滤器才有意义,是其他过滤器的一种加强。

SkipFilter

Java代码 收藏代码

SkipFilter(Filter filter)

过滤器集合(FilterList)

Hbase的过滤器设计遵照于设计模式中的组合模式,以上的所有过滤器都可以叠加起来共同作用于一次查询。

知识点

HDFS的存储机制

1. HDFS开创性地设计出一套文件存储方式,即对文件分割后分别存放;

2. HDFS将要存储的大文件进行分割,分割后存放在既定的存储块(Block)中,并通过预先设定的优化处理,模式对存储的数据进行预处理,从而解决了大文件储存与计算的需求;

3. 一个HDFS集群包括两大部分,即NameNode与DataNode。一般来说,一个集群中会有一个NameNode和多个DataNode共同工作;

4. NameNode是集群的主服务器,主要是用于对HDFS中所有的文件及内容数据进行维护,并不断读取记录集群中DataNode主机情况与工作状态,并通过读取与写入镜像日志文件的方式进行存储;

5. DataNode在HDFS集群中担任任务具体执行角色,是集群的工作节点。文件被分成若干个相同大小的数据块,分别存储在若干个DataNode上,DataNode会定期向集群内NameNode发送自己的运行状态与存储内容,并根据NameNode发送的指令进行工作;

6. NameNode负责接受客户端发送过来的信息,然后将文件存储位置信息发送给提交请求的客户端,由客户端直接与DataNode进行联系,从而进行部分文件的运算与操作。

7. Block是HDFS的基本存储单元,默认大小是64M;

8. HDFS还可以对已经存储的Block进行多副本备份,将每个Block至少复制到3个相互独立的硬件上,这样可以快速恢复损坏的数据;

9. 用户可以使用既定的API接口对HDFS中的文件进行操作;

10. 当客户端的读取操作发生错误的时候,客户端会向NameNode报告错误,并请求NameNode排除错误的DataNode后后重新根据距离排序,从而获得一个新的DataNode的读取路径。如果所有的DataNode都报告读取失败,那么整个任务就读取失败;

11. 对于写出操作过程中出现的问题,FSDataOutputStream并不会立即关闭。客户端向NameNode报告错误信息,并直接向提供备份的DataNode中写入数据。备份DataNode被升级为首选DataNode,并在其余2个DataNode中备份复制数据。NameNode对错误的DataNode进行标记以便后续对其进行处理


发布者:admin,转转请注明出处:http://www.yc00.com/news/1705184891a1397734.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信