字节跳动
1、spark内存模型,如何解决OOM问题?如何解决SOF问题?
Spark中的OOM问题不外乎以下三种情况:
map执行中内存溢出
shuffle后内存溢出
driver内存溢出
前两种情况发生在executor中,最后情况发生在driver中。我们针对每种情况具体分析
Driver Heap OOM
原因:2. 从Executor端收集数据回Driver端
解决方法:
2.1. 本身不建议将大的数据从Executor端, collect回来. 建议将Driver端对collect回来的数据所做的操作, 转化成Executor端RDD操作.
2.2. 如若无法避免, 自我评collect需要的内存, 相应增加driver-memory的值
Executor heap OOM
分几种情况:map过程产生大量对象导致内存溢出、数据倾斜导致内存溢出、coalesce调用导致内存溢出、shuffle后内存溢出。
1. map过程产生大量对象导致内存溢出:
这种溢出的原因是在单个map中产生了大量的对象导致的,针对这种问题,在不增加内存的情况下,可以通过减少每个Task的大小,以便达到每个Task即使产生大量的对象Executor的内存也能够装得下。具体做法可以在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map。例如:rdd.repartition(10000).map(x=>for(i <- 1 to 10000) yield i.toString)。
面对这种问题注意,不能使用rdd.coalesce方法,这个方法只能减少分区,不能增加分区,不会有shuffle的过程。
2.数据不平衡导致内存溢出:
数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用repartition重新分区
3.coalesce调用导致内存溢出:
例如在coalesce之前有100个文件,这也意味着能够有100个Task,现在调用coalesce(10),最后只产生10个文件,因为coalesce并不是shuffle操作,这意味着coalesce并不是按照我原本想的那样先执行100个Task,再将Task的执行结果合并成10个,而是从头到位只有10个Task在执行,原本100个文件是分开执行的,现在每个Task同时一次读取10个文件,使用的内存是原来的10倍,这导致了OOM。解决这个问题的方法是令程序按照我们想的先执行100个Task再将结果合并成10个文件,这个问题同样可以通过repartition解决,调用repartition(10),因为这就有一个shuffle的过程,shuffle前后是两个Stage,一个100个分区,一个是10个分区,就能按照我们的想法执行。
4.shuffle后内存溢出:
shuffle内存溢出的情况可以说都是shuffle后,单个文件过大导致的。
调整executor中shuffle操作的占比
spark.default.parallelism参数增大并行度
2.SQL很熟练,面试没遇到过不会的.一些业务SQL(留存,在线时长,漏斗,连续登陆天数,共同关注好友等等等)也写的很熟练.
3.如何保证数据质量,数据一致性?
4.数据指标如何保证一致性?
如何评估数据质量的好坏,业界有不同的标准,我总结了以下六个维度进行评估,包括完整性、规范性、一致性、准确性、唯一性、及时性。
1.数据完整性
完整性指的是数据信息是否存在缺失的状况,数据缺失的情况可能是整个数据记录缺失,也可能是数据中某个字段信息的记录缺失。
2.数据规范性
规范性指的是描述数据遵循预定的语法规则的程度,是否符合其定义,比如数据的类型、格式、取值范围等。
3.数据一致性
一致性是指数据是否遵循了统一的规范,数据集合是否保持了统一的格式。数据质量的一致性主要体现在数据记录的规范和数据是否符合逻辑,一致性并不意味着数值上的绝对相同,而是数据收集、处理的方法和标准的一致。常见的一致性指标有:ID 重合度、属性一致、取值一致、采集方法一致、转化步骤一致。
4.数据准确性
准确性是指数据记录的信息是否存在异常或错误。和一致性不一样,存在准确性问题的数据不仅仅只是规则上的不一致,更为常见的数据准确性错误就如乱码,其次异常的大或者小的数据也是不符合条件的数据。常见的准确性指标有:缺失值占比、错误值占比、异常值占比、抽样偏差、数据噪声。
5.数据唯一性
唯一性指的是数据库的数据不存在重复的情形。比如真实成交 1 万条,但数据表有 3000 条重复了,成了 1.3 万条成交记录,这种数据不符合数据唯一性。
6.数据及时性
及时性是指数据从产生到可以查看的时间间隔,也叫数据的延时时长。比如一份数据是统计离线今日的,结果都是第二天甚至第三天才能统计完,这种数据不符合数据及时性。
5.拉链表了解吗?什么情况用到,怎么实现?
6.对于缓慢变化的数据,在数据仓库中是如何处理的
1.原样保留或者重写,这种方式理论上都是取最新的值作为维度的最终的取值,每个维度保留一条数据。这种处理方式是最简单的,直接将原系统的维度同步过来使用就可以,不用做过多的处理。
2.插人新的维度行,每当维度发生变化的时候,插入新增的一行。采用此种方式,保留历史数据,
维度值变化前的事实和过去的维度值关联,维度值变化后的事实和当前的维度值关联。也就是一个维度会存在多行的数据,按时时间范围将维度与事实表关联。
3.添加维度列,采用这种方式,主要是为了将变化前后记录的事实归为变化前的维度或者归为变化后的维度。也就是将产生变化的维度,可以在汇总的时候按照统一分组处理。
4.历史拉链表,用维度记录的开始时间和结束时间来记录。
mr、spark的shuffle有什么不同
MR数据倾斜怎么处理
1、在map端提前进行conmbiner合并,减少数据传输量
在Mapper加上combiner相当于提前进行reduce,即把一个Mapper中的相同key进行了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量。
如果导致数据倾斜的key大量分布在不同的mapper的时候,这种方法就不是很有效了。
2、增加reduce并行度
3、导致数据倾斜的key 大量分布在不同的mapper
局部聚合加全局聚合。
跑spark的过程中当某个节点压力过大,怎么调优
spark shuffle 本地化
为什么要划分stage
因为程序是分布式集群中运行的,划分Stage的原因是由于任务类型的不一致:宽依赖和窄依赖。有的任务只依赖于一个父的RDD:一个Stage依赖于另一个Stage的结果,所以可以和父RDD放到同一task中执行,构成一个Stage。但是有的任务(例如reduce,group)等,需要的是全局数据,依赖于多个分区的处理结果,所以只等等待前面的执行,这就有了先后顺序(Stage),所以要划分。
划分出来的stage是放在集群中运行的,其中每个stage有多个task。每个task的逻辑一样,只是对应的分区是不相同。这多个task被分布在不同的机器上并发执行。不同的资源调度框架:Yarn、Mesos、Local等生成的DAG是完全一样,可以跨平台运行保证结果。
每个stage由多个task组成,这些task在任务逻辑上是一致的只是对应不同的分区。Partition的数量和同一任务逻辑的Task的数量是一致的,也就是说一个分区会被对应的stage的一个task处理,由多个Executor争抢。如果计算资源充足,一个Executor执行一个,不足会计算多个task。
spark任务出问题,怎么定位
spark shuffle了解吗,说一下,知道shuffle service吗
spark 的join
MR 过程中有几次排序过程 4
hive三级分区怎么解决小文件问题
解决小文件的问题,首选方案就是 “hive合并小文件”。
可以根据如下思路去解决:
方式一:对已有的数据进行定时或实时的小文件合并
方式二:在生成小文件前,进行相关的配置合并来预防
方式三:使用HAR归档文件
3.1 方式一:处理已有的小文件
3.1.1 insert overwrite 。。。。。。。 distribute by 命令
处理已有的小文件可以实时或定时操作,定时操作可在访问低峰期操作,如凌晨2点。
举例:控制dt分区目录下生成100个文件,且文件大小基本一致,那么hsql如下:
insert overwrite table test partition(dt)
select *
from test
distribute by cast(rand()*100 as int);
3.1.2 concatenate 命令
如果是orc格式存储的表,还可以使用如下命令进行小文件的合并:
alter table test [partition(…)] concatenate
3.2 方式二:预防小文件
通过调节hive参数的方式预防,配置与注释如下(在hive-site.xml配置也可以)
3.3 方式三:使用HAR归档文件
运用于每日定时脚本,对于已经产生小文件的hive表可以使用har归档,而且hive提供了原生支持
set hive.archive.enabled= true ;
set hive.archive.har.parentdir.settable= true ;
set har.partfile.size=256000000;
ALTER TABLE ad_dev.wlb_tmp_smallfile_20210118 ARCHIVE PARTITION(pt=‘2022-03-01’);
其他
如何进行etl链路优化
如果链路慢,但是没有sla风险,怎么优化(类似上一道题)
怎么数据链运行慢定位问题,对任务进行优化
mysql的存储引擎
外部表数据变动怎么和外部表建立联系
三种方式:
直接load
msck repair
上传数据之后添加分区
mysql b+树、索引、最左匹配原则
MySQL的事务特性?答:ACID,原子性,隔离性,持久性,一致性
隔离级别?答:未提交读,已提交读,可重复读,可串行化。顺便说了InnoDB对可重复读下幻读的解决方案。
有哪些数据结构可以作为索引呢?答:B+树。追问还有吗?答:也了解过hash索引,全文索引,位图索引
聚簇索引和非聚簇索引的区别?
MySQL还有哪些存储引擎?答:InnoDB、MyIsam
InnoDB和MyIsam的区别?bulabulabula
MyIsam适用于什么场景?答:全文索引,空间数据。追问:还有吗?答:不知道。。。
sql慢查询的解决方案?答:建索引,用expalin,复杂查询转换为小查询…
InnoDB为什么使用B+树作为存储引擎
什么是索引,有哪些索引,索引的缺点?B树和B+树有什么优缺点?
事务的特性(ACID)?
事务的隔离级别?什么是幻读?
MySQL默认的执行引擎是什么?它的默认隔离级别是什么?那可以避免幻读么?(我说不可以,面试官说那我就没法往下问了。我估计他是想问我MySQL 的MVCC和日志实现事务的隔离级别)
17.MySQL的了解,两个引擎区别
18.索引实效的情况
3.Mysql的事务实现原理?隔离级别?锁有哪些?聚簇索引?group by实现原理?b+树和b树?脏读幻读不可重复读?MVCC实现原理?
数据库引擎结构、区别
索引底层结构,插入数据索引结构的变化等
索引的优化方法,以及为什么(就是优化底层是怎么实现)
索引使用(优化器如何界定)
数据库几种日志,以及如何刷新,区别
数据库三个线程用处
数据库事务详细(不是指ACID几个性质,就是事务到底是基于什么实现的
1、数据库隔离级别、底层原理、每个级别如何解决上个级别的问题?
2、mysql 间隙锁实现方式
算法
二叉树遍历和还原
单词搜索(给一个list的字符串集合,快速判断,前缀树实现),一个字符串的单词搜索,时间复杂度是多少
有一种将字母编码成数字的方式:‘a’->1, ‘b->2’, … , ‘z->26’。 现在给一串数字,返回有多少种可能的译码结果。如输入’12’,输出2.
dfs一顿做,a了八十,然后和面试官说可以dp,dp讲了一下思路,面试官觉得没问题。
- 输入int n, 返回他的二进制有几个1
- 输入int n, 返回二进制[1,n]一共有几个1
算法:判断域名A是不是B的子域
算法题:返回一个用当前数的各位数字组成的比输入数大的最小的数,比如1234返回1243
算法题:小内存,在一亿条URL里面查找出现次数最多的URL
考察点
考察点 1:MapReduce 思想,利用中间文件存储,分而治之。
考察点 2:排序算法
解题思路
100 亿 *64/1024/1024/1024=596G,可考虑分成 1000 个文件处理,每 个文件大约 600M。
1.顺序读取文件,每行按照 hash(url)%1000 的结果将 url 写入到 1000 个文件中,这 个过程是 mapreduce 中的 map。
2.针对每个小文件,使用 hashmap 统计每个 url 出现的次数,并使用堆排序得到访问 次数最高的前 100 个 url。
3.将每个文件排序好的 100 个 url 及对应的 count 输出到 1000 个文件,最后将这个 1000 个文件(此时每个文件只有 100 行 ) 进行合并排序。



