Hive Introduction
Hive的作用Hive将提交任务这一件事情简化, 屏蔽了执行引擎, 提供了HiveQL供用户使用, 用户可以使用SQL的形式提交并执行任务. 从输入数据到最后的执行经过的步骤: 用户通过客户端连接到HiveServer2提交SQL -> Driver接受客户端的HiveQL -> Compiler / Semantic Analyzer / Optimizer将QL转化成逻辑计划, 物理计划, 并进行CBO优化 -> Execution Engine将物理计划分解成具体的执行任务, 提交到底层的计算引擎上 (MapReduce, Spark) -> 在HDFS上存储数据, 由YARN分配资源给计算引擎 另一条线是HiveServer2 -> Hive MetaStore Server访问元数据, 通过Thrift提供元数据 (表/分区/统计), 并将结果持久化到关系型数据库 HMS (Hive Metastore)HMS
Untitled
整体架构 Livy 的整体架构是怎样的?有哪几层? 🔍 探索:画出 REST API → Server → RSCClient → RSCDriver → Spark 的层次图 Livy Server 和 Spark Driver 是什么关系? 🔍 探索:理解 Livy Server 是客户端,Spark Driver 是服务端的反转架构 RSC (Remote Spark Context) 是什么?为什么需要它? 🔍 探索:rsc/src/main/java/org/apache/livy/rsc/README.md Livy 如何与 YARN/K8s 集成? 🔍 探索:SparkYarnApp.scala,查看如何监控 YARN 应用 模块职责 core、server、rsc、repl 四个模块各自的职责是什么? 🔍 探索:查看各模块的 pom.xml 依赖关系 为什么 Interactive Session 需要 ReplDriver,而...
Untitled
创建一个 Interactive Session 的完整流程是什么?经历了哪些步骤? 🔍 探索:InteractiveSession.create() → RSCClient 构建 → ContextLauncher 启动 Driver PingJob 是什么?为什么需要它? 🔍 探索:InteractiveSession.start() 第 537 行,理解连接验证 Session 从 Starting 到 Running 状态,中间发生了什么? 🔍 探索:跟踪 PingJob 的 onJobSucceeded 回调 如果 Spark Driver 启动失败,Session 会经历哪些状态? 🔍 探索:PingJob 的 onJobFailed 和 errorOut() 方法 代码执行流程 用户提交的代码是如何到达 Spark Driver 执行的? 🔍 探索:executeStatement() → RSCClient.submitReplCode() → RPC → ReplDriver.handle() RPC 通信是如何...
Untitled
状态管理 为什么 InteractiveSession 需要双层状态(serverSideState + replState)? 🔍 探索:state 属性的实现,理解细粒度状态监控 状态转换有哪些保护机制?为什么需要这些保护? 🔍 探索:transition() 方法的 areSameStates 和 transitFromInactiveToActive 检查 多个线程同时触发状态转换时,如何保证一致性? 🔍 探索:synchronized 关键字的使用 SparkApp 状态和 Session 状态的映射关系是什么? 🔍 探索:stateChanged() 回调,理解事件驱动的状态同步 会话恢复 Livy Server 重启后,如何恢复已有的 Session? 🔍 探索:InteractiveSession.recover(),SessionStore 的实现 支持哪些持久化方式?它们的优缺点是什么? 🔍 探索:FileSystemStateStore、ZooKeeperStateStore、JDBCStateStore...
Untitled
配置管理 有哪些关键的 Livy 配置项?如何调优? 🔍 探索:livy.conf.template,理解各配置项的作用 如何配置多个 Spark 版本支持? 🔍 探索:livy.spark.versions 配置 如何配置 Kerberos 认证? 🔍 探索:LivyServer.scala 中的 UserGroupInformation 如何配置资源隔离(队列、用户模拟)? 🔍 探索:AccessManager、proxyUser 参数 监控告警 Livy 暴露了哪些监控指标?如何采集? 🔍 探索:Metrics.scala,Prometheus 集成 如何监控 Session 的健康状态? 🔍 探索:/sessions API,状态监控 如何收集 Spark Driver 的日志? 🔍 探索:logLines() 方法,SparkApp.log() 如何知道 Session 启动时间过长? 🔍 探索:MetricsKey.INTERACTIVE_SESSION_START_TIME 高可用...
Untitled
RPC 机制 RPC 的消息格式是什么?如何序列化和反序列化? 🔍 探索:KryoMessageCodec.java,消息头和消息体 RPC 如何处理超时和重试? 🔍 探索:Rpc.call() 方法,Future 机制 SASL 握手的流程是什么? 🔍 探索:SaslHandler.java,客户端和服务端的认证 如何保证 RPC 连接的安全性? 🔍 探索:secret 的生成和验证 REPL 实现 Scala REPL 是如何集成的? 🔍 探索:ScalaInterpreter.scala,IMain 的使用 PySpark 是如何执行的?与 Scala 有何不同? 🔍 探索:PythonInterpreter.scala,py4j 的使用 如何实现代码自动补全? 🔍 探索:completion() 方法,REPL 的 complete 接口 如何取消正在执行的 Statement? 🔍 探索:cancelStatement(),线程中断机制 SparkApp 监控 YARN 应用状态是如何监控的? ...
Untitled
常见问题 Session 一直卡在 Starting 状态,如何排查? 🔍 探索:检查 Driver 日志、YARN 队列资源、网络连通性 PingJob 失败的常见原因有哪些? 🔍 探索:RPC 连接失败、Driver 启动超时、资源不足 Session 突然变成 Dead 状态,可能的原因? 🔍 探索:Driver OOM、YARN 杀掉应用、网络断开 代码执行超时,如何定位问题? 🔍 探索:Driver 日志、Spark UI、任务堆栈 性能问题 大量 Session 创建导致 Livy Server 压力大,如何优化? 🔍 探索:Session 池化、限流、资源预分配 RPC 通信成为瓶颈,如何优化? 🔍 探索:增加 rpc.max.threads、优化序列化 恢复大量 Session 时 Server 启动慢,如何解决? 🔍 探索:异步恢复、批量加载 数据问题 Session 恢复后状态不一致,如何处理? 🔍 探索:乐观锁机制、元数据清理 ZooKeeper 中的 Session 数据损坏,如何...
大数据结构总览
大数据结构大数据可以分成五个层次 数据收集:将数据从数据源收集到数据存储层, 常用的组件有关系型, 非关系型, 分布式消息队列三种 关系型: Sqooq/Canal, 连接MySQL这种关系型数据库和Hadoop之间的桥梁, Sqool可以全量将数据库中的数据导入到Hadoop中, Canal则能实现增量的导入 非关系型: Flume, 流式数据收集, 比如日志等数据, 经过ETL以后导入到Hadoop中 分布式消息队列: [[Kafka]], 常用作消息总线, 有分布式的高容错的设计, 适配大数据场景 数据存储主要由分布式文件系统和分布式数据库组成 分布式文件系统: HDFS, Hadoop分布式文件系统, 有强大的容错机制, 社区开发了很多种文件格式 分布式数据库: HBase, 构建在HDFS之上的分布式数据库, 提供结构化和半结构化的数据库, 支持列无限拓展 资源管理和服务调度 YARN: 统一资源管理与调度系统, 能够管理集群中的各种资源, 并按照一定策略分配给上层的各类应用. 同时支持灵活的配置, 允许用户按照队列的方式组织和管理资源, 且每个队列的...
Untitled
How to Comment行中注解对于代码的注解, 除了本身写法非常的晦涩的(比如c/cpp), 需要写 “这是什么的” 注解, 其他大多数情况下, 我们的注解的职责需要关注 “为什么”, 在需要的地方解释这里为什么会需要这么一段代码. 行中注解应该避免繁琐的 “这是什么的”. 让你的代码易读/解释性强/清晰应该是你的 ”code“ 的尽力实现的职责, 好的代码应该本身就易读, 不要把这个工作推脱给comment. “comment”在行中的职责是补充为什么