大数据面试

Link

由 张黄淳创建, 最后修改于三月 06, 2023

1、(越多越好)简述你了解的Hadoop以及相关大数据生态中的组件

参考答案:

HDFS:HDFS是Hadoop的分布式文件系统(Hadoop Distributed File System),具备高度容错特性,支持高吞吐量数据访问,可以在处理海量数据的同时最大可能的降低成本。HDFS适用于大规模数据的分布式读写,特别是读多写少的场景

Yarn:YARN是一个分布式的资源管理系统,YARN是Hadoop系统的核心组件,主要功能包括负责在Hadoop集群中的资源管理,负责对作业进行调度运行以及监控

Hive:Hive是一个基于Hadoop的数据仓库框架,在大数据业务场景中,主要用来进行数据提取、转化和加载(ETL)以及元数据管理。Hive定义了简单的类SQL查询语言,称为HiveQL,它允许熟悉SQL的用户查询数据

Hbase:HBase是一个开源的、面向列(Column-Oriented)、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系统,Hbase是 Google BigTable 的开源实现,HBase 利用 Hadoop HDFS 作为其文件存储系统,Zookeeper 来做协同服务4

Spark: Spark是一个开源的,并行数据处理框架,使用Scala语言编写,能够帮助用户简单、快速的开发,统一的大数据应用,对数据进行离线处理,流式处理,交互式分析等等

Impala:Impala是一个分布式查询引擎,为存储在Apache Hadoop中的数据,提供了高性能和低延迟的SQL查询。 使用Impala,您可以通过SELECT、JOIN和聚合函数实时查询存储在HDFS或HBase中的数据

Ranger:Ranger提供集中式的权限管理框架,可以对Hadoop生态中的HDFS、Hive和YARN等组件进行细粒度的权限访问控制,并且提供了Web UI方便管理员操作。

Kudu:Kudu是专为Apache Hadoop平台开发的列式存储管理器,具有Hadoop生态系统应用程序的共同技术特性:在通用的商用硬件上运行,可水平扩展,提供高可用性


2、说说你了解的各组件中的常用的默认端口(不做硬性要求,用来看看经验和熟悉程度)

参考答案:

以下为大致的常用,详细些的参考 https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/cdh_ports.html

HDFS 8020/9866

Yarn 8088

Hbase 16000/16020/9090

Hive 10000

Hue 8888

Impala 21050/21000

Kudu 7051/7050/8051/8050

ZooKeeper 2181


3、简述非高可用HDFS集群中都分别需要启动哪些具体组件,他们的作用分别都是什么

参考答案:

NameNode:用于管理文件系统的命名空间、维护文件系统的目录结构树以及元数据信息,记录写入的每个数据块(Block)与其归属文件的对应关系。此信息以命名空间镜像(FSImage)和编辑日志(EditsLog)两种形式持久化在本地磁盘中。

DataNode:DataNode是文件的实际存放位置。DataNode会根据NameNode或Client的指令来存储或者提供数据块,并且定期的向NameNode汇报该DataNode存储的数据块信息。

Secondary NameNode:对于非高可用集群,默认会启动一个Secondary NameNode进程。Secondary NameNode的作用是消费EditsLog,定期地合并FsImage和EditsLog,生成新的FsImage文件,降低了NameNode的压力。


4、简述高可用HDFS集群中还需要启动哪些具体组件,他们的作用分别都是什么

参考答案:

ZKFailoverController: ZKFC是需要和NameNode一一对应的服务,即每个NameNode都需要部署ZKFC。它负责监控NameNode的状态,并及时把状态写入ZooKeeper。ZKFC也有选择谁作为Active NameNode的权利

Standby NameNode:一组NameNode服务中,由一个Active状态的NameNode(主NameNode)提供读写服务,其他NameNode为Standby状态(备NameNode)。只有主NameNode才能对外提供读写服务。

JournalNode:存放NameNode的edits log,一般3台Journal为一组。当两台JournalNode同时健康、可写入的情况下,NameNode才可提供服务。

ZooKeeper:ZKFC基于ZooKeeper提供的能力实现选举,同时其他Hadoop组件的HA也会依赖ZooKeeper。


5、简述Yarn集群中都分别需要启动哪些具体组件,他们的作用分别都是什么

参考答案:

ResourceManager:负责集群的资源管理与调度,为运行在YARN上的各种类型作业分配资源

NodeMananger :负责节点的资源管理、监控和作业运行,一方面,会定时向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,接收并处理来自AM的Container启动/停止等请求


6、聊聊HDFS中大量小文件带来的问题以及解决方法

参考答案:
hadoop中目录,文件和块都会以对象的形式保存在namenode的内存中, 大概每个对象会占用150bytes. 小文件数量多会大量占用namenode的内存; 使namenode读取元数据速度变慢, 启动时间延长; 还因为占用内存过大, 导致gc时间增加等。
解决办法分两个角度, 一是从根源解决小文件的产生, 二是解决不了就选择合并。
从数据来源入手, 如每小时抽取一次改为每天抽取一次等方法来积累数据量。
如果小文件无可避免, 一般就采用合并的方式解决. 可以写一个MR任务读取某个目录下的所有小文件, 并重写为一个大文件。


7、(大致估算即可)HDFS元数据都会存在于NameNode的内存中,因此NameNode的内存大小直接决定了集群支持的最大容量,那么如何估算NameNode需要的内存大小?比如一个含有200个节点的集群,每个节点有24TB的磁盘,每个Block的大小为128MB,每个块有3个副本,那么请问,在这种场景下需要NameNode的内存大小为多少?
前提条件:一般1GB内存可以管理100万个block文件

参考答案:
先计算块文件的个数;200*25165824MB(24TB)/128*3=13107200 一般1GB内存可以管理100万个block文件 参照该方法计算最终大概需要13.1072GB的内存,所以在选择NameNode内存时要选择一个大于该值的一个合理的整数值


8、聊聊hive 内部表和外部表的区别

参考答案:
未被 external 修饰的是内部表,被 external 修饰的为外部表。

区别:内部表数据由 Hive 自身管理,外部表数据由 HDFS 管理;

内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有 LOCATION,Hive 将在 HDFS 上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);

删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS 上的文件并不会被删除。


9、聊聊对Parquet、ORC的了解

参考答案:

他们是高性能的列式存储格式,能带来存储和性能上的提升压缩比更高,IO操作更少

他们是以二进制方式存储的,是不可以直接读取和修改的,也是自解析的,文件中包括该文件的数据和元数据。

(不做要求)区别:Parquet对嵌套结构的数据模型支持更好,ORC一定程度上支持ACID,索引信息更加精确


10、聊聊Impala和Hive的关系(异同)

参考答案:

同:

都支持查询HDFS/Hbase,使用相同的元数据,都使用通过词法解析生成执行计划

Impala兼容HiveSQL,提供兼容的JDBC接口,

异:

Impala不依赖MapReduce,

Impala尽量内存进行计算

Impala任务调度由自己完成

Impala主要使用C++编写

Hive适合复杂的批处理任务,Impala适合实时交互式数据分析


9、简述Impala中的具体组件,他们的作用是什么

参考答案:

Impala Daemon(impalad):impalad是impala主要的工作计算进程,负责接收client的请求,变成协调者角色,然后解析查询请求,拆分成不同的任务分发给其他的Impalad节点进程。每个Impalad工作节点进程接收到请求后,开始执行本地查询(比如查询hdfs的datanode或者hbase的region server),查询结果返回给协调者。协调者搜集到请求数据合并返回给client。每个Impalad又包含三种角色,当接收到client的请求时,由planner解析查询sql,拆分成一个个可以并行的小任务;然后通过coordinator发送给其他的节点;其他的节点接收请求后,由excutor执行本地查询

Statestore Daemon:元数据变化同步进程,由于每个impalad都可以作为coordinator角色,那么当一个节点接收到数据变更,比如alter指令,其他的节点如何知晓呢?就可以通过catalog来同步,每个节点的变化都通知给catlog进程,它再同步给其他的节点,每个节点都维护一份最新的元数据信息,这样就不怕查询的数据不一致了

Catalog Daemon:元数据变化同步进程,由于每个impalad都可以作为coordinator角色,那么当一个节点接收到数据变更,比如alter指令,其他的节点如何知晓呢?就可以通过catalog来同步,每个节点的变化都通知给catlog进程,它再同步给其他的节点,每个节点都维护一份最新的元数据信息,这样就不怕查询的数据不一致了


10、假设Hive表有数据,Impala 查询不到数据或者看不到表,说说为什么,用什么命令处理

参考答案:

Impala通过多个impalad同时提供服务的方式,并且它会由catalogd缓存全部元数据,再通过statestored完成每一次的元数据的更新到impalad节点上,Impala集群会缓存全部的元数据,这种缓存机制就导致通过其他手段更新元数据或者数据对于Impala是无感知的,例如通过hive建表,直接拷贝新的数据到HDFS上等,Impala提供了两种机制来实现元数据的更新,分别是INVALIDATE METADATA和REFRESH操作


11、聊聊Impala中INVALIDATE METADATA和REFRESH区别

参考答案:

INVALIDATE METADATA:作废表的元数据和块的位置数据。下一次对元数据无效的表执行查询时,Impala会在查询之前重新加载相关的元数据

invalid metadata是用于刷新全库或者某个表的元数据,包括表的元数据和表内的文件数据,它会首先清楚表的缓存,然后从metastore中重新加载全部数据并缓存,该操作代价比较重,主要用于在hive中修改了表的元数据,需要同步到impalad,例如create table/drop table/alter table add columns等

适用于

当前Impala节点不知道的Hive表,如在Hive中create了新表或新库。

可用于刷新整个库的所有表。
看看是否了解)在生产中应避免使用INVALIDATE METADATA什么都不加。对于具有大量数据或有许多分区的表而言,检索表的所有元数据可能非常耗时,且都加载到内存也非常浪费空间。


REFRESH:刷新特定表的最新元数据和块的位置数据,用于刷新某个表或者某个分区的数据信息,它会重用之前的表元数据,仅仅执行文件刷新操作,它能够检测到表中分区的增加和减少,主要用于表中元数据未修改,数据的修改,例如INSERT INTO、LOAD DATA、ALTER TABLE ADD PARTITION、LLTER TABLE DROP PARTITION等,如果直接修改表的HDFS文件(增加、删除或者重命名)也需要指定REFRESH刷新数据信息

适用于

当前Impala节点已经知道的Hive表,在Hive中执行ALTER TABLE,INSERT,LOAD DATA语句之后,如ALTER TABLE ADD/DROP PARTITION语句,Hive表在HDFS上某个分区目录数据发生变化后。
REFRESH必须指定一个表。即:不能用于刷新整个库的所有表。
REFRESH是增量更新,比INVALIDATE METADATA代价要小很多,在既能使用REFRESH也能使用INVALIDATE METADATA的场景下,用REFRESH


12、聊聊Hbase的组件和作用

参考答案:

Zookeeper:

1.zookeeper的选举机制保证任何时候,集群中只有一个master

2.实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master

3.存储Hbase的schema

4.存贮所有Region的寻址入口

Master:

1.为Region server分配region

2.负责region server的负载均衡

3.发现失效的region server并重新分配其上的region

4.处理schema(元数据)更新请求

说明:Hmaster短时间下线,hbase集群依然可用,长时间不行。

Region server:

1.Region server维护Master分配给它的region,处理对这些region的IO请求

2.Region server负责切分在运行过程中变得过大的region


13、说说Hbase优缺点或应用场景

优点:

半结构化或非结构化数据: 对于数据结构字段不够确定或杂乱无章非常难按一个概念去进行抽取的数据适合用HBase,因为HBase支持动态添加列。

记录很稀疏:RDBMS的行有多少列是固定的。为null的列浪费了存储空间。HBase为null的Column不会被存储,这样既节省了空间又提高了读性能。

仅要求最终一致性:对于数据存储事务的要求不像金融行业和财务系统这么高,只要保证最终一致性就行

高可用和海量数据以及很大的瞬间写入量:WAL解决高可用,支持PB级数据,put性能高 适用于插入比查询操作更频繁的情况。比如,对于历史记录表和日志文件。(HBase的写操作更加高效)

业务场景简单:不需要太多的关系型数据库特性,列入交叉列,交叉表,事务,连接等

缺点:

单一RowKey固有的局限性决定了它不可能有效地支持多条件查询

不适合于大范围扫描查询

不直接支持 SQL 的语句查询


14、简述Hbase写数据流程

1.Client先访问zookeeper,找到Meta表,并获取Meta表元数据。确定当前将要写入的数据所对应的HRegion和HRegionServer服务器。

2.Client向该HRegionServer服务器发起写入数据请求。

3.Client先把数据写入到HLog,以防止数据丢失,然后将数据写入到Memstore。

4.Memstore达到阈值,会把Memstore中的数据flush到Storefile中

5.当Storefile越来越多,达到一定数量时,会触发Compact合并操作,将多个小文件合并成一个大文件。

6.Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,变成两个文件。

说明:hbasez支持数据修改(伪修改),实际上是相同rowkey数据的添加。hbase只显示最后一次的添加


15、简述Hbase读数据流程

1.Client先访问zookeeper,找到Meta表,并获取Meta表元数据

2.Client找到region 获取region和regionserver的对应关系,直接到regionserver读取region数据


16、spark几种常见的运行模式,一般hadoop集群内用哪种

local/standalone/yarn/k8s

spark on yarn


17、聊聊spark on yarn中client和master模式区别

Yarn Cluster模式的driver进程托管给Yarn(AppMaster)管理,通过yarn UI或者Yarn logs命令查看日志

Yarn Client模式的driver进程运行在本地客户端,因资源调度、任务分发会和Yarn集群产生大量网络通信,出现网络激增现象,适合本地调试,不建议生产上使用