声明:面经从 络上搜集,自己补充了答案,不保证准确。
1、自我介绍
2、你这些实习好像都很短啊,原因是什么/h5>
3、讲一下 xxx 公司实习的内容吧。
- oncall:就是查 bug,线上出问题了会找到你。怎么查这个 bug 呢,这就是追溯,可以后面写文章详细讨论。
- 重构:以前的表换了,比如 dwd 层一张表换成了另一张表,你下游的 dws、app 是不是都得变。这里就会产生数据一致性问题,面试经常问数据一致性,这里后面详细讨论。
- 开发迭代需求:在已有的需求基础上迭代,修改一些原来已经存在的代码。这里就需要你读懂前人的代码逻辑…
- 开发新需求:这个工作周期长,难度大,需要和 PM、QA、RD、UI 等等很多人合作。这里后面细说。
- 回溯:这个工作占比很大,比如你产出了 app 层的表,修改了其中的口径(可以理解为字段的计算逻辑),那么修改完后是不是的重跑历史数据,这并不是点一下运行就能完事的。后面再详细讨论。
- 同步:怎么把 Hive 的数据推导 Elasticsearch 或者 ClickHouse 让线上能够使用/li>
- 看书:《Hive 编程指南》
4、Spark 的宽窄依赖了解么/h5>
- 定义:在 DAG 调度中需要对计算过程划分 stage,而划分依据就是 RDD 之间的依赖关系。针对不同的转换函数, RDD 之间的依赖关系分类窄依赖(narrow dependency)和宽依赖(wide dependency, 也称 shuffle dependency)。
- 窄依赖是指父 RDD 的每个分区只被子 RDD 的一个分区所使用,子 RDD 分区通常对应常数个父 RDD 分区(O(1),与数据规模无关)
- 宽依赖是指父 RDD 的每个分区都可能被多个子 RDD 分区所使用,子 RDD 分区通常对应所有的父 RDD 分区(O(n),与数据规模有关)
- 如何划分:有 Shuffle 的是宽依赖。
5、Spark 中的 RDD、DataFrame、DataSet 的区别/h5>
- 定义:在 DAG 调度中需要对计算过程划分 stage,而划分依据就是 RDD 之间的依赖关系。针对不同的转换函数, RDD 之间的依赖关系分类窄依赖(narrow dependency)和宽依赖(wide dependency, 也称 shuffle dependency)。
- 窄依赖是指父 RDD 的每个分区只被子 RDD 的一个分区所使用,子 RDD 分区通常对应常数个父 RDD 分区(O(1),与数据规模无关)
- 宽依赖是指父 RDD 的每个分区都可能被多个子 RDD 分区所使用,子 RDD 分区通常对应所有的父 RDD 分区(O(n),与数据规模有关)
- 如何划分:有 Shuffle 的是宽依赖。
5、Spark 中的 RDD、DataFrame、DataSet 的区别/h5>
标准 | Spark Datasets | Spark Dataframes | Spark RDDs |
---|---|---|---|
数据表示 | Spark Datasets 是 Dataframe 和 RDD 的组合,具有静态类型安全和面向对象接口等特性。 | Spark Dataframe 是组织成命名列的分布式数据集合。 | Spark RDD 是一个没有模式的分布式数据集合。 |
优化 | Datasets 使用催化剂优化器进行优化。 | Dataframes 使用催化剂优化器进行优化。 | 没有内置的优化引擎。 |
模式投影 | Datasets 使用 SQL 引擎自动查找模式。 | Dataframes 也会自动找到模式。 | Schema 需要在 RDD 中手动定义。 |
聚合速度 | 数据集聚合比 RDD 快,但比 Dataframes 慢。 | 由于提供了简单而强大的 API,Dataframe 中的聚合速度更快。 | 在执行数据分组等简单操作时,RDD 比数据帧和数据集都慢。 |
6、Spark 中的 map 和 flatMap 的区别是什么/h5>
- map 的作用是对 rdd 之中的元素进行逐一进行函数操作映射为另外一个 rdd。即对每一条输入进行指定的操作,然后为每一条输入返回一个对象;
- flatMap 的操作是将函数应用于 rdd 之中的每一个元素,将返回的迭代器的所有内容构成新的 rdd。即先映射后扁平化,最后合并成一个对象。
7、Spark 中的 groupByKey、reduceByKey、aggregateByKey 的区别/h5>
groupByKey 和 reduceByKey:
- 从 shuffle 的角度:reduceByKey 和 groupByKey 都存在 shuffle 的操作,但是 reduceByKey 可以在 shuffle 前对分区内相同 key 的数据进行预聚合(combine)功能,这样会减少落盘的数据量,而 groupByKey 只是进行分组,不存在数据量减少的问题,reduceByKey 性能比较高。
- 从功能的角度:reduceByKey 其实包含分组和聚合的功能。groupByKey 只能分组,不能聚合,所以在分组聚合的场合下,推荐使用 reduceByKey,如果仅仅是分组而不需要聚合。那么还是只能使用 groupByKey。
reduceByKey 和 aggregateByKey:
- reduceByKey 可以认为是 aggregateByKey的简化版;
- aggregateByKey 分为三个参数,多提供了一个函数 Seq Function,可以控制如何对每个 partition 中的数据进行先聚合,然后才是对所有partition中的数据进行全局聚合。
8、一个完整的 MapReduce 整个有哪些过程些过程中哪些会用到排序呢/h5>
过程:
- Map 阶段:提交待处理文本,任务规划,提交到Yarn,算出 MapTask 数量,TextInputFormat 读数据,在 Maptask 中进行逻辑运算,把输入变成 kv 键值对,分区方法将数据标记好分区,outputCollector 把数据输出到环形缓冲区。
- shuffle 阶段:环形缓冲区达到 80% 溢写,溢写前对 key 的索引快排,溢写文件归并排序,也可 combiner,最后按分区存到磁盘。
- Reduce 阶段:拉取分区的数据,先存到内存,不够再存磁盘,拉完后归并排序。这里拉取数据是按照 key 进行 hash,相同的 key 会进入同一个 reduceTask,大量热点 key 进入同一个 reducetask 可能产生数据倾斜。
排序:一次快速排序,两次归并排序。
9、Hadoop 里面的 SecondaryNameNode 的作用是什么体恢复过程了解么/h5>
- 作用:SecondaryNameNode 每隔一段时间对 NameNode 元数据备份。
- 恢复:删除 NameNode 存储的数据。拷贝 SecondaryNameNode 中数据到原 NameNode 存储数据目录。重新启动 NameNode。
10、Hive 里面的 join 分哪些类型呢ive 的 join 的优化一般会怎么优化了 mapjoin 还知道别的么/h5>
分类:
包括 inner join、left outer join、right outer join、full outer join 类似其他数据库的操作。
还有下面讲一些使用较少的:
left semi join:返回左表的记录,前提是该记录在右表存在。例如:
笛卡尔积 join:错误的连接可能导致笛卡尔积,它会产生大量的数据,无法优化。设置为 strict 会阻止笛卡尔积。
map-side join:设置开启 map-side join,并设置使用这个优化时小表的大小:
如果所有的表有相同的分桶数,且数据是按照连接键或桶的键排序的,那么可以使用更快的分类-合并连接(sort-merge JOIN):
优化:
- left semi join 代替 in。
- mapjoin:将数据量比较小的表,直接缓存在内存,然后在map段完成join,性能提高不少。
11、kafka接触过吗时计算的 Spark Streaming、Flink 了解过吗/h5>
12、数仓分层一般分为哪几层仓建模时用到的雪花模型和星型模型的区别/h5>
分层:
- 操作数据层 ODS:把操作系统数据几乎无处理地存放在数据仓库系统中;
- 公共维度模型层 CDM:存放明细事实数据、维表数据及公共指标汇总数据 , 其中明细事实数据、维表数据一般根据 ODS 层数据加工生成,CDM 层又细分为明细数据层 DWD 和汇总数据层 DWS ,采用维度模型方法作为理论基础,更多地采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联,提高明细数据表的易用性:同时在汇总数据层,加强指标的维度退化,采取更多的宽表化手段构建公共指标数据层,提升公共指标的复用性。
- 应用数据层 APP:存放数据产品个性化的统计指标数据,根据 CDM 层与 ODS 层加工生成 (个性化指标:排名型、比值型等)。
- 维度 DIM:商品维度表(维度整合)、地区维度表(维度整合)、日期维度表、优惠券维度表、活动维度表(整合)。
13、主要开发语言是什么/h5>
14、讲一下 JVM 的内存模型吧。
【 络八股文3】
TCP/IP | UDP |
---|---|
面向连接的协议 | 无连接协议 |
更可靠 | 不太可靠 |
传输速度较慢 | 更快的传输 |
数据包顺序可以保留或重新排列 | 数据包顺序不固定,数据包相互独立 |
使用三种方式握手模型进行连接 | 无需握手即可建立连接 |
TCP 数据包是重量级的 | UDP数据包是轻量级的 |
提供错误检查机制 | 没有错误检查机制 |
HTTP、FTP、Telnet、SMTP、HTTPS 等协议在传输层使用 TCP | DNS、RIP、SNMP、RTP、BOOTP、TFTP、NIP 等协议在传输层使用 UDP |
23、HTTP和HTTPS有什么区别/h5>
HTTP 是超文本传输协议,它定义了有关如何在万维 (WWW) 上传输信息的规则和标准。它有助于 络浏览器和 络服务器进行通信。这是一个“无状态协议”,其中每个命令相对于前一个命令是独立的。HTTP 是建立在 TCP 之上的应用层协议。它默认使用端口 80。
HTTPS 是超文本传输协议安全或安全 HTTP。它是 HTTP 的高级和安全版本。在 HTTP 之上,SSL/TLS 协议用于提供安全性。它通过加密通信来实现安全交易,还有助于安全地识别 络服务器。它默认使用端口 443。
24、子 掩码有什么用/h5>
子 是通过称为子 划分的过程实现的 络内部的 络,该过程有助于将 络划分为子 。用于获得更高的路由效率,增强 络的安全性。它减少了从路由表中提取主机地址的时间。
子 掩码(subnet mask)用来指明一个 IP 地址的哪些位标识的是主机所在的子 ,以及哪些位标识的是主机的位掩码。子 掩码不能单独存在,它必须结合 IP 地址一起使用。
25、进程和线程的区别程间通信的方式/h5>
进程:资源分配的基本单位。进程基本上是一个当前正在执行的程序。操作系统的主要功能是管理和处理所有这些进程。当一个程序被加载到内存中并成为一个进程时,它可以分为四个部分——堆栈、堆、文本和数据。
线程:独立调度的基本单位。线程是由程序计数器、线程 ID、堆栈和进程内的一组寄存器组成的执行路径。它是 CPU 利用率的基本单位,它使通信更加有效和高效,使多处理器体系结构的利用率能够达到更大的规模和更高的效率,并减少上下文切换所需的时间。它只是提供了一种通过并行性来改进和提高应用程序性能的方法。线程有时被称为轻量级进程,因为它们有自己的堆栈但可以访问共享数据。
在一个进程中运行的多个线程共享进程的地址空间、堆、静态数据、代码段、文件描述符、全局变量、子进程、待定警 、信 和信 处理程序。
每个线程都有自己的程序计数器、寄存器、堆栈和状态。
进程 | 线程 |
---|---|
它是一个正在执行的计算机程序。 | 它是进程的组件或实体,是最小的执行单元。 |
重量级。 | 轻量级。 |
它有自己的内存空间。 | 它使用它们所属进程的内存。 |
与创建线程相比,创建进程更难。 | 与创建进程相比,创建线程更容易。 |
与线程相比,它需要更多资源。 | 与流程相比,它需要更少的资源。 |
与线程相比,创建和终止进程需要更多时间。 | 与进程相比,创建和终止线程所需的时间更少。 |
它通常运行在单独的内存空间中。 | 它通常运行在共享内存空间中。 |
它不共享数据。 | 它彼此共享数据。 |
它可以分为多个线程。 | 不能再细分了。 |
IPC(进程间通信) 是一种需要使用共享资源(如在进程或线程之间共享的内存)的机制。通过 IPC,操作系统允许不同的进程相互通信。它仅用于在一个或多个程序或进程中的多个线程之间交换数据。在这种机制中,不同的进程可以在操作系统的批准下相互通信。
不同的 IPC 机制:
- 管道
- 消息队列
- 信 量
- 套接字
- 共享内存
- 信
26、什么是死锁,死锁产生的必要条件有哪些/h5>
死锁通常是一组进程被阻塞的情况,因为每个进程都持有资源并等待获取另一个进程持有的资源。在这种情况下,两个或多个进程只是尝试同时执行并等待每个进程完成它们的执行,因为它们相互依赖。
死锁的必要条件
死锁的必要条件基本上有以下四个:
- 互斥
- 请求
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!