文章目录
- 我正在参加年度博客之星评选,请大家帮我投票打分,您的每一分都是对我的支持与鼓励。
- 每日精进
- 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;