大数据常见面试题
1. hadoop 架构

Hadoop1.0版本两个核心:HDFS+MapReduce Hadoop2.0版本,引入了Yarn。核心:HDFS+Yarn+Mapreduce Yarn是资源调度框架。能够细粒度的管理和调度任务。此外,还能够支持其他的计算框架,比如spark等。
namenode:管理集群并记录datanode的元数据,相应客户端的请求。 seconder namenode:对namenode一定范围内的数据做一份快照性备份。 datanode:存储数据。 jobTracker:管理客户端提交的任务,并将任务分配给TaskTracker。 TaskTracker:执行各个Task。
组件说明:
-
Namenode:也叫名称节点,是HDFS的守护程序(一个核心程序),对整个分布式文件系统进行总控制,会纪录所有的元数据分布存储的状态信息,比如文件是如何分割成数据块的,以及这些数据块被存储到哪些节点上,还有对内存和I/O进行集中管理,用户首先会访问Namenode,通过该总控节点获取文件分布的状态信息,找到文件分布到了哪些数据节点,然后在和这些节点打交道,把文件拿到。故这是一个核心节点。 不过这是个单点,发生故障将使集群崩溃。
-
Secondary Namenode:辅助名称节点,或者检查点节点,它是监控HDFS状态的辅助后台程序,可以保存名称节点的副本,故每个集群都有一个,它与NameNode进行通讯,定期保存HDFS元数据快照。NameNode故障可以作为备用NameNode使用,目前还不能自动切换。但是功能绝不仅限于此。所谓后备也不是它的主要功能。后续详细解释。
-
DataNode:叫数据节点,每台从服务器节点都运行一个,负责把HDFS数据块读、写到本地文件系统。这三个东西组成了Hadoop平台其中一个支柱——HDFS体系。
-
JobTracker:叫作业跟踪器,运行到主节点(Namenode)上的一个很重要的进程,是MapReduce体系的调度器。用于处理作业(用户提交的代码)的后台程序,决定有哪些文件参与作业的处理,然后把作业切割成为一个个的小task,并把它们分配到所需要的数据所在的子节点。 Hadoop的原则就是就近运行,数据和程序要在同一个物理节点里,数据在哪里,程序就跑去哪里运行。这个工作是JobTracker做的,监控task,还会重启失败的task(于不同的节点),每个集群只有唯一一个JobTracker,类似单点的nn,位于Master节点(稍后解释Master节点和slave节点)。
-
TaskTracker:叫任务跟踪器,MapReduce体系的最后一个后台进程,位于每个slave节点上,与datanode结合(代码与数据一起的原则),管理各自节点上的task(由jobtracker分配),每个节点只有一个tasktracker,但一个tasktracker可以启动多个JVM,用于并行执行map或reduce任务,它与jobtracker交互通信,可以告知jobtracker子任务完成情况。
Master与Slave: Master节点:运行了Namenode、或者Secondary Namenode、或者Jobtracker的节点。还有浏览器(用于观看管理界面),等其它Hadoop工具。Master不是唯一的! Slave节点:运行Tasktracker、Datanode的机器。
2. hadoop安装
改IP,修改Host文件; 装JDK配置环境变量; 装Hadoop配置环境变量; 修改hadoop的配置文件如core-site、marp-site、yarn-site、dfs-site等; namenode进行格式化; start-all;
3. MapReduce
MapReduce 就是将输入进行分片,交给不同的 Map 任务进行处理,然后由 Reduce 任务合并成最终的解。 Shuffle意义在于将不同map处理后的数据进行合理分配,让reduce处理,从而产生了排序、分区。



MapReduce 的实际处理过程可以分解为 Input、Map、Sort、Combine、Partition、Reduce、Output 等阶段,具体的工作流程如图 1 所示。

在 Input 阶段,框架根据数据的存储位置,把数据分成多个分片(Splk),在多个结点上并行处理。
Map 任务通常运行在数据存储的结点上,也就是说,框架是根据数据分片的位置来启动 Map 任务的,而不是把数据传输到 Map 任务的位置上。这样,计算和数据就在同一个结点上,从而不需要额外的数据传输开销。
在 Map 阶段,框架调用 Map 函数对输入的每一个 <key,value> 进行处理,也就是完成 Map<K1,V1>→List(<K2,V2>) 的映射操作。图 1 为找每个文件块中每个字母出现的次数,其中,K1 表示字母,V2 表示该字母出现的次数。
在 Sort 阶段,当 Map 任务结束以后,会生成许多 <K2,V2>形式的中间结果,框架会对这些中间结果按照键进行排序。图 1 就是按照字母顺序进行排序的。
在 Combine 阶段,框架对于在 Sort 阶段排序之后有相同键的中间结果进行合并。合并所使用的函数可以由用户进行定义。在图 1 中,就是把 K2 相同(也就是同一个字母)的 V2 值相加的。这样,在每一个 Map 任务的中间结果中,每一个字母只会出现一次。
在 Partition 阶段,框架将 Combine 后的中间结果按照键的取值范围划分为 R 份,分别发给 R 个运行 Reduce 任务的结点,并行执行。分发的原则是,首先必须保证同一个键的所有数据项发送给同一个 Reduce 任务,尽量保证每个 Reduce 任务所处理的数据量基本相同。
在图 1 中,框架把字母 a、b、c 的键值对分别发给了 3 个 Reduce 任务。框架默认使用 Hash 函数进行分发,用户也可以提供自己的分发函数。
在 Reduce 阶段,每个 Reduce 任务对 Map 函数处理的结果按照用户定义的 Reduce 函数进行汇总计算,从而得到最后的结果。在图 1 中,Reduce 计算每个字母在整个文件中出现的次数。只有当所有 Map 处理过程全部结束以后,Reduce 过程才能开始。
在 Output 阶段,框架把 Reduce 处理的结果按照用户指定的输出数据格式写入 HDFS 中。
4. JobTracker/TaskTracker
Hadoop MapReduce采用Master/Slave结构。 Master: 是整个集群的唯一的全局管理者,功能包括:作业管理、状态监控和任务调度等,即MapReduce中的JobTracker。 Slave: 负责任务的执行和任务状态的回报,即MapReduce中的TaskTracker。
- JobTracker是一个master服务,软件启动之后JobTracker接收Job,负责调度Job的每一个子任务task运行于TaskTracker上, 并监控它们,如果发现有失败的task就重新运行它。一般情况应该把JobTracker部署在单独的机器上。
- TaskTracker是运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。
JobTracker 对应于 NameNode,TaskTracker 对应于 DataNode DataNode 和NameNode 是针对数据存放来而言的。 JobTracker和TaskTracker是对于MapReduce执行而言的。
5. Mapreduce 的 map 数量 和 reduce 数量 怎么确定 ,怎么配置?
map的数量有数据块决定,reduce数量随便配置。
6.mapreduce怎么处理数据倾斜问题?
数据倾斜: map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长, 这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多, 从而导致某几个节点迟迟运行不完,此称之为数据倾斜。
解决: 自己实现partition类,用key和value相加取hash值。
7. 什么是shuffle?
map阶段处理的数据如何传递给reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle; shuffle: 洗牌、发牌——(核心机制:数据分区,排序,缓存); 具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序;
8.什么是yarn?
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而mapreduce等运算程序则相当于运行于操作系统之上的应用程序。

1、 ResourceManager(RM) YARN 分层结构的本质是 ResourceManager。这个实体控制整个集群并管理应用程序向基础计算资源的分配。ResourceManager 将各个资源部分(计算、内存、带宽等)精心安排给基础 NodeManager(YARN 的每节点代理)。ResourceManager 还与 ApplicationMaster 一起分配资源,与 NodeManager 一起启动和监视它们的基础应用程序。在此上下文中,ApplicationMaster 承担了以前的 TaskTracker 的一些角色,ResourceManager 承担了 JobTracker 的角色。
总的来说,RM有以下作用 1)处理客户端请求 2)启动或监控ApplicationMaster 3)监控NodeManager 4)资源的分配与调度
2、 ApplicationMaster(AM) ApplicationMaster 管理在YARN内运行的每个应用程序实例。ApplicationMaster 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器的执行和资源使用(CPU、内存等的资源分配)。请注意,尽管目前的资源更加传统(CPU 核心、内存),但未来会带来基于手头任务的新资源类型(比如图形处理单元或专用处理设备)。从 YARN 角度讲,ApplicationMaster 是用户代码,因此存在潜在的安全问题。YARN 假设 ApplicationMaster 存在错误或者甚至是恶意的,因此将它们当作无特权的代码对待。
总的来说,AM有以下作用
1)负责数据的切分
2)为应用程序申请资源并分配给内部的任务
3)任务的监控与容错
** 3、 NodeManager(NM)** NodeManager管理YARN集群中的每个节点。NodeManager 提供针对集群中每个节点的服务,从监督对一个容器的终生管理到监视资源和跟踪节点健康。MRv1 通过插槽管理 Map 和 Reduce 任务的执行,而 NodeManager 管理抽象容器,这些容器代表着可供一个特定应用程序使用的针对每个节点的资源。

** 4、 Container** Container 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。

1、用户提交的程序的运行逻辑对yarn是透明的,yarn并不需要知道。 2、yarn只提供运算资源的调度(用户程序向yarn申请资源,yarn就负责分配资源)。 3、yarn中的老大叫ResourceManager(知道所有小弟的资源情况,以做出资源分配),yarn中具体提供运算资源的角色叫NodeManager(小弟)。 4、yarn与运行的用户程序完全解耦,就意味着yarn上可以运行各种类型的分布式运算程序(mapreduce只是其中的一种),比如mapreduce、storm程序,spark程序...只要他们各自的框架中有符合yarn规范的资源请求机制即可。 6、Yarn是一个通用的资源调度平台,企业中存在的各种运算集群都可以整合在一个物理集群上,提高资源利用率,方便数据共享。 7、Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而mapreduce等运算程序则相当于运行于操作系统之上的应用程序。
9. namenode / datanode 宕机,怎么解决?
namenode 宕机: 先分析宕机后的损失,宕机后直接导致client无法访问,内存中的元数据丢失,但是硬盘中的元数据应该还存在,如果只是节点挂了, 重启即可,如果是机器挂了,重启机器后看节点是否能重启,不能重启就要找到原因修复了。 但是最终的解决方案应该是在设计集群的初期就考虑到这个问题,做namenode的HA。
datanode宕机: Datanode宕机了后,如果是短暂的宕机,可以实现写好脚本监控,将它启动起来。如果是长时间宕机了,那么datanode上的数据应该已经被备份到其他机器了, 那这台datanode就是一台新的datanode了,删除他的所有数据文件和状态文件,重新启动。
9. secondarynamenode的主要职责是什么?简述其工作机制
sn的主要职责是执行checkpoint操作 每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过程称为checkpoint)。
12. hive内部表和外部表的区别
内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除 外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。
13. Hbase
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;
HDFS: 1、一次性写入,多次读取。 2、保证数据的一致性。 3、主要是可以部署在许多廉价机器中,通过多副本提高可靠性,提供了容错和恢复机制。 Hbase: 1、瞬间写入量很大,数据库不好支撑或需要很高成本支撑的场景。 2、数据需要长久保存,且量会持久增长到比较大的场景 3、hbase 不适用与有 join,多级索引,表关系复杂的数据模型 4、大数据量 (100s TB 级数据) 且有快速随机访问的需求。 如:淘宝的交易历史记录。数据量巨大无容置疑,面向普通用户的请求必然要即时响应。 5、容量的优雅扩展 大数据的驱使,动态扩展系统容量的必须的。例如:webPage DB。 6、业务场景简单,不需要关系数据库中很多特性(例如交叉列、交叉表,事务,连接等等) 7、优化方面:合理设计 rowkey。因为 hbase 的查
14. storm
storm的设计模式,是基于work、excutor、task的方式运行代码,由spout、bolt组成等等。
水平扩展:通过加机器、提高并发数就提高处理能力 自动容错:自动处理进程、机器、网络异常 实时:数据不写磁盘,延迟低(毫秒级) 流式:不断有数据流入、处理、流出


15. spark
spark会替代mr,不会代替yarn和hdfs. 公司之后倾向用spark 开发,你会么(就用java代码去写) 会,spark使用scala开发的,在scala中可以随意使用jdk的类库,可以用java开发,但是最好用原生的scala开发,兼容性好,scala更灵活。
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。 Spark特点:
- 基于内存的分布式计算模型。轻量级快速处理。
- 很适用于数据挖掘与机器学习等需要迭代场景。
- 可以方便地和Hadoop整合。
- 快速的实时的流处理

16. ES
www.elastic.co/guide/index… 官网 github.com/elastic/ela… www.elastic.co/guide/en/el… www.elastic.co/cn/download… blog.csdn.net/laoyang360/… Elasticsearch基础
ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据
ES数据架构的主要概念(与关系数据库Mysql对比)
