大数据面试常见问题(三)——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、数据清洗

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

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

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

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

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

hive没有索引,oracle有索引

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

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

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

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

hadoop 开源版 2.8

hadoop cdh版本 5

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

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

聚合函数 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…

lag lead

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

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

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

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

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

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

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

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

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

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

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

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

textfile gzip

sequencefile BLOCK RECORD

orc zlib

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

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

  3. 调整表格的存储格式

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

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

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

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

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

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

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

  1. map和reduce的设置不合理

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

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

  4. key值分配不均

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

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

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

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

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

— 3.3对表格设置分桶

  1. 使用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数量

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

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

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

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

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

最少是4条 最多是6条

1 5

2 5

3 5

1 1

2 1

3 1

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

mapreduce : 数据的计算引擎

yarn : 资源管理和调度系统

离线的部分:sqoop yarn hdfs mapreduce hive

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

128M

datanode namenode secondarynamenode

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

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

datanode:负责存储数据

datanode namenode secondarynamenode jps resourcemanager nodemanager

读取数据:

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 备份完成

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

hadoop fs -put

hadoop fs -get

hadoop fs -appendToFile

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

set hive.exec.dynamic.partition=true;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

finalize:将计算结果输出

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

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

row_number — rank — dense_rank — lag — lead

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

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

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

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

小表:textfile gzip

中大表:orc zlib

— 设置不同的map和reduce数量

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

aggr 聚合开关

parallel 并行开关等

使用hdfs进行数据的存储

使用mapreduce进行数据的计算

使用yarn进行资源的调度

使用hive编写sql语句

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

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

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

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

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

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

文件 touch

文件夹 mkdir

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

(current_timestamp,-1)

dt

Original: https://blog.csdn.net/weixin_47064238/article/details/125259189
Author: 大数据求学路
Title: 大数据面试常见问题(三)——Hadoop部分

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/818270/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球