注意:大部分题目来自互联网,部分题目来自同事口述
14.1 Zookeeper
(1)Zookeeper是什么框架
分布式的、开源的分布式应用程序协调服务,原本是Hadoop、HBase的一个重要组件。它为分布式应用提供一致性服务的软件,包括:配置维护、域名服务、分布式同步、组服务等
(2)说说你对zookeeper的理解
ZooKeeper提供了一个简化并支持特定功能的分布式文件系统接口,加上数据同步,变更通知,客户端Cache等辅助机制。实际上zookeeper是很适合做集群节点都具有相同配置文件或相同配置信息的管理同步工具,可以设置权限及触发功能。比如集群中每一个加点安装部署zookeeper,构成zookeeper集群,配置好相应的watcher及触发运行脚本,在集群中任何一台的节点上修改配置文件,都会触发watcher,然后执行相应的配置信息同步脚本,更新所有其他节点上得配置信息,实现了配置的统一管理。集群的配置(文件)管理(配置修改之后,zookeeper监控到自动更新同步到其他客户端,实现配置的统一管理)。
(3)部署方式?集群中的机器角色都有哪些?集群最少要几台机器
单机,集群。
Leader、Follower。
集群最低3(2N+1)台,保证奇数,主要是为了选举算法
(4)集群如果有3台机器,挂掉一台集群还能工作吗?挂掉两台呢?
记住一个原则:过半存活即可用。
(5)Zookeeper集群支持动态添加机器吗?
其实就是水平扩容了,Zookeeper在这方面不太好。两种方式:
全部重启:关闭所有Zookeeper服务,修改配置之后启动。不影响之前客户端的会话。
逐个重启:顾名思义。这是比较常用的方式。
(6)选举算法
分布式Zookeeper选举Leader服务器的算法与Paxos有很深的关系。Paxos算法是分布式选举算法。
14.2 HDFS
(1)Block Size 是不可以修改的。
送分题,显然错误。
备注:blockSize默认值128M
(2)如果 NameNode 意外终止,SecondaryNameNode 会接替它使集群继续工作。
送分题,显然错误。
备注:在HA模式下的StandbyNameNode可以接替namenode的集群工作。
(3)下列哪个是 Hadoop 运行的模式
A)单机版
B)伪分布式
C)分布式
答案:a,b,c
备注:常识题。
(4)关于 SecondaryNameNode 哪项是正确的?
A)它是 NameNode 的热备
B)它对内存没有要求
C)它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间
D)SecondaryNameNode 应与 NameNode 部署到一个节点
答案:C
(5)下面哪个程序负责 HDFS 数据存储。
A)NameNode
B)Jobtracker
C)Datanode
D)secondaryNameNode
E)tasktracker
答案:C
(6) HDfS 中的 block 默认保存几份?
A)3 份
B)2 份
C)1 份
D)不确定
答案:A
提示:常识题,block默认副本数是3(在hdfs-site.xml文件中设置dfs.replication)。
(7)一个datanode 宕机,怎么恢复?
Datanode宕机了后,如果是短暂的宕机,可以实现写好脚本监控,将它启动起来。如果是长时间宕机了,那么datanode上的数据应该已经被备份到其他机器了,那这台datanode就是一台新的datanode了,删除他的所有数据文件和状态文件,重新启动。
(8)Hadoop 的 namenode 宕机,怎么解决?
先分析宕机后的损失,宕机后直接导致client无法访问,内存中的元数据丢失,但是硬盘中的元数据应该还存在,如果只是节点挂了,重启即可,如果是机器挂了,重启机器后看节点是否能重启,不能重启就要找到原因修复了。
但是最终的解决方案应该是在设计集群的初期就考虑到这个问题,做namenode的HA。
14.3 YARN
(1)简述yarn流程
1) 用户向YARN 中提交应用程序, 其中包括ApplicationMaster 程序、启动ApplicationMaster 的命令、用户程序等。
2) ResourceManager 为该应用程序分配第一个Container, 并与对应的NodeManager 通信,要求它在这个Container 中启动应用程序的ApplicationMaster。
3) ApplicationMaster 首先向ResourceManager 注册, 这样用户可以直接通过ResourceManage 查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
4) ApplicationMaster 采用轮询的方式通过RPC 协议向ResourceManager 申请和领取资源。
5) 一旦ApplicationMaster 申请到资源后,便与对应的NodeManager 通信,要求它启动任务。
6) NodeManager 为任务设置好运行环境(包括环境变量、JAR 包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
7) 各个任务通过某个RPC 协议向ApplicationMaster 汇报自己的状态和进度,以让ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC 向ApplicationMaster 查询应用程序的当前运行状态。
8) 应用程序运行完成后,ApplicationMaster 向ResourceManager 注销并关闭自己
14.4 MapReduce
(1)在hadoop中定义的主要公用InputFormats中,哪一个是默认值:
- (A)TextInputFormat
- (B)KeyValueInputFormat
- (C)SequenceFileInputFormat
答案:A
(2)两个类TextInputFormat和KeyValueTextInputFormat的区别?
- FileInputFormat的子类
- TextInputFormat(默认类型,键是LongWritable类型,值为Text类型,key为当前行在文件中的偏移量,value为当前行本身);
- KeyValueTextInputFormat(适合文件自带key,value的情况,只要指定分隔符即可,比较实用,默认是分割);
(3)在一个运行的hadoop任务中,什么是InputSpilt?
答案:InputSplit是MapReduce对文件进行处理和运算的输入单位,只是一个逻辑概念,每个InputSplit并没有对文件实际的切割,只是记录了要处理的数据的位置(包括文件的path和hosts)和长度(由start和length决定),默认情况下与block一样大。
拓展:需要在定义InputSplit后,展开讲解mapreduce的原理
(4)分别举例什么情况下使用combiner,什么情况下不会使用?
答案:Combiner适用于对记录汇总的场景(如求和),但是,求平均数的场景就不能使用Combiner了
(5)Hadoop中job和Tasks之间的区别是什么?
答案:job是工作的入口,负责控制、追踪、管理任务,也是一个进程,包含maptask和reducetask。Tasks是map和reduce里面的步骤,主要用于完成任务,也是线程。
(6)Map阶段结束后,Hadoop框架会处理:Partitioning,shuffle和sort,在这个阶段都会发生了什么?
答案:MR一共有四个阶段,splitmapshuffreduce在执行完map之后,可以对map的输出结果进行分区,
- 分区:这块分片确定到哪个reduce去计算(汇总)
- 排序:在每个分区中进行排序,默认是按照字典顺序。
- Group:在排序之后进行分组
14.5 HBase
(1)Hbase 的特性,以及你怎么去设计 rowkey 和 columnFamily ,怎么去建一个table
因为hbase是列式数据库,列非表schema的一部分,所以在设计初期只需要考虑rowkey 和 columnFamily即可,rowkey有位置相关性,所以如果数据是练习查询的,最好对同类数据加一个前缀,而每个columnFamily实际上在底层是一个文件(HFile),那么文件越小,查询越快,所以讲经常一起查询的列设计到一个列簇,但是列簇不宜过多。
14.6 Hive
(1)insert into 和 override write区别?
insert into:将某一张表中的数据写到另一张表中
override write:覆盖之前的内容。
(2)你自己写过udf函数么?写了哪些?
参考答案:最近感受了hive的udf函数的强大威力了,不仅可以使用很多已经有的udf函数,还可以自己定义符合业务场景的udf函数。下面举个最简单的自定义UDF函数例子
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public final class Lower extends UDF {
public Text evaluate(final Text s) {
if (s == null) { return null; }
return new Text(s.toString().toLowerCase());
}
}
(3)hive 中的压缩格式 RCFile、TextFile、SequenceFile 各有什么区别?
- TextFile:Hive默认格式,不作压缩,磁盘及网络开销较大。可以结合Gzip, Bzip2使用,但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。
- SequenceFile: SequenceFile 是Hadoop API提供支持的一种二进制文件,具有使用方便,可分割,可压缩的特点,支持三种压缩选择:NONE, RECORD, BLOCK。RECORD压缩率低,一般建议使用BLOCK压缩。
- RCFILE: RCFILE是一种行列存储相结合的的存储方式。首先,将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩。
- 总结:相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入,多次读取,因此,整体来看,RCFILE相比两它两种格式,具有较明显的优势。
14.7 数据处理
(1)有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M,要求返回频数最高的100个词。
- 1). 顺序读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件(记为f0 ,f1 ,… ,f4999)中,这样每个文件大概是200k左右,如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过1M;
- 2). 对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个结点的最小堆),并把100词及相应的频率存入文件,这样又得到了5000个文件;
- 3). 把这5000个文件进行归并(类似与归并排序);
(2)现有海量日志数据保存在一个超级大的文件中,该文件无法直接读入内存,要求从中提取某天出访问百度次数最多的那个IP。
思路:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。
- 1)从这一天的日志数据中把访问百度的IP取出来,逐个写入到一个大文件中;
- 2)注意到IP是32位的,最多有2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件;
- 3)找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率;
- 4)在这1000个最大的IP中,找出那个频率最大的IP,即为所求。
(3)有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
- 方案1: 顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。 找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件中。这样得到了10个排好序的文件(记为)。对这10个文件进行归并排序(内排序与外排序相结合)。
- 方案2: 一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。
- 方案3: 与方案1类似,但在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。
(4)腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 思路1:同样采用位图,40忆个不重复的数,每个数用1bit表示,出现或不出现,40*10^8*1 = 0.5G大小。遍历这40忆个数,如果出现将对应位置为1,对于给定的数直接判断位图中对应的值。
- 思路2:编程珠玑上的一个思路。将每个整数都看成32位的二进制数,从最高位,依次按位来分,按最高位0,1分成两个文件,每个文件数字个数小于20亿,与所要判断的数的最高为进行比较,从而知道去哪个文件继续比较,然后对于选定的文件再按照次高位比较再分成2个文件,再比较判断数对应的位数,依次循环,直到最后一位,就可以找到或判断没有该数了。时间复杂度O(log2n),因为每次都将数据减少一半,直到最后一个。
14.8 综合
(1)Redis,传统数据库,hbase,Hive 每个之间的区别
redis是缓存,围绕着内存和缓存说
Hbase是列式数据库,存在hdfs上,围绕着数据量来说
hive是数据仓库,是用来分析数据的,不是增删改查数据的。
(2)hadoop HA 两个namenode和zk之间的通信,zk的选举机制?
HA是通过先后获取zk的锁决定谁是主
Zk的选举机制,涉及到全新机群的选主和数据恢复的选主