1. 计网:TCP3次握手,4次挥手
  2. hive2server0
  3. yarn的工作流程
  4. 数据倾斜。
  5. Spark 和 Hive 的区别
  6. Yarn on client 和yarn on cluster+ spark
  7. lru数据结构。 算法题:
  8. 二叉树的右视图;
  9. 非负整数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)核心功能

  1. 多客户端并发访问:支持多个客户端(如100个Beeline终端)同时连接,通过Session隔离不同用户的SQL执行环境(如当前数据库、变量配置);
  2. 标准化接口支持:基于Thrift协议提供服务,支持JDBC/ODBC接口,Java/Python等语言可通过JDBC驱动连接Hive(如用java.sql.Connection连接HS2执行SQL);
  3. 权限与安全管理:集成Apache Sentry/Ranger实现细粒度权限控制(如限制用户仅能查询某张表、某列数据),避免未授权访问;
  4. 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任务提交为例)

  1. 客户端提交任务:客户端(如spark-submit脚本)将Spark作业(包含JAR包、配置参数)提交至RM,请求启动AM;
  2. RM分配AM资源并启动:RM检查集群资源,在某个NM上分配一个Container(如1核CPU、2GB内存),通知该NM启动AM;
  3. AM向RM申请任务资源:AM启动后,根据作业需求(如需要10个Executor),向RM申请10个Container(每个2核CPU、4GB内存),并指定资源需求(如优先分配CPU空闲的节点);
  4. RM分配资源,AM启动任务容器:RM根据NM的资源状态,将10个Container分配给不同NM,通知AM;AM与对应NM通信,启动Container中的任务(Spark Executor);
  5. 任务执行与监控:Executor启动后,执行具体计算任务(如Map/Reduce操作),并向AM汇报执行进度;AM实时监控任务状态,若某Executor失败,向RM申请新Container重启任务;
  6. 任务完成,释放资源:所有任务执行完成后,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)核心现象与识别

  • 现象
    1. 作业执行时间异常长:多数Task在10分钟内完成,少数Task需1-2小时;
    2. 资源利用率不均:少数Task的CPU/内存使用率持续100%,其他Task<30%;
    3. 报错风险:倾斜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)则存在倾斜。

(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 Now

Already have an account?