大数据面试常见问题(三)——Hadoop部分

目录

1、hive数据库和其他的数据库有什么区别?

2、传统数仓和大数据数仓的区别

3、你们使用的hadoop是什么环境什么版本的?

4、分桶的作用是什么?

5、分桶的数量你是如何决定的?

6、hive里面经常用到的函数有哪些?

7、进行数据的同比和环比有什么方法?

8、hive表连接和其他数据库有什么区别?

9、hive里面经常用到的几个不同的排序分别是什么,有什么区别?

10、Hive中的有哪几种存储格式?

11、项目中经常用的结构有哪些?

12、表格的压缩格式你们用的什么?

13、hive的优化

14、怎么设置map?

15、怎么设置reduce?

16、什么叫做数据倾斜呢?

17、有没有遇到过数据倾斜的问题?数据倾斜的表现是什么?

18、有哪些情况会导致数据倾斜呢?

19、怎么解决数据倾斜的现象呢?

20、mapjoin优化器的原理是什么?

21、两表连接后能得出什么结果

22、a表有4条数据 b表有3条数据 请问左连接有几条数据

23、hadoop有哪三大组件?

24、hadoop 平台,你用过和知道哪些不同的组件?

25、hadoop里面,hdfs数据块是多大一块?

26、数据默认保存几份?

27、hdfs里面由哪几个组件构成?

28、hdfs里面的几个组件,分别有哪些功能和作用?

29、hadoop的基础服务有哪几个?

30、hdfs里面,写入数据(上传文件)和读取数据(下载文件),过程流程和原理是什么?

31、hdfs里面,常用的操作命令有哪些?上传、下载、合并等等。

32、加载数据到数据库的表,使用什么方法?

33、如果现在,做数据的增量抽取,如何在重复抽取的过程中,避免出现重复的数据?

34、如何删除分区呢?

35、如果某个数据有问题,更新这个数据?

36、内部表和外部表的区别?

37、动态分区和静态分区的区别?

38、为什么分桶可以对表格的联合查询加速呢?

39、分区和分桶的区别?

40、怎么进行数据的抽取?

41、yarn的原理和流程?

42、mapreduce的原理和流程是什么?

43、shuffle的基本流程?

44、表连接(喜欢问左连接,项目中一般不用右连接):

45、分析函数:

46、时间的方法:

47、hive的优化

48、Hadoop的构架

49、数据库分层

50、merge into的基本语法

51、数据增长幅度突然剧增,要从哪几个角度去思考到底哪里出现了问题?

52、一个分区表,一个非分区表,如何用非分区表中的字段作为分区表的分区值?

53、linux 怎么创建文件和文件夹?

54、怎么找出HDFS中文件的路径?

55、hive怎么动态的筛选出今天之前的数据?

56、hive中 一个表格有ID 和登陆时间,怎么找出昨天登陆次数两次的用户?

57、hive 怎么截取字符串最后两位?除了substr 还有没有别的方法?

58、hive 中一个分区表怎么删除其中一个分区?

59、两张十万数据的表,进行左连接后发现数据膨胀会怎么处理

60、如何查看执行计划

61、优化器的是如何进行优化的

62、sql语句的去重

63、hive怎么更新数据效率更高 

64、hive的sql语句是怎么运行的

65、hive中的数据插入流程是怎么样的

66、除了存储过程还有没有其他的?

67、什么情况下会用到触发器

68、多表查询是不是一定要用嵌套,还有什么情况下可以考虑不用嵌套

69、怎么提取数据,数据抽取方式

70、小文件产生的原因

71、小文件处理方法

72、数据倾斜的业务场景

73、hive中怎么给数据打标签

74、用union all合并两个表,新表中怎么查询某个数据原本是什么表,用什么语句

75、有个文件需要周一早上8点运行,用linux语句怎么运行?(不能借助kettle)

76、把一个列变成一个数组都有什么函数

77、降序排序空值排在前面还是后面?

78、hive SQL和SQL的区别

79、hive中order by,sort by, distribute by, cluster by作用以及用法;

80、数据清洗


1、hive数据库和其他的数据库有什么区别?

hive数据库是使用hdfs存储数据的,oracle数据库使用.dbf文件存储数据

hive数据库使用mr引擎计算数据,oracle有自己自带的executor进行计算

hive的语句运行延迟比较高,oracle延迟很低

hive支持的容量比较大,可以支持TB PB,但是oracle只能支持GB

hive数据库没有约束条件的部分,oracle有约束

hive没有索引,oracle有索引

2、传统数仓和大数据数仓的区别

传统数仓主要是结构化的数据,大数据数仓有结构化,半结构化,非结构化的数据

传统数仓数据量为GB,TB;大数据数仓数据量为pb级

传统数仓用oracle存储,大数据数仓用hdfs,hbase存储

传统数仓主要处理离线数据,大数据数仓既可以处理离线数据,也能处理实时数据

3、你们使用的hadoop是什么环境什么版本的?

hadoop 开源版 2.8

hadoop cdh版本 5

4、分桶的作用是什么?

进行表格连接的查询加速;加快表格的抽样查询。

5、分桶的数量你是如何决定的?

总的文件大小/(block size*2) = 分桶数量

6、hive里面经常用到的函数有哪些?

聚合函数 sum avg min max count

单行函数

数字 abs round floor ceil power  

字符串 substr concat concat_ws replace instr split translate upper lower initcap lpad rpad length trim ltrim rtrim get_json_object

时间日期函数 current_timestamp unix_timestamp from_unixtime add_months months_between date_add datediff last_day

数据类型转换 cast

数组 array size collect_list collect_set explode

映射 map map_keys map_values  

分析函数  

排名 row_number rank dense_rank

平移 lag lead

逻辑函数 nvl case...when...

7、进行数据的同比和环比有什么方法?

lag lead

表连接 select * from a join b on a.year=b.year+1 and a.month=b.month;

8、hive表连接和其他数据库有什么区别?

hive使用left semi join替换子查询嵌套;

表连接不能使用on后面的非等值查询。

9、hive里面经常用到的几个不同的排序分别是什么,有什么区别?

order by 是整个表格的数据当成一个进程进行整体的排序

sort by 可以根据 mapred.reduce.tasks进行分组的设置,每个组分别进行排序

cluster by 只能对该列进行升序排序

distribute by 本身没有排序功能,需要和sort by一起

10、Hive中的有哪几种存储格式?

Textfile:默认存储格式,行存储;

Sequencefile:含有键值对形式的二进制文件格式,行存储;

Rcfile:行列相结合的存储方式,行列式存储;

Orcfile:优化后的Rcfile存储格式,使用最多。

11、项目中经常用的结构有哪些?

如果表格比较小会使用textfile,中大型的表格使用orc

12、表格的压缩格式你们用的什么?

textfile gzip

sequencefile BLOCK RECORD

orc zlib

13、hive的优化

1. 可以通过explain查看一下sql语句运行的步骤、逻辑、使用方法、数据的类型、前后的顺序等等内容

2. 减少查询过程中使用到的数据量 分区 分桶 不使用select * 先筛选数据再计算或者再连接表格

3. 调整表格的存储格式

4. 根据表格的结构设置map或者reduce的数量

14、怎么设置map?

map的数量和两个开关有关,有一个merge的合并开关和一个map.tasks的数量开关,

使用 表格的总数量大小/tasks和merge设置取最小值,计算每一个map需要运行的数量大小,查看map运行的数量是否有很大的明显的差距

15、怎么设置reduce?

如果我们的表格是列比较少但是行比较多的大表,那么通过reduce.tasks设置表格分桶的数量,

然后通过 select * from t distribute by 列; 进行表格的分桶。

16、什么叫做数据倾斜呢?

在进行表格的查询和计算过程中,如果有的进程计算的数据很大,有的进程计算的数据比较少,有的部分进程就需要等待其他数据大的进程运行完成才能结束。所以计算过程中资源的分布发生了不合理的现象。

17、有没有遇到过数据倾斜的问题?数据倾斜的表现是什么?

reduce的进程在日志里面卡在了99或者100的部分不动了。

18、有哪些情况会导致数据倾斜呢?

1. map和reduce的设置不合理

2. 对表格进行了去重的结果查询

3. 大小表格进行数据的查询

4. key值分配不均

5. 进行数据查询的时候有大量的空值数据参与了数据的运算

19、怎么解决数据倾斜的现象呢?

1. 设置 mapred.map.tasks; mapred.reduce.tasks;

2.在句子中尽可能少的使用去重统计

3. 

-- 3.1使用hive里面的优化器 /*+ mapjoin(小表的名字) */

-- 3.2调整表格的前后顺序,hive里面,永远读取Join前面的表格

-- 3.3对表格设置分桶

4. 使用hive里面的万能开关,来解决异常数据的问题

set hive.groupby.skewindata=true; --万能方法

set hive.map.aggr=true; --任务执行中合并文件的大小

set hive.merge.size.per.task=256000000;--调整每个map处理数据量的次数,

set mapred.map.tasks=10; ----这里设置的是每一个map要处理的map数量

5. 填充空值,用字符串+随机值进行空值的填充

nvl(被计算的列, concat('rand_',rand()))

20、mapjoin优化器的原理是什么?

将小表格的数据放入到内存里面,让大表去读取内存中小表的数据进行数据的匹配和连接

mapjoin是将小表格先读取到内存中,然后用大表格去匹配内存中小表的数据。

21、两表连接后能得出什么结果

A id B id

1 1

2 2

3 4

select * from A left join B on a.id=b.id and a.id=2;

             

2 2

1 null

3 null

select * from A left join B on a.id=b.id where a.id=2;

2 2

22、a表有4条数据 b表有3条数据 请问左连接有几条数据

最少是4条 最多是6条

1 5

2 5

3 5

4  

1 1

2 1

3 1

4   

23、hadoop有哪三大组件?

hdfs :hadoop的分布式文件管理系统

mapreduce : 数据的计算引擎

yarn : 资源管理和调度系统

24、hadoop 平台,你用过和知道哪些不同的组件?

离线的部分:sqoop yarn hdfs mapreduce hive

实时的部分:flume(日志信息的收集) kafka(消息队列的处理) hbase(一种列式存储的数据库) spark(基于内存的计算引擎) flink(流式处理的计算引擎)

25、hadoop里面,hdfs数据块是多大一块?

128M

26、数据默认保存几份?

3份

27、hdfs里面由哪几个组件构成?

datanode namenode secondarynamenode

28、hdfs里面的几个组件,分别有哪些功能和作用?

secondarynamenode:服务器数据的收集,将信息传递给namenode

namenode:负责和客户端进行沟通

datanode:负责存储数据

29、hadoop的基础服务有哪几个?

datanode namenode secondarynamenode jps resourcemanager nodemanager

30、hdfs里面,写入数据(上传文件)和读取数据(下载文件),过程流程和原理是什么?

读取数据:

1.客户端申请某个位置的文件或者数据

2.namenode响应申请,并且将文件和数据所在的datanode节点信息列表返回给客户端

3.客户端根据节点信息去向datanode申请数据的读取

4.datanode响应成功给客户端

5.客户端开始申请读取block1

6.datanode返回block1的数据

7.持续申请后面的其他block数据

8.datanode持续的返回剩下的其他数据

写入数据:

1.客户端要申请写入一个数据

2.namenode审核文件和数据的合法性

3.namenode返回允许的响应

4.客户端开始申请写入

5.namenode返回datanode的节点信息

6.客户端找到datanode开始申请写入数据

7.datanode同意进行数据写入

8.客户端开始上传数据

8.1 datanode开始向其他的datanode申请备份

8.2 其他的datanode同意备份

8.3 开始备份

8.4 备份完成

9. datanode回应客户端表示写入成功

31、hdfs里面,常用的操作命令有哪些?上传、下载、合并等等。

hadoop fs -put

hadoop fs -get

hadoop fs -appendToFile

32、加载数据到数据库的表,使用什么方法?

load data inpath 'hdfs路径' into table 库名.表名 partition(分区字段=分区值);

load data local inpath 'linux路径' into table 库名.表名 partition(分区字段=分区值);

hadoop fs -put linux文件的位置和名字 表格在hdfs的路径

33、如果现在,做数据的增量抽取,如何在重复抽取的过程中,避免出现重复的数据?

增量抽取的数据,会放在每天的分区里面中,然后通过删除今天的分区达到避免重复数据出现的效果。

34、如何删除分区呢?

alter table 表名 drop partition(分区字段=’分区值‘);

load data inpath '路径' into table 库名.表名 partition(分区字段=分区值);

insert overwrite table 表名 partition(分区字段=分区值) select * from 另一个表名;

35、如果某个数据有问题,更新这个数据?

1. -get 这个文件,修改文件本身,删除hdfs原文件,在-put上传上去

2. 通过select语句修改数据本身写入另一个表,然后删除原表,重新命名新表

3. 如果是orc类型的分桶表格,通过打开ACID的方法,进行数据的update更新

36、内部表和外部表的区别?

1. 内部表是通过create table创建的,外部表是create external table进行创建的

2. 外部表需要通过location指定表格映射的文件夹

3. drop table的时候,内部表会删除文件夹、结构和数据,外部表只会删除mysql中存储的表格的结构

4. 一般像日志和埋点数据这种数据量非常大的表格,都会保存在外部表中,计算结果会保存在内部表中

37、动态分区和静态分区的区别?

1. 静态分区可以load data和insert两种方式添加数据,动态只能通过insert的方式添加数据

2. 静态需要自己指定分区的内容,动态是通过查询结果自动指定和分配的

3. 动态需要打开动态分区和非严格模式的开关

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

4. 一般情况下都是使用静态分区,动态的处理数据的速度相对慢一点

38、为什么分桶可以对表格的联合查询加速呢?

因为分桶可以减少表格笛卡尔积的数量

39、分区和分桶的区别?

1. 分区是通过partitioned by (新字段) 进行分区设置的,分桶是通过clustered by (已有字段) 进行分桶设置的

2. 分区是以文件夹的方式分开保存数据的,分桶是分成不同的文件保存数据的

3. 分区是在查询分区字段的时候加快查询速度,分桶是对分桶字段进行表格的联合查询的时候进行联合查询加速的

40、怎么进行数据的抽取?

在hive数据库中,可以通过sqoop进行数据的抽取,有全量和增量两种不同的方法,增量一般是通过lastmodified的方式进行数据抽取的,也可以通过分区表的方式抽取数据

41、yarn的原理和流程?

ResourceManager:在整个系统中,有且仅有一个的服务,负责调配Container

NodeManager:负责启动和管理以及监控Container

AppMaster:进行数据计算 Container:容器,一部分服务器的资源

42、mapreduce的原理和流程是什么?

input:先获取在计算过程中所需要的数据

split:对大的数据进行切割的操作,将数据分成一块块的

map:数据的映射。将分配好的数据,给到不同的进程去运行

shuffle:每个进程单独的对自己拿到的数据进行计算(对每个数据进行数据拆分(分区)并且进行排序,保存在硬盘上,从硬盘上读取数据,并且进行计算,结果再次排序)

reduce:将单独的数据进行总体汇总的计算过程

finalize:将计算结果输出

43、shuffle的基本流程?

数据进行分区--sort排序--存入硬盘--从硬盘读取数据--聚合计算等等--数据排序

44、表连接(喜欢问左连接,项目中一般不用右连接):

1 1

2 2

4 3

a left join b on a.id=b.id and a.id=2

2 2

1 null

4 null

a left join b on a.id=b.id where a.id=2

2 2

45、分析函数:

row_number -- rank -- dense_rank -- lag -- lead

46、时间的方法:

获取当前时间:from_unixtime(unix_timestamp()) current_timestamp

47、hive的优化

-- 尽可能减少查询和运算过程中的数据量

分区、分桶、查询列不要使用*、先筛选再聚合和连接表。

-- 修改表格存储的结构和压缩的方法

小表:textfile gzip

中大表:orc zlib

-- 设置不同的map和reduce数量

-- 有一些不同的hive数据库的set开关

aggr 聚合开关

parallel 并行开关等

48、Hadoop的构架

使用hdfs进行数据的存储

使用mapreduce进行数据的计算

使用yarn进行资源的调度

使用hive编写sql语句

使用mysql存储表格的元数据结构

49、数据库分层

业务数据的来源:业务系统

50、merge into的基本语法

将目标表格和原表格进行主键的对比,如果主键一致,就更新原表数据到目标表格中,如果主键不一致,就将原表的数据插入到目标表格中。

51、数据增长幅度突然剧增,要从哪几个角度去思考到底哪里出现了问题?

如果平常数据量增加都很正常,那么我的逻辑控制、变量的设置、数据的获取方式应该都没有什么问题,如果今天突然新增了数据,首先先去确认表格的数据是否都是重复的数据、是否都是空的数据、是否都是异常数据等等,然后往上游的系统进行数据的追溯,查看上游给我们的数据本身是否有问题,如果上游数据很存储数据一致,就找上游协调问题,如果上游数据和存储数据不一致,那么就查找是否有特殊数据导致逻辑出现问题。

还可以查看其他的表格,看是否也有突增的数据,考虑是否是调度的工具出现了问题。

52、一个分区表,一个非分区表,如何用非分区表中的字段作为分区表的分区值?

直接做动态分区就好了,使用 insert overwrite table 分区表 partition(分区字段) select xxxx from 非分区表;

53、linux 怎么创建文件和文件夹?

文件 touch

文件夹 mkdir

54、怎么找出HDFS中文件的路径?

hdfs里面没有直接查找文件的方法,但是可以通过元数据库例如Mysql里面有一个sds表格,通过Like模糊查询这个文件的名字,然后找到它所在的位置。

55、hive怎么动态的筛选出今天之前的数据?

(current_timestamp,-1)

dt

56、hive中 一个表格有ID 和登陆时间,怎么找出昨天登陆次数两次的用户?

提取出年月日的数据,将年月日和用户的Id共同分组,找出组的行数等于2的就可以了

57、hive 怎么截取字符串最后两位?除了substr 还有没有别的方法?

将字符串转换成数组,然后通过数组的下标去除最后两位,然后通过concat_ws再还原成字符串。

58、hive 中一个分区表怎么删除其中一个分区?

alter table 表名 drop partition (分区字段=分区值);

59、两张十万数据的表,进行左连接后发现数据膨胀会怎么处理

先对数据进行筛选,然后再进行表格的连接;

或者将数据计算之后的结果存储到临时表中,然后用临时的中间表进行表格的连接;

或者对两个表格进行分桶。

60、如何查看执行计划

使用 explain 来查看sql的执行计划

61、优化器的是如何进行优化的

优化器是强制的修改表格sql语句的运行逻辑,然后在某种情况下可以达到优化的效果。

62、sql语句的去重

insert overwrite table 表名 select distinct * from 表格;

insert overwrite table 表名 select 列名 from 表格 group by 列;

insert overwrite table 表名 select 列名 from (select 表名.*,row_number() over(partition by 列 order by 1) r from 表) where r=1;

63、hive怎么更新数据效率更高 

最高的方法,使用hadoop fs将数据下载下来,然后使用Linunx命令更新之后再上传。

64、hive的sql语句是怎么运行的

hive窗口中编写sql语句,然后会去Mysql里面进行表格结构和位置的查询,如果表格结构没有问题,那么就会将sql语句拆分成不同的关键字,然后调用mapreduce对应关键字的java脚本模板,如果mr的模板文件运行没有问题,就会调用yarn进行资源的申请和分配,然后使用mr进行数据的计算,最后将计算的结果再回显到hive数据的窗口中。

65、hive中的数据插入流程是怎么样的

就是hdfs数据写入的流程

66、除了存储过程还有没有其他的?

函数、触发器、包

67、什么情况下会用到触发器

前置触发器:在数据写入到表格之前,先对写入的数据进行检查,查看数据是否符合写入表格的要求

后置触发器:当数据已经写入到表格了,对表格的数据进行同步更新或者是表格操作日志的记录等等

68、多表查询是不是一定要用嵌套,还有什么情况下可以考虑不用嵌套

除了嵌套,还有表联合查询,exists()进行多表查询也可以

69、怎么提取数据,数据抽取方式

全量抽取:在小表或者是维度表格获取是计算后的表格,先对表格进行truncate,然后再全量插入

增量抽取:我们项目组里面,一般是以天为单位,进行日期分区的增量抽取

镜像对比的抽取:一般用来历史记录上进行数据的对比更新或者数据的补录等等

70、小文件产生的原因

每次insert插入产生小文件

分桶产生小文件

系统本身产生的文件。比如每天的财务数据,数据量不是特别大

71、小文件处理方法

在map执行前合并小文件,减少map数:

CombineHiveInputFormat 具有对小文件进行合并的功能(系统默认的格式)

set mapred.max.split.size=112345600;

set mapred.min.split.size.per.node=112345600;

set mapred.min.split.size.per.rack=112345600;

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

这个参数表示执行前进行小文件合并,前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),进行合并。

72、数据倾斜的业务场景

(1)空值产生的数据倾斜

场景说明

在日志中,常会有信息丢失的问题,比如日志中的 user_id,如果取其中的 user_id 和用户表中的 user_id 相关联,就会碰到数据倾斜的问题。

解决方案

解决方案 1:user_id 为空的不参与关联

select * from log a join user b on a.user_id is not null and a.user_id = b.user_idunion allselect * from log c where c.user_id is null;

解决方案 2:赋予空值新的 key 值

select * from log a left outer join user b on case when a.user_id is null then concat('hive',rand()) else a.user_id end = b.user_id

总结

方法 2 比方法 1 效率更好,不但 IO 少了,而且作业数也少了,方案 1 中,log 表 读了两次,jobs 肯定是 2,而方案 2 是 1。这个优化适合无效 id(比如-99,’’,null)产生的数据倾斜,把空值的 key 变成一个字符串加上一个随机数,就能把造成数据倾斜的 数据分到不同的 reduce 上解决数据倾斜的问题。

改变之处:使本身为 null 的所有记录不会拥挤在同一个 reduceTask 了,会由于有替代的 随机字符串值,而分散到了多个 reduceTask 中了,由于 null 值关联不上,处理后并不影响最终结果。

(2)不同数据类型关联产生数据倾斜

场景说明

用户表中 user_id 字段为 int,log 表中 user_id 为既有 string 也有 int 的类型, 当按照两个表的 user_id 进行 join 操作的时候,默认的 hash 操作会按照 int 类型的 id 进 行分配,这样就会导致所有的 string 类型的 id 就被分到同一个 reducer 当中

解决方案

把数字类型 id 转换成 string 类型的 id

select * from user a left outer join log b on b.user_id = cast(a.user_id as string)

73、hive中怎么给数据打标签

使用分析函数进行数据的统计,然后可能需要对数据case when 进行判断。

74、用union all合并两个表,新表中怎么查询某个数据原本是什么表,用什么语句

select * from

(select a.*,sysdate,'a' from a

union all 

select b.*,sysdate,'b' from b);

75、有个文件需要周一早上8点运行,用linux语句怎么运行?(不能借助kettle)

crontab

0 8 * * 1

76、把一个列变成一个数组都有什么函数

collect_list(列名) collect_set(列名)—去重

77、降序排序空值排在前面还是后面?

最前 (空值默认最大)

可以在最后加nulls last/first 改变空值顺序

78、hive SQL和SQL的区别

Hive-sql不支持等值连接,而sql支持;

Hive-sql不支持“Insert into 表 Values()”、UPDATA、DELETE操作,而sql支持;

Hive-sql不支持事务,而sql支持。

79、hive中order by,sort by, distribute by, cluster by作用以及用法;

cluster by 列名:对这个列进行升序排序

order by 列名 asc|desc:对这个列进行升序或者降序的排序

distribute by 列名 [ sort by 列名 asc|desc ]:相当于对这个列进行了一个分区的操作,如果要实现排序功能,需要和sort by 结合使用。

order by是全局排序,sort by是组内排序。distribute by sort by可以结合桶表使用,给桶中的数据排序。

80、数据清洗

缺失值清洗:确定范围,去除不需要的字段,填充缺失内容,重新取数

格式内容清洗:统一格式,去除多余字符,校验字段内容

逻辑错误清洗:去重、去除不合理值、修正矛盾内容

非需求数据清洗:删除不需要的字段

你可能感兴趣的:(大数据面试私藏题,大数据,面试,hive,hadoop)