整理的一点面试题

Posted Vics异地我就

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整理的一点面试题相关的知识,希望对你有一定的参考价值。

Hive优化
属性优化 本地模式 JVM重用 推测执行 Fetch抓取 并行执行 压缩矢量化查询 零拷贝 关联优化 CBO优化器 小文件处理 索引优化 谓词下推
推测执行机制是什么
在作业执行的过程中数据倾斜发生的可能性是很大的,甚至有可能只有一个task执行到50%,但是其他task早早执行完毕了。
这就需要推测执行,hadoop的推测执行机制会给这些有可能需要长时间才可以执行完的task准备一个备份,一旦task执行缓慢,那么备份task也会执行task的工作,看哪个先执行完就使用哪个的结果。
但是如果数据量过于庞大,备份task有可能直接打垮集群。
Yarn的调度模式有哪些
FIFO调度器

先进先出,但不适合资源公平性

容量调度器

独立的专门队列保证小作业也可以提交后就启动,队列容量是专门保留的

以整个集群的利用率为代价,与FIFO比,大作业执行的时间要长

公平调度器

不需要预留资源,调度器可以在运行的作业之间动态平衡资源,大作业启动时,因为是唯一运行的,所以获得集群的所有资源,之后小作业启动时,被分配到集群的一半的资源,这样每个作业都能公平共享资源
Orderby 和sort by 的区别
Order by 是全局排序
Sort by 是分组排序

UDF UDTF UDAF函数区别
分类
1、用户定义函数(user-defined function)UDF;
2、用户定义聚集函数(user-defined aggregate function,UDAF);
3、用户定义表生成函数(user-defined table-generating function,UDTF)。

UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。
UDAF 接受多个输入数据行,并产生一个输出数据行。像COUNT和MAX这样的函数就是聚集函数。
UDTF 操作作用于单个数据行,并且产生多个数据行-------一个表作为输出。lateral view explore()
简单来说:
UDF:返回对应值,一对一
UDAF:返回聚类值,多对一
UDTF:返回拆分值,一对多
MR的流程
client端提交job给jobtracker,jobtracker会给这个job分配资源,在tasktracker上启动task任务,而且还要监控task任务的状况,如果task挂了,jobtracker还得重新分配新的资源给挂了的task任务,当task执行完成后,jobtracker会为reduce任务分配资源,然后监控reduce的执行流程,最后执行完成输出。

hadoop 2.x 用yarn框架,使资源的调度和监控分开,并且实现了resourcemanager的HA(通过zkfc进程和zookeeper管理实现)。
MR中有几次排序,分别是什么
3次排序。
第一次 快速排序
第二三次 归并排序
小文件的处理方式?
设置Hive中底层MapReduce读取数据的输入类:将所有文件合并为一个大文件作为输 入 hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputF ormat;
#如果hive的程序,只有maptask,将MapTask产生的所有小文件进行合并
分层有哪些,每层的功能是什么
ODS
DWD
DWM
DWS
APP
DIM
源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。

细节层(DWD):为数据仓库层,DW 层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。

集市层(DWS):为数据进行小粒度的聚合,就是处理一些宽表,具体宽表,用户行为宽表,用户购买商品

应用层(DWS):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。

    数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。

    顺便提一下关于数据仓库与数据库的区别:

数据库是面向事务的设计,数据仓库是面向主题设计的。
数据库一般存储业务数据,数据仓库存储的一般是历史数据。
数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的 User 表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
DIM
维度数据表 存储维度表的
Hive中最重要的功能是什么?
元数据映射
窗口函数有哪几类?
聚合函数
排序开窗函数
分析窗口函数
机架感知的副机制
通常,大型 Hadoop 集群是以机架的形式来组织的,同一个机架上不同 节点间的网络状况比不同机架之间的更为理想。 另外, NameNode 设法将 数据块副本保存在不同的机架上以提高容错性。
而 HDFS 不能够自动判断集群中各个 datanode 的网络拓扑情况 Hadoop 允 许集群的管理员通过配置 dfs.network.script 参数来确定节点所处的机架。 文 件提供了 IP->rackid 的翻译。 NameNode 通过这个得到集群中各个 datanode 机器的 rackid 。 如果 topology.script.file.name 没有设定,则每个 IP 都会翻译 成 / default-rack 。
有了机架感知, NameNode 就可以画出上图所示的 datanode 网络拓扑图。 D1,R1 都是交换机,最底层是 datanode 。 则 H1 的 rackid=/D1/R1/H1 , H1 的 parent 是 R1 , R1 的是 D1 。 这些 rackid 信息可以通过 topology.script.file.name 配置。有了这些 rackid 信息就可以计算出任意两台 datanode 之间的距离。
distance(/D1/R1/H1,/D1/R1/H1)=0 相同的 datanode
distance(/D1/R1/H1,/D1/R1/H2)=2 同一 rack 下的不同 datanode
distance(/D1/R1/H1,/D1/R1/H4)=4 同一 IDC 下的不同 datanode
distance(/D1/R1/H1,/D2/R3/H7)=6 不同 IDC 下的 datanode
什么是拉链表
在源数据发生变化时,给维度记录建立一个新的“版本”记录,从而维护维度历史。SCD2不删除、不修改已存在的数据。SCD2也叫拉链表。

什么是上卷和下钻
维度中有不同的层次,每个层次可以有多个级别,这样就可以根据多个维护层次和级别进行分析,可以灵活获取高级别的汇总信息,获取低级别的明细信息,把获取高级别的汇总信息的过程叫上卷,把获取低级别的明细信息的过程叫下钻,比如:课程访问量分析,时间维度有四个级别,分别是年、月、天、小时,现在我们某个级别分析每天的课程访问量,比如按天分析课程访问量,此时我们可以按小时下钻分析,得出一天内每小时的课程访问量,也可以按月上卷,得到月度的课程访问量。

下钻维度:
天、小时
上卷维度:
年、月

为什么要使用分区?
提高查询效率,ODS start_time/dt, DWD->DWS 年月日
如果要插入的数据较多,指定分区进行插入过程繁琐,如何解决?
动态分区
静态分区和动态分区的区别?
静态分区,插入要指定值;动态分区,自动分配值。创建表时是没有区别的。
插入数据时,如果静态分区和动态分区一起使用,有什么注意的点?
静态分区要在动态分区之前。

常用的时间函数有哪些
to_date:日期时间转日期函数
select to_date(‘2015-04-02 13:34:12’);
输出:2015-04-02
from_unixtime:转化unix时间戳到当前时区的时间格式
select from_unixtime(1323308943,’yyyyMMdd’);
输出:20111208
unix_timestamp:获取当前unix时间戳
select unix_timestamp();
输出:1430816254
select unix_timestamp(‘2015-04-30 13:51:20’);
输出:1430373080
year:返回日期中的年
select year(‘2015-04-02 11:32:12’);
输出:2015
month:返回日期中的月份
select month(‘2015-12-02 11:32:12’);
day:返回日期中的天
select day(‘2015-04-13 11:32:12’);
输出:13
hour:返回日期中的小时
select hour(‘2015-04-13 11:32:12’);
输出:11
minute:返回日期中的分钟
select minute(‘2015-04-13 11:32:12’);
输出:32
second:返回日期中的秒
select second(‘2015-04-13 11:32:56’);
输出:56
weekofyear:返回日期在当前周数
select weekofyear(‘2015-05-05 12:11:1’);
输出:19
datediff:返回开始日期减去结束日期的天数
select datediff(‘2015-04-09’,‘2015-04-01’);
输出:8
date_sub:返回日期前n天的日期
select date_sub(‘2015-04-09’,4);
输出:2015-04-05
date_add:返回日期后n天的日期
select date_add(‘2015-04-09’,4);
输出:2015-04-13
from_unixtime+ unix_timestamp Hive中yyyymmdd和yyyy-mm-dd日期之间的切换
思想:先转换成时间戳,再由时间戳转换为对应格式。
–20171205转成2017-12-05
select from_unixtime(unix_timestamp(‘20171205’,‘yyyymmdd’),‘yyyy-mm-dd’) from dual;

–2017-12-05转成20171205
select from_unixtime(unix_timestamp(‘2017-12-05’,‘yyyy-mm-dd’),‘yyyymmdd’) from dual;
Hive中取最近30天数据
datediff(CURRENT_TIMESTAMP ,gmt_create)<=30
1
Hive中 两个日期相差多少小时
select (unix_timestamp(‘2018-05-25 12:03:55’) - unix_timestamp(‘2018-05-25 11:03:55’))/3600
输出:1
Hive中 两个日期相差多少分钟
select (unix_timestamp(‘2018-05-25 12:03:55’) - unix_timestamp(‘2018-05-25 11:03:55’))/60

输出:60
hive 计算某一个日期属于星期几,如2018-05-20 是星期日
SELECT IF(pmod(datediff(‘2018-05-20’, ‘1920-01-01’) - 3, 7)=‘0’, 7, pmod(datediff(‘2018-05-20’, ‘1920-01-01’) - 3, 7))
输出:7
hive返回上个月第一天和最后一天
–上个月第一天
select trunc(add_months(CURRENT_TIMESTAMP,-1),‘MM’)

select concat(substr(add_months(from_unixtime(unix_timestamp(),‘yyyy-MM-dd’),-1),1,7),’-01’);

–上个月最后一天
select date_sub(trunc(CURRENT_TIMESTAMP,‘MM’),1);

Coalesce的作用
主流数据库系统都支持COALESCE()函数,这个函数主要用来进行空值处理,其参数格
式如下:
COALESCE ( expression,value1,value2……,valuen)
COALESCE()函数的第一个参数expression为待检测的表达式,而其后的参数个数不定。
COALESCE()函数将会返回包括expression在内的所有参数中的第一个非空表达式。如果
expression不为空值则返回expression;否则判断value1是否是空值,如果value1不为空值则返
回value1;否则判断value2是否是空值,如果value2不为空值则返回value3;……以此类推,
如果所有的表达式都为空值,则返回NULL。
我们将使用COALESCE()函数完成下面的功能,返回人员的“重要日期”:如果出生日
期不为空则将出生日期做为“重要日期”,如果出生日期为空则判断注册日期是否为空,如
果注册日期不为空则将注册日期做为“重要日期”,如果注册日期也为空则将“2008年8月8
日”做为“重要日期”。实现此功能的SQL语句如下:
Hadoop 有几个组件
Hdfs
Common
Yarn
MapReduce
Hadoop常用模式?
本地模式(默认模式)
不需要启用单独进程,直接可以运行,测试和开发时使用。

伪分布式模式
等同于完全分布式,只有一个节点。需要配7个配置文件(待我后续整理后,会在此添加文章连接)

完全分布式模式
多个节点一起运行。

Hadoop主要瓶颈
Io
Cpu
带宽
内存
Flume组件以及采集方式有哪些
Source channel sink

Avro
EXEC
UDF函数自定义流程
使用IDEA新建Maven工程udf
2、配置Maven工程的pom.xml,参考《使用IDEA新建MAVEN工程配置》,然后导包
3、新建一个自定义的继承于UDF的子类
4、写入想实现的功能
4.1、导入依赖hive-exec
4.2、在标签里加入myudf,也就是jar包的名字
5、功能测试成功后,右击右侧靠边栏的MavenProjects,点开Lifecycle,双击其中的package,系统就会自动打包生成一个.jar文件(执行包),并给出jar包的路径。
6、进入jar包的文件目录,修改名字为自己想要的名字,或参考4.2的方法改名
7、把jar包通过XFTP拖到虚拟机指定目录(或者,hive文件的子目录lib里(存放jar包的地方))
8、进入hive界面,输入下面两条语句,一条是增加这个依赖jar包,第二条是创建临时函数(毕竟第一次写的函数功能未必强大):
add jar PATH/JAR_NAME;
Hadoop的配置文件有哪些?

CM的版本是多少
6.2.1
Yarn的列队资源隔离
CPU资源按照百分比进行使用和隔离。
限制每个container的CPU资源使用上限。
限制yarn使用的CPU上限

Yarn的调度策略
FIFO Scheduler
Capacity Scheduler
Fair Scheduler
Sqoop导入数据时被临时中断会发生什么

Sqoop的导出会遗失字段嘛? mysql会吗?
SQOOP会 Mysql不会, 他有事务性管理,保存数据一致性。
联邦机制解决元数据存储上限
在HDFS联邦中,设计了多个相互独立的NN,使得HDFS的命名服务能够水平扩展,这些NN分别进行各自命名空间和块的管理,不需要彼此协调。每个DN要向集群中所有的NN注册,并周期性的发送心跳信息和块信息,报告自己的状态。

HDFS联邦拥有多个独立的命名空间,其中,每一个命名空间管理属于自己的一组块,这些属于同一个命名空间的块组成一个“块池”。每个DN会为多个块池提供块的存储,块池中的各个块实际上是存储在不同DN中的。

Map join ,Reduce join,SMBjoin
 Map join:当关联的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的表直接放到内存中去,然后再对比较大的表格进行map操作
 Reduce join:当关联两个表,在reduce中join,相同的key在一个reduce task
 SMBjoin:排序分桶join
ORC为什么查询快
ORC是列式存储,查询的时候不需要扫描全部的数据,而只需要读取每次查询涉及的列,由于每一列的成员都是同构的,可以针对不同的数据类型使用更高效的数据压缩算法,进一步减小I/O。由于每一列的成员的同构性,可以使用更加适合CPU pipeline的编码方式,减小CPU的缓存失效。
ORC是三级索引:文件级别、stripe条带级别、行级别
ORC有布隆过滤器
HDFS为什么分块,

  • 文件大小可以大于任意一个磁盘的容量,块并不需要存储在同一个磁盘上
  • 抽象块作为存储单元,简化存储子系统的设计
  • 数据备份提高容错能力和可用性
    MapReduce为什么分片,
  • MapReduce是给分布式计算框架,分布在不同的机器上并行运行,在哪台机器运行多少个任务计算?都是需要进行分片来给各个机器计算
    Yarn 为什么分Container
  • Yarn也是一个分布式框架,要把计算任务分发给不同机器计算
    Yarn运行中最重要的是
    AppMaster
    JVM重用
  • 每次每个Task都会申请一个JVM进程来运行程序,JVM进程需要内存等资源。
  • 每个Task运行完成以后,这个JVM就被销毁了
  • 开启JVM重用后申请了一个JVM进程的资源以后,可以运行多个Task。实现资源复用
    推测执行
  • 如果appmaster发现某个Task一直不能结束,会在另外节点上启动同一个Task,谁先运行结束,另外一个会被kill
    在项目中遇到java高并发怎么解决?
  • 如果很多申请读取的key不存在,就设置一个临时的默认值
  • 如果一个IP短时间申请上万上十万不是正常的读取量,就把IP禁止掉
  • 如果很多申请读取的key存在,但是临时,如果资源充足,就设置永久
    linux中的hive命令怎么向SQL文件传参
  • –hiveconf yest=$yesterday
  • yesterday=date -d ‘-1 day’ +%Y-%m-%d
    什么是Fetch抓取
    简单的,没有计算的SQL语句不会通过MapReduce
    Hive里为什么用load,不用insert into values
    因为insert into values会产生小文件,HDFS里小文件过多,会影响性能
    数据压缩常用格式
  • 冷数据压缩常用zlib、
  • 热数据压缩常用snappy
    零拷贝是什么
  • 普通拷贝:用户发起指令给内核,内核拷贝磁盘的文件到内核缓冲区,然后由内核缓冲区拷贝到用户缓冲区,然后再由用户缓冲区拷贝到内核缓冲区,内核缓冲区通过网络发送到服务器,经过三次拷贝
  • 零拷贝:直接通过内核空间不经过用户空间进行发送

以上是关于整理的一点面试题的主要内容,如果未能解决你的问题,请参考以下文章

关于JS中变量提升的规则和原理的一点理解

来自大厂 300+ 道前端面试题大全附答案(整理版)+前端常见算法面试题~~最全面详细

某Java大佬在地表最强Java企业(阿里)面试总结

Vue面试题整理

二狗的面试题整理 其二

二狗的面试题整理 其二