翻了一些牛客上的字节面经,对常见面试题做了下总结~
- Spark部分
-
- 1、Spark中Stage、Executor、Task都是干嘛的?
- 2、Spark 数据倾斜
- 3、spark为什么比mr快?
- 4、Spark的stage的划分是怎么划分的?
- 5、介绍一下 Spark RDD、DataFrame、DataSet
- 6、Spark的窄依赖和宽依赖
- 7、DAG Scheduler作用
- 8、Spark中有哪些算子会进行shuffle,有哪些不会进行shuffle
- 9、union可以形成宽依赖吗?
- 10、Spark 作业调度
- 11、Spark的提交模式
- 12、yarn-cluster涉及的参数有哪些
- 13、有关资源分配参数如何自动分配
- 14、Spark shuffle 过程
- 15、Driver 怎么管理 excutor的
- 16、cache()算子
- 17、广播变量介绍一下,什么场景下用广播变量?广播变量和cache区别?
- 18、Spark的组件有哪些
- 20、如果要增加并发应该使用什么参数,executor和core的比例怎么设置
- 21、Spark join的几种实现方式
- 22、map算子和flatMap
- 23、Hive和Spark区别
- Java部分
-
- 1、HashMap的实现?为什么要转化为红黑树?为什么大于8才转换?
- 2、ArrayList和LinkedList的区别?
- 3、CMS和G1垃圾收集器的区别?
- 4、HashMap是线程安全吗?为什么?
- 5、Java的IO模型?BIO和NIO的区别?
- 6、常见的gc回收器和区别
- 7、Map有哪几种
- 8、ConcurrentHashMap怎么保证线程安全
- 9、volatile和sychronized关键字原理
- 10、hashcode()相同,equals一定相同吗
- 11、HashTable和HashMap有什么区别
- 12、四种引用说一说
- 13、抽象类与接口的区别
- 14、JVM虚拟机,为什么需要虚拟机
- 15、多线程和多进程有什么区别?
- 16、java有哪些锁
- 17、JVM的内存模型讲一下。
- 18、hashmap冲突了怎么处理的?
- 19、treemap底层是怎么实现的?
- 20、线程的状态及状态之间的装换
- Hive部分
- 数仓部分
- Hadoop 部分
- 数据库部分
- 数据结构
- 计网
- 场景题
- Linux
- Coding
-
- 1、实现左旋n位的字符数组?
- 2、二叉树的广度优先遍历和深度优先遍历
- 3、sql题,求连续活跃5天的用户
- 4、实现微信发红包,输入是红包数和总金额,实现随机分配
- 5、一个数组里面每个元素表示每天的股票价钱,怎么样买入和卖出能赚最多的钱?只能先买入再卖出
- 6、n个个位数,全排列组成一个整数。怎么找到最近的下一个比他大的数。时间复杂度要求o(n)
- 7、返回二叉树的镜像,非递归算法。
- 8、抖音用户浏览视频日志 TableA(date, user_id, video_id), 统计2020.03.29观看视频最多的前5个user_id(相同视频要排重)。
- 9、leetcode80. 删除排序数组中的重复项 II
- 10、数组求top k
- 11、sql题 分组求每组top 3
- 12、二叉树的后序遍历 非递归实现
- 13、用spark求一下dau
- 14、子序列的最大和
- 15、最小逆序对
- 16、二叉树层序遍历,按层换行输出。
- 17、一个数组有正数有负数,调整数组中的数使得正负交替
- 18、leetcode 字典序的第k小数字
- 19、网上购物返现,假设你需要购买某一商品,每天都要购买一次,连续买n天,但每天有不同的价格。你知道每天的价格,如果某一天你花8块买了,未来某一天价格降到了1块,就会返现7块,只能返现一次。求连买n天商品的最小价钱。
- 20、快排
- 21、求一个成对数组中,只出现一次的数
- 22、用两个栈实现栈的排序
- 23、用两个栈实现队列
- 24、lc丑数3
- 25、数据流中的中位数
- 26、Leecode513. 找树左下角的值,非递归与递归两种方法
- 27、归并排序
- 28、两个有序数组间相加和的Topk问题
- 29、最少票价问题(动态规划求解)
- 30、二叉树的序列化与反序列化
- 31、二分查找
- 32、无重复字符的最长子串
- 33、大数组求中位数
- 34、使用spark写一个wordcount
- 35、两个字符串的最大公共子串
- 36、信封问题
- 37、两个二叉树如何判断是不是对称
- 38、链表翻转
- 39、N个有序数组,取其中m个最小的数,m远小于N个数组中数的个数,时间复杂度是多少
- 40、对折链表
- 41、给定误差范围,计算正浮点数x的平方根,不可以使用幂运算,可以用四则运算。
- 42、给定数组包含正负数(数量至多差1),要求将其排列成正负彼此相邻形式,要求时间复杂度O(N),空间复杂度O(1)
- 43、 1-N个数字,找出字典序第K大的数字,要求空间O(1),时间O(K)
- 44、给定一个序列和排序中间结果,判断是插入还是归并排序的中间结果,并输出下一次排序结果。
- 45、非递归后序遍历
- 46、二维数组的顺时针打印
- 47、旋转数组的查找
- 48、2个有序数组中位数,要求O(logN)
- 49、判断一颗二叉树的宽度
- 50、求字符串的最长回文子序列
- 51、接雨水
- 52、在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 53、我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
Spark部分
1、Spark中Stage、Executor、Task都是干嘛的?
- stage:每个job被划分为多个stage,一个stage中包含一个taskset
- task:在executor进程中执行任务的工作单元
- Executor:运行在worker节点上的一个进程,负责运行某些task,并将数据存在内存或者磁盘上。
- Worker:集群中可以运行Application代码的节点,在Spark on Yarn模式中指的就是NodeManager节点。
- Driver:main()函数,创建SparkContext,由SparkContext进行资源申请,任务的分配和监控等。程序执行完毕后关闭SparkContext。
2、Spark 数据倾斜
原理
shuffle时各个task处理的数据量不均匀
如何定位数据倾斜
- 只会发生在shuffle过程中,可能会触发shuffle操作的算子:distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition等
- 在web UI上查看,看日志,在代码第几行溢出,附近的shuffle算子
- 查看出现问题的RDD或hive表的key分布状况,用countByKey统计一下
解决方案
- 预处理,过滤导致倾斜的key
- 提高shuffle的并行度
- 将reduce join替换为map join:将小的broadcast广播,在大的里面用map遍历,看key是否相同
- 两阶段聚合(局部聚合+全局聚合),打上随机前缀,接着对打上随机数后的数据,执行reduceByKey等聚合操作,再对结果进行全局聚合,去掉前缀
- 使用随机前缀和扩容RDD进行join
3、spark为什么比mr快?
- shuffle过程中Hadoop需要落硬盘,spark不一定,可以缓存在内存中,IO少
- Hadoop的task是一个个进程,spark是一个个线程;
- Hadoop容错性低,spark可以根据RDD之间的血缘关系重算;
- spark有transform和action算子,只有遇到action才会触发job,会做流水线层面的优化;
- 多次使用的RDDspark可以进行缓存
4、Spark的stage的划分是怎么划分的?
在spark中,会根据RDD之间的依赖关系划分DAG图,对于窄依赖,由于partition依赖关系的确定性,可以在同一个线程里完成,窄依赖就被spark划分到同一个stage中。
stage划分思路:从后往前推,遇到宽依赖就断开,划分为一个stage,遇到窄依赖就将这个RDD加入该stage中。
5、介绍一下 Spark RDD、DataFrame、DataSet
- RDD:弹性分布式数据集,spark中最基本的数据抽象,不可变,可分区,里面元素可并行计算
- DataFrame是一种以RDD为基础的不可变分布式数据集,DataFrame与RDD的主要区别在于,DF带有schema元信息,数据都被组织到有名字的列中,每一列都带有名称和类型
- DataSet:和dataFrame差不多,可以把 DataFrame 当作 Dataset[Row] 的别名,每一行的类型是Row;
6、Spark的窄依赖和宽依赖
窄依赖:每个父RDD的一个分片最多被子RDD的一个分片使用。窄依赖以pipeline管道形式顺序执行多条命令,分区内的计算收敛,可以并行地在不同节点进行计算。失败时只需要计算丢失的parent partition
宽依赖:父RDD的分片会被多个子RDD的分片使用。需要所有的父分区都是可用的,失败恢复时,宽依赖牵涉RDD各级的多个parent partition
7、DAG Scheduler作用
接收提交的job的主入口,根据job构建基于stage的DAG,并将每个Stage打包(task的分区信息和方法,并序列化)成TaskSet交给TaskScheduler调度。stage的划分依据是RDD之间的依赖关系。还会处理 task 执行成功 , cancel job , cancel stage 等事件。
8、Spark中有哪些算子会进行shuffle,有哪些不会进行shuffle
***有 shuffle ***
distinct 、 intersection 、 substract 、substractByKey 、join 、lefouterjoin、
reduceByKey 、 group by 、 groupbykey 、 aggregratebykey 、 combinebykey 、
sortby 、 sortbykey 、 coalease 、 repartition
无 shuffle
map 、 flatmap 、 mapPartitions 、 filter
9、union可以形成宽依赖吗?
union 为窄依赖,不会触发 shuffle , 不会划分 stage , 可能会重新分区
10、Spark 作业调度
调度主要通过 DAG scheduler 和 Task Scheduler。
DAGScheduler:接收提交的job的主入口,根据job构建基于stage的DAG,并将每个Stage打包成TaskSet交给TaskScheduler调度。
TaskScheduler :将发来的 taskSet 封装为TaskSetManager加入到调度队列中,TaskSetManager负责监控管理同一个Stage中的Tasks,TaskScheduler就是以TaskSetManager为单元来调度任务。
SchedulerBackend 会定期询问 TaskScheduler 有没有任务要运行,TaskScheduler会从调度队列中按照指定的调度策略(FIFO(默认)、FAIR)选择 TaskSetManager 去调度运行。
11、Spark的提交模式
- standalone:基于Spark自己的Master-Worker集群。没用Yarn。
- yarn-cluster:driver运行在AM中,当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,不适合运行交互类型的作业。
- yarn-client:Client不能离开,Driver在哪提交就在哪
12、yarn-cluster涉及的参数有哪些
executor-memory
spark.driver.memory
spark.driver.maxResultSize
spark.executor.cores
spark.driver.cores
spark.sql.shuffle.partitions
spark.serializer
spark.network.timeout
spark.yarn.executor.memoryOverhead
spark.dynamicAllocation.maxExecutors
13、有关资源分配参数如何自动分配
spark.dynamicAllocation.enabled 资源动态分配
spark.dynamicAllocation.minExecutors 动态最小的executor数量
spark.dynamicAllocation.maxExecutors 动态最大的executor数量
14、Spark shuffle 过程
15、Driver 怎么管理 excutor的
16、cache()算子
17、广播变量介绍一下,什么场景下用广播变量?广播变量和cache区别?
18、Spark的组件有哪些
20、如果要增加并发应该使用什么参数,executor和core的比例怎么设置
21、Spark join的几种实现方式
总体上来说,Join的基本实现为,Spark将参与Join的两张表抽象为流式遍历表(streamIter)和查找表(buildIter),通常streamIter为大表,buildIter为小表,spark会基于streamIter来遍历,每次取出streamIter中的一条记录rowA,根据Join条件计算keyA,然后根据该 keyA 去 buildIter 中查找所有满足Join条件(keyB==keyA)的记录 rowBs,并将rowBs中每条记录分别与 rowA join得到 join 后的记录。
sort merge join:分别对 streamIter 和 buildIter 进行排序,在遍历streamIter时,对于每条记录,都采用顺序查找的方式从 buildIter 查找对应的记录,每次处理完 streamIter 的一条记录后,对于streamIter的下一条记录,只需从 buildIter 中上一次查找结束的位置开始查找,不必从头找。
broadcast join:如果 buildIter 是一个非常小的表,直接将buildIter广播到每个计算节点,直接在一个map中完成 join,也叫map join。
hash join:将来自buildIter的记录放到 hash表 中,加快查找
22、map算子和flatMap
map:将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素,有多少个输入分区,就有多少个输出分区
flatmap:Transformation算子,第一步和map一样,最后将所有的输出分区合并成一个分区,flatMap会将字符串看成是一个字符数组,并不会把Array[String]也扁平化成字符数组
23、Hive和Spark区别
Java部分
1、HashMap的实现?为什么要转化为红黑树?为什么大于8才转换?
实现
由数组和链表组合构成(可以从1.7、1.8展开详细讲)
为什么要转化为红黑树
链表是取一个数需要遍历链表,复杂度为O(N),而红黑树为O(logN)
为什么大于8才转换
哈希表中节点的频率遵循泊松分布,根据统计,列表长度为8的时候期望就已经很小了,没必要再往后调整。(源码中注释部分有具体解释)
2、ArrayList和LinkedList的区别?
A

本文详细梳理了字节跳动大数据开发面试的常见问题,涵盖Spark、Java、Hive、数据库、数据仓库、Hadoop等多个方面。内容包括Spark的Stage、Executor和Task的作用,数据倾斜的解决策略,以及Spark与MapReduce的速度优势等。还讨论了HashMap、ArrayList、LinkedList的区别,CMS和G1垃圾收集器的差异,以及Hive的窗口函数和分桶的区别。此外,还涉及到数据库的ACID原则、TCP的三次握手和四次挥手、数据流中的中位数计算等计算机网络和数据库基础。
最低0.47元/天 解锁文章
1545

被折叠的 条评论
为什么被折叠?



