- 计网:TCP3次握手,4次挥手
- hive2server0
- yarn的工作流程
- 数据倾斜。
- Spark 和 Hive 的区别
- Yarn on client 和yarn on cluster+ spark
- lru数据结构。 算法题:
- 二叉树的右视图;
- 非负整数c,是否存在正整数a,b,使得a^2+b^2=c;
1. 计网:TCP三次握手、四次挥手
考察知识点
- TCP协议的核心特性(面向连接、可靠传输)
- 三次握手的目的(建立可靠连接,同步序列号)
- 四次挥手的原因(半关闭状态,确保数据传输完成)
- 关键标志位(SYN、ACK、FIN)的作用
参考回答
TCP(传输控制协议)是面向连接的可靠传输协议,通过“三次握手”建立连接,“四次挥手”关闭连接,核心是确保数据在不可靠的网络中准确、完整传输。
(1)三次握手(建立连接,客户端→服务器)
目的:双方同步初始序列号(ISN),确认彼此的收发能力,建立可靠连接。
过程(以客户端主动发起连接为例):
步骤 | 发起方 | 报文标志位 | 核心内容(序列号/确认号) | 目的 |
---|---|---|---|---|
1 | 客户端 | SYN=1 | 发送初始序列号 ISN_client (如x),无确认号 |
向服务器请求建立连接,同步客户端的发送序列号 |
2 | 服务器 | SYN=1, ACK=1 | 确认号= ISN_client+1 (x+1),发送服务器ISN ISN_server (如y) |
确认收到客户端请求,同步服务器的发送序列号,告知客户端“我已准备好接收” |
3 | 客户端 | ACK=1 | 确认号= ISN_server+1 (y+1),序列号= ISN_client+1 (x+1) |
确认收到服务器的同步信息,告知服务器“我已准备好发送数据”,连接建立 |
为什么是三次?
- 若仅两次握手:服务器发送SYN+ACK后就认为连接建立,但客户端可能未收到该报文,服务器会持续等待客户端数据,造成资源浪费;
- 三次握手可确保双方“收发能力正常”且“序列号同步”,是最低成本的可靠连接方式。
(2)四次挥手(关闭连接,客户端→服务器)
目的:终止连接,确保双方已发送的所有数据都被接收,避免数据丢失。
过程(以客户端主动关闭为例):
步骤 | 发起方 | 报文标志位 | 核心内容(序列号/确认号) | 目的 |
---|---|---|---|---|
1 | 客户端 | FIN=1, ACK=1 | 序列号= seq_client (已发数据的下一个序列号),确认号= ack_client |
客户端告知服务器“我已无数据要发送,请求关闭发送通道”(半关闭状态) |
2 | 服务器 | ACK=1 | 确认号= seq_client+1 ,序列号= seq_server |
服务器确认收到关闭请求,此时服务器仍可向客户端发送未完成的数据 |
3 | 服务器 | FIN=1, ACK=1 | 序列号= seq_server_new (剩余数据发送完毕后的序列号),确认号= seq_client+1 |
服务器告知客户端“我已无数据要发送,请求关闭接收通道” |
4 | 客户端 | ACK=1 | 确认号= seq_server_new+1 ,序列号= seq_client+1 |
客户端确认收到服务器关闭请求,等待2MSL(最长报文段寿命)后释放连接 |
为什么是四次?
- TCP是全双工通信(双方可同时收发数据),关闭连接时需分别关闭“客户端→服务器”和“服务器→客户端”两个方向的通道;
- 第二次挥手后,服务器可能仍有未发送的数据,需先完成数据传输,再发起第三次挥手(FIN),因此无法像三次握手那样合并为三次。
补充注意要点
- 关键标志位含义:SYN(同步序列号,用于建立连接)、ACK(确认标志,用于确认收到数据)、FIN(终止标志,用于关闭连接);
- 2MSL等待(四次挥手第四步):确保服务器收到客户端的最终ACK,避免服务器因未收到ACK而重发FIN报文;
- 异常情况:若三次握手时服务器未收到客户端的第三次ACK,会重发SYN+ACK(默认重发5次,间隔指数级增长),超过次数则放弃连接。
2. HiveServer2
考察知识点
- HiveServer2的核心定位(Hive的服务端组件,提供客户端访问接口)
- 主要功能(多客户端连接、权限管理、SQL执行)
- 架构组成(Thrift服务、Session管理、执行引擎对接)
参考回答
HiveServer2(HS2)是Apache Hive的核心服务端组件,提供标准化的客户端访问接口,允许外部应用(如Beeline、JDBC/ODBC客户端、BI工具)通过SQL与Hive交互,解决了Hive早期版本(HiveServer1)不支持多客户端并发连接的问题。
(1)核心功能
- 多客户端并发访问:支持多个客户端(如100个Beeline终端)同时连接,通过Session隔离不同用户的SQL执行环境(如当前数据库、变量配置);
- 标准化接口支持:基于Thrift协议提供服务,支持JDBC/ODBC接口,Java/Python等语言可通过JDBC驱动连接Hive(如用
java.sql.Connection
连接HS2执行SQL); - 权限与安全管理:集成Apache Sentry/Ranger实现细粒度权限控制(如限制用户仅能查询某张表、某列数据),避免未授权访问;
- SQL执行与优化:接收客户端SQL请求后,提交至Hive的执行引擎(默认MapReduce,可配置为Spark/Flink),并返回执行结果(如查询结果集、执行状态)。
(2)架构组成
HS2采用“服务端+客户端”架构,核心组件如下:
- Thrift Server:监听指定端口(默认10000),处理客户端的Thrift协议请求(如SQL提交、结果获取);
- Session Manager:管理每个客户端的Session,保存Session级别的配置(如
hive.exec.dynamic.partition
)、执行计划、临时数据; - Query Planner/Compiler:将客户端提交的SQL解析为抽象语法树(AST),优化后生成执行计划(如MapReduce/Spark任务);
- Execution Engine Bridge:对接底层执行引擎(MapReduce/Spark/Flink),提交执行计划并获取执行结果,返回给客户端;
- Authentication/Authorization:负责用户认证(如Kerberos认证)和权限校验(如通过Sentry判断用户是否有表的查询权限)。
(3)典型使用场景
- 多用户共享Hive集群:数据分析师通过Beeline终端同时连接HS2执行SQL查询;
- BI工具集成:Tableau/Superset通过JDBC连接HS2,读取Hive中的数仓表生成可视化报表;
- 程序自动化访问:Python脚本通过
pyhive
库(基于JDBC)连接HS2,定时执行数据清洗SQL(如每日凌晨清洗DWD层表)。
补充注意要点
- 端口配置:默认端口10000,若端口被占用可在
hive-site.xml
中通过hive.server2.thrift.port
修改; - 高可用部署:生产环境需部署多个HS2节点,通过ZooKeeper实现负载均衡(客户端连接ZooKeeper地址,而非单个HS2节点);
- 性能优化:若并发查询多,可增加HS2的
hive.server2.max.worker.threads
(默认50),提升并发处理能力。
3. YARN的工作流程
考察知识点
- YARN的核心定位(Hadoop生态的资源管理器,调度多计算框架)
- 核心组件(ResourceManager、NodeManager、ApplicationMaster)的职责
- 任务提交与执行的完整流程(从客户端到任务完成)
参考回答
YARN(Yet Another Resource Negotiator)是Hadoop的分布式资源管理系统,统一管理集群的CPU、内存等资源,为MapReduce、Spark、Flink等计算框架提供资源调度和任务监控服务,实现“一个集群支撑多种计算任务”。
(1)核心组件及职责
组件 | 角色 | 核心职责 |
---|---|---|
ResourceManager(RM) | 集群主节点 | 1. 接收客户端任务提交;<br>2. 管理集群资源(CPU/内存),分配资源给NodeManager;<br>3. 监控ApplicationMaster(AM)状态,异常时重启 |
NodeManager(NM) | 集群从节点 | 1. 管理本节点的资源(如8核CPU、32GB内存);<br>2. 启动/监控Container(任务执行容器);<br>3. 向RM汇报节点资源使用情况和Container状态 |
ApplicationMaster(AM) | 任务管理者 | 1. 为当前任务(如Spark作业)向RM申请资源(Container);<br>2. 与NM通信,启动Container执行任务;<br>3. 监控任务执行状态,失败时重试 |
Container | 任务执行容器 | 封装节点的资源(如1核CPU、2GB内存),是任务(Map/Reduce Task、Spark Executor)的执行单元 |
(2)完整工作流程(以Spark任务提交为例)
- 客户端提交任务:客户端(如
spark-submit
脚本)将Spark作业(包含JAR包、配置参数)提交至RM,请求启动AM; - RM分配AM资源并启动:RM检查集群资源,在某个NM上分配一个Container(如1核CPU、2GB内存),通知该NM启动AM;
- AM向RM申请任务资源:AM启动后,根据作业需求(如需要10个Executor),向RM申请10个Container(每个2核CPU、4GB内存),并指定资源需求(如优先分配CPU空闲的节点);
- RM分配资源,AM启动任务容器:RM根据NM的资源状态,将10个Container分配给不同NM,通知AM;AM与对应NM通信,启动Container中的任务(Spark Executor);
- 任务执行与监控:Executor启动后,执行具体计算任务(如Map/Reduce操作),并向AM汇报执行进度;AM实时监控任务状态,若某Executor失败,向RM申请新Container重启任务;
- 任务完成,释放资源:所有任务执行完成后,AM向RM提交作业完成报告,请求注销;RM通知各NM销毁Container,释放资源;客户端获取作业执行结果(成功/失败)。
补充注意要点
- 资源调度策略:RM默认采用“Capacity Scheduler”(容量调度),按队列分配资源(如“spark队列”占集群40%资源,“mapreduce队列”占60%),避免资源争抢;
- 容错机制:AM失败时,RM会在其他NM上重启AM(默认重试2次);Container失败时,AM自主申请新资源重试;
- 多框架支持:YARN不绑定具体计算框架,Spark、Flink、MapReduce任务可同时在YARN集群运行,资源按需分配。
4. 数据倾斜
考察知识点
- 数据倾斜的定义(计算任务中某Task数据量远超其他Task)
- 核心现象(长尾Task、资源利用率不均、OOM报错)
- 常见原因(热点Key、空值Key、数据类型不匹配)
- 针对性解决方案(Key加盐、空值处理、算子优化)
参考回答
数据倾斜是大数据计算(Spark/Flink/Hive)中典型的性能问题,指某一个或几个Task处理的数据量(如10GB)远大于其他Task(如100MB),导致该Task成为“长尾任务”,拖慢整个作业执行时间,甚至因内存不足(OOM)失败。
(1)核心现象与识别
- 现象:
- 作业执行时间异常长:多数Task在10分钟内完成,少数Task需1-2小时;
- 资源利用率不均:少数Task的CPU/内存使用率持续100%,其他Task<30%;
- 报错风险:倾斜Task可能抛出
OutOfMemoryError
(内存不足)或TaskTimeoutException
(超时)。
- 识别工具:
- Spark:通过Spark UI(
http://driver:4040
)查看“Stage → Tasks → Shuffle Read Size”,若某Task的Shuffle Read数据量是其他Task的5倍以上,可判定为倾斜; - Hive:通过YARN UI查看Map/Reduce Task的输入数据量,差异显著(最大/最小>10)则存在倾斜。
- Spark:通过Spark UI(
(2)常见原因
原因 | 示例(Spark Join场景) |
---|---|
热点Key | 某user_id=10086 对应1000万条订单数据,Join时所有该Key数据分配到同一个Task |
空值Key | 10%的订单user_id 为null,Join时所有空值Key被分配到同一个Task |
数据类型不匹配 | 左表user_id 为String(如“123”),右表为Int(123),Hash值计算异常,某Task堆积数据 |
算子不当 | 使用groupByKey (无Map端预聚合)替代reduceByKey ,或count(distinct) 处理高基数字段 |
(3)解决方案
原因 | 解决方案 | 适用场景 |
---|---|---|
热点Key | Key加盐:对热点Key添加随机前缀(如10086_0 -10086_9 ),拆分后Join再合并结果 |
热点Key数据量占比10%-30% |
空值Key | 1. 过滤空值:无业务意义的空值直接过滤(WHERE user_id IS NOT NULL );<br>2. 空值加盐:对空值Key添加随机后缀(NULL_0 -NULL_9 ) |
空值占比高(>5%),且无法过滤 |
数据类型不匹配 | 统一数据类型:将Join Key转为一致(如CAST(b.user_id AS STRING) ) |
字段类型定义错误导致的倾斜 |
算子不当 | 1. 用reduceByKey 替代groupByKey (Map端预聚合减少数据量);<br>2. 用approx_count_distinct 替代count(distinct) |
聚合类算子导致的倾斜 |
大表Join大表 | 分桶Join:两表按Join Key分桶(如100桶),Join时仅相同分桶数据交互,减少Shuffle | 两表均超10GB,且高频Join |
补充注意要点
- 优先定位原因:通过监控工具明确是“热点Key”“空值”还是“类型不匹配”,避免盲目尝试方案;
- 平衡优化成本:若倾斜Task耗时在可接受范围(如总作业30分钟,倾斜Task5分钟),无需优化,避免增加代码复杂度;
- 结合引擎特性:Spark的
spark.sql.adaptive.enabled
(自适应执行)、Flink的“动态负载均衡”可自动缓解部分倾斜,优先启用。
5. Spark 和 Hive 的区别
考察知识点
- 两者的核心定位(Hive是数仓工具,Spark是计算框架)
- 计算模型、处理速度、适用场景的本质差异
- 协同关系(Spark可作为Hive的执行引擎)
参考回答
Spark和Hive均为大数据生态的核心组件,但定位完全不同:Hive是构建在Hadoop之上的数据仓库工具,侧重“数据存储与管理”;Spark是分布式计算框架,侧重“高效数据计算”,两者常协同工作(Spark作为Hive的执行引擎)。
This post is for subscribers on the 网站会员 and 成为小万的高级会员 tiers only
Subscribe NowAlready have an account? Sign In