大数据系列思考题

2022-05-08 13:29:23 浏览数 (1)

文章目录

  • 我正在参加年度博客之星评选,请大家帮我投票打分,您的每一分都是对我的支持与鼓励。
    • 每日精进
      • 1.hdfs启动流程
      • 2.hdfs ,spark streaming, flink三者中的checkpoint原理
      • 1、谈谈你对Hive内部表、外部表、分区表、分桶表的区别,并介绍一下使用场景
      • 2、介绍一下Sort By,Order By,Distrbute By,Cluster By的区别
      • 3、谈谈你所知道有哪些常用的Hive调优方式?
      • 1、清楚描述 MapReduce 的 shuffle 过程
      • 2、HBase 的 rowkey 设计需要遵循什么原则,以及如何解决热点问题
      • 3、早几年是有很多 elasticsearch /solr 为 mysql 或者 HBase 作二级索引,但是现在 elasticsearch 在不断的加大在大数据领域的支持,是否可以取代 HBase
      • 1、谈谈Hadoop里面的压缩格式以及使用场景
      • 2、Sqoop在导入数据的时候出现了数据倾斜,你有什么解决方案。另外,使用Sqoop的注意事项,你能列举出来几个?
      • 3、小鹏汽车充电有两种类型,快充、慢充,有如下数据:
      • 1、介绍一下拉链表的原理,以及适用于哪些场景?
      • 2、如果使用spark遇到了 OOM ,你会怎么处理?
      • 3、A 文件有 50 亿条 URL,B 文件也有 50 亿条 URL,每条 URL 大小为 64B,在一台只有 4G 内存的机器上,怎么找出 A、B 中相同的 URL?
      • 1、简述Spark中的缓存机制(cache和persist)与checkpoint机制,并指出两者的区别与联系
      • 2、Storm ,Spark Streaming , Spark structured streaming,Flink 的区别?
      • 3、给40亿个不重复的无符号的 int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
      • 1、简单讲述一下Yarn Application生命周期
      • 2、Hive如何避免小文件的产生,你会如何处理大量小文件?
      • 1、请谈谈 Flink 中的时间分类,以及适用的不同的场景
      • 2、谈谈你所知道的 HBase 常见的优化
      • 3、有两根不均匀分布的香,香烧完的时间是一个小时,你能用什么方法来确定一段15分钟的时间
      • 1、简单谈谈 Flink 中重启策略
      • 2、介绍一下Zookeeper 的选举机制,以及我们还可以用 Zookeeper 做些什么
      • (player_id,event_date)是此表的主键。这张表显示了某些游戏的玩家的活动情况。每一行是一个玩家的记录,他在某一天使用某个设备注销之前登录并玩了很多游戏(可能是 0)。Activity table:
    • 更多思考题

每日精进

1.hdfs启动流程

个人理解:

hdfs启动流程

hdfs是Hadoop Distribute File System 的简称,即分布式文件系统,用于存储海量数据.

hdfs的启动分为三步:1.启动Namenode;2.启动Datanode;3.启动Secondary Namenode;

详细说说:

Secondary NameNode的工作流程:(为了方便Secondary NameNode以SN替代,NameNode)首先SN通知NN切换成edits文件;

NN中的edits和fsimage通过http的方式传输到SN,并在SN中合并成新的fsimage.ckpt,之后传输回NN,并将旧的fsimage替换;

NN中的edits生成新的edits文件并替换旧的edits

参考答案:

2.hdfs ,spark streaming, flink三者中的checkpoint原理

spark和flink还没学,就先不回答了

基础题:

1、谈谈你对Hive内部表、外部表、分区表、分桶表的区别,并介绍一下使用场景

Hive内部表和外部表的区别在于:一个被删除时,元数据和数据全部被删除,一个数据保留,元数据被删除;内部表适用不需要保留数据的场景,外部表仅删除数据,适用保证数据安全的场景.

分区表是在原有数据表的结构上添加分区,这样在扫描时只扫描指定的分区,未指定的分区不扫描,减少了扫描的数量从而加快查询的效率,分桶表是在表和分区的基础上新添加的结构,用于提高join效率及取样,

他们的区别在于:分区表的字段绝对不能出现在数据表结构中,多层分区,其结构是嵌套结构。分桶需要指定分桶字段,且字段必须是数据表中已有的一个字段,分桶表的数据只能通过insert overwrite加载数据。

2、介绍一下Sort By,Order By,Distrbute By,Cluster By的区别

order by 全局排序,只有一个reduce,数据量大时效率较慢 sort by 一个reduce内部排序,不是全局排序。

DISTRIBUTE BY的字段与SORT BY的字段相同时,可以使用CLUSTER BY进行替换,但CLUSTER BY不能指定排序规则(只能是降序),DISTRIBUTE BY SORT BY可以指定排序规则(可升可降)

思考题:

3、谈谈你所知道有哪些常用的Hive调优方式?

hive的优化很多,我们做项目时70%时间都花在hive的调优上.常见的Hive调优比如并行编译,小文件合并,矢量化查询,读取零拷贝优化,数据倾斜优化等等

关于hive的调优,我曾写过两篇博客专门总结了当时项目中存在的hive调优的点,各位大佬如果感兴趣可以点开链接看看:

链接

链接

基础题:

1、清楚描述 MapReduce 的 shuffle 过程

shuffle过程:分为四步

分区,排序,局部合并,分组

从内存角度看shuffle的过程:

Map将数据传入环形缓冲区(默认100MB),数据达到一定阈值(默认0.8)时,进行溢写生成n个临时文件,临时文件达到10个(可调整)后merge合并成一个大文件,

然后Reduce数据读取,reduce会主动发起拷贝线程到maptask获取属于自己的数据,数据进入到ReduceTask中的环形缓冲区,当达到一定阈值后进行溢写,生成临时文件,临时文件再合并成一个大文件,最后输出到Reduce

2、HBase 的 rowkey 设计需要遵循什么原则,以及如何解决热点问题

思考题:

3、早几年是有很多 elasticsearch /solr 为 mysql 或者 HBase 作二级索引,但是现在 elasticsearch 在不断的加大在大数据领域的支持,是否可以取代 HBase

基础题:

1、谈谈Hadoop里面的压缩格式以及使用场景

常用的压缩格式有LZO,LZ4,Gzip,Bzip2,Snappy,在实际项目开发中一般选用Snappy

思考题:

2、Sqoop在导入数据的时候出现了数据倾斜,你有什么解决方案。另外,使用Sqoop的注意事项,你能列举出来几个?

增加split by 解决

具体:

–split by 字段

-m 数量 使用几个Task进行数据采集

使用Sqoop遇到的bug:hdfs文件的权限问题,文件格式问题,没有设置主键,Output directory already exists…

智力题:

3、小鹏汽车充电有两种类型,快充、慢充,有如下数据:

车辆 ID 充电时间 充电类型

a 20200701 20:00:09 1

a 20200701 21:00:09 0

a 20200702 20:00:09 1

a 20200703 11:00:09 1

a 20200704 12:00:09 1

b 20200706 12:00:09 0

a 20200706 12:00:09 0

其中1为快充,0为慢充,求每辆车最长 连续快充次数 ,以上例子结果为

a 3

b 0

请写出对应的SQL

代码语言:javascript复制
select id,count(1) as c from cars where (id 1,Num) in (select * from cars)
and (id 2,Num) in (select * from cars); 

基础题

1、介绍一下拉链表的原理,以及适用于哪些场景?

拉链表的原理:说白了就是在原有表基础上增加两个字段,一个start_time,一个end_time

数据如果不变就不动,如果有新数据进来,就将原数据的end_time天数-1(改成前天),start_time不变,新数据的start_time写成今天,end_time设置成9999-12-31

这其中的操作都在新建的两张临时表(update表和tmp表)中进行,它适合最大程度节省存储空间,又能满足数据历史状态的场景

拉链表就是之前我们讲过的SCD2,它的优点是即满足了反应数据的历史状态,又能在最大程度上节省存储。

拉链表的实现需要在原始字段基础上增加两个新字段:

start_time(表示该条记录的生命周期开始时间——周期快照时的状态)

end_time(该条记录的生命周期结束时间)

4.3.1.8.1.2 采集实现步骤

1.建立增量数据临时表update;

2.抽取昨日增量数据(新增和更新)到update表;

3.建立合并数据临时表tmp;

4.合并昨日增量数据(update表)与历史数据(拉链表)

(1)新数据end_time设为’9999-12-31’,也就是当前有效;

(2)如果增量数据有重复id的旧数据,将旧数据end_time更新为前天(昨日-1),也就是从昨天开始不再生效;

(3)合并后的数据写入tmp表;

5.将临时表的数据,覆盖到拉链表中;

6.下次抽取需要重建update表和tmp表。

查询拉链表数据时,可以通过start_time和end_time查询出快照数据。

思考题

2、如果使用spark遇到了 OOM ,你会怎么处理?

智力题

3、A 文件有 50 亿条 URL,B 文件也有 50 亿条 URL,每条 URL 大小为 64B,在一台只有 4G 内存的机器上,怎么找出 A、B 中相同的 URL?

1、简述Spark中的缓存机制(cache和persist)与checkpoint机制,并指出两者的区别与联系

2、Storm ,Spark Streaming , Spark structured streaming,Flink 的区别?

智力题

3、给40亿个不重复的无符号的 int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

1、简单讲述一下Yarn Application生命周期

2、Hive如何避免小文件的产生,你会如何处理大量小文件?

基础题

1、请谈谈 Flink 中的时间分类,以及适用的不同的场景

在 flink 中被划分为事件时间,提取时间,处理时间三种。

如果以 EventTime 为基准来定义时间窗口那将形成 EventTimeWindow,要 求消息本身就应该携带 EventTime。如果以 IngesingtTime 为基准来定义时间窗口那将形成 IngestingTimeWindow,以 source 的 systemTime 为准。如果以 ProcessingTime 基准来定义时间窗口那将形成 ProcessingTimeWindow,以 operator 的 systemTime 为准。

思考题

2、谈谈你所知道的 HBase 常见的优化

Hbase的优化:

①热点问题引起的性能下降,可通过创建表时给定多个分区,Rowkey写入时不能连续解决。

②分布式设计思想:预分区

方式一:指定分隔段,实现预分区

方式二:指定Region个数,自动进行Hash划分:字母和数字的组合

方式三:JavaAPI

③Hbase表设计思想:Rowkey设计

业务原则:尽量将最常用的查询条件作为Rowkey的前缀

唯一原则:Rowkey必须时唯一标识

组合原则:尽量将最常用的几个查询条件组合成Rowkey

散列原则:构建无序的Rowkey

长度原则:长度不宜过长

④HBase 的列簇设计:将强相关的Key-Value都放在同一个列簇下,这样既能做到查询效率最高,也能保持尽可能少的访问不同的磁盘文件。

智力题:

3、有两根不均匀分布的香,香烧完的时间是一个小时,你能用什么方法来确定一段15分钟的时间

答:设A,B两根香,A点燃一头,B点燃两头,由于每只香烧完的时间都是1小时,B烧完时时间过去

30分钟,此时再点燃A的另一头,A烧完时恰好是45分钟,也就确定了烧15分钟的时间.

基础题

1、简单谈谈 Flink 中重启策略

Flink 支持不同的重启策略,这些重启策略控制着 job 失败后如何重启: 固定延迟重启策略 固定延迟重启策略会尝试一个给定的次数来重启 Job,如果超过了最大的重启次 数,Job 最终将失败。在连续的两次重启尝试之间,重启策略会等待一个固定的 时间。 失败率重启策略 失败率重启策略在 Job 失败后会重启,但是超过失败率后,Job 会最终被认定失 败。在两个连续的重启尝试之间,重启策略会等待一个固定的时间。 无重启策略 Job 直接失败,不会尝试进行重启。思考题

2、介绍一下Zookeeper 的选举机制,以及我们还可以用 Zookeeper 做些什么

以五个节点的Zookeeper为例,按照12345顺序启动集群。1、第1个节点启动后,投一票给自己。2345节点没有启动,第1个节点的票数不过半,不能是Leader,进入looking状态。2、第2个节点启动后,投一票给自己。345节点没有启动,第2个节点id为2,权重大于第1个节点id为1,所以获得第1个节点的1票,此时第2个节点有2票。票数不过半,不能是Leader,进入looking状态。3、第3个节点启动后,投一票给自己。45节点没有启动,第3个节点id为3,权重大于第2个节点id为2,所以获得第2个节点的2票,此时第3个节点有3票。票数过半,状态为Leader。第1、2节点变为Follower.4、第4个节点启动后,投一票给自己。 但此时第3个节点为Leader,第4个节点状态变为Follower。

5、第5个节点启动后,投一票给自己。 但此时第3个节点为Leader,第5个节点状态变为Follower。智力题

3、

±-------------±--------

| Column Name | Type |

±-------------±--------

| player_id | int |

| device_id | int |

| event_date | date |

| games_played | int |

±-------------±--------

(player_id,event_date)是此表的主键。这张表显示了某些游戏的玩家的活动情况。每一行是一个玩家的记录,他在某一天使用某个设备注销之前登录并玩了很多游戏(可能是 0)。Activity table:

±----------±----------±-----------±-------------

| player_id | device_id | event_date | games_played |

±----------±----------±-----------±-------------

| 1 | 2 | 2016-03-01 | 5 |

| 1 | 2 | 2016-03-02 | 6 |

| 2 | 3 | 2017-06-25 | 1 |

| 3 | 1 | 2016-03-02 | 0 |

| 3 | 4 | 2018-07-03 | 5 |

±----------±----------±-----------±------------- 编写一个 SQL 查询,报告在首次登录的第二天再次登录的玩家的分数,四舍五入到小数点后两位。换句话说,您需要计算从首次登录日期开始至少连续两天登录的玩家的数量,然后除以玩家总数。查询结果格式如下所示:Result table:

±----------

| fraction |

±----------

| 0.33 |

±----------

只有 ID 为 1 的玩家在第一天登录后才重新登录,所以答案是 1/3 = 0.33请写出SQL … select distinct (logs.player_id/5) as fraction from players p

where (player_id 1,Num) in (select from logs)

and (player_id 2,Num) in (select from logs) and p.games_played !=0;

0 人点赞