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 数据损坏,如何...
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
[Spark Source Code 2] How spark access YARN and start container to run tasks.
Spark on YARN的整体运行的架构YARN重要的角色 Resource Manager: 全局资源管理器 ApplicationManager: 应用管理器(RM子组件), 接收Client提交的请求 为每个APP分配一个appId 选择NM启动AM 管理AM的生命周期 Scheduler: 资源调度器(RM子组件) 根据调度策略分配资源, 响应AM的资源请求 NodeManager: 节点管理器, 每台机器分配一个NM, 是这台机器在集群中的代理 管理单个节点的资源 向RM报告节点状态和资源使用情况 接收从AM收到请求 Container YARN中资源分配的基本单位 对应着一组CPU 内存等资源 运行ApplicationMaster (AM) 或Executor Spark on YARN的运行流程ApplicationMaster(区别于上面的ApplicationManager): 每个app都会分配一个AM, 该AM是这个app在YARN集群的代理, 运行在YARN集群中的app通过AM向RM(scheduler)请求资源 提交AM Cl...
[Spark Source Code 1] How launch a spark Application
只关注spark application通过spark-submit shell脚本启动的情况以问题为导向探究 ✅ spark-submit 脚本做了什么? ✅ Launcher 层的作用是什么?为什么需要它? ✅ 参数是如何从 Shell 传递到 Java 的? ✅ 为什么使用 NULL 分隔符? ✅ prepareSubmitEnvironment() 返回的 4 个值分别是什么? ✅ Client 和 Cluster 模式的 childMainClass 有什么不同? ✅ 不同集群管理器(YARN/K8s/Standalone)的启动有什么区别? ✅ app.start() 之后发生了什么? ✅ 配置的优先级是怎样的? ✅ 为什么某些模式组合不支持(如 LOCAL + CLUSTER)? How spark command is parsedshell脚本入口阶段 找到SPARK_HOME, JAVA_HOME, 将launcher入口类和submit入口类添加到执行路径中, 补全java命令, 执行命令 整体的流程entry pointfil...
Git 最佳实践
Git 最佳实践使用Git的核心原则是: 精细地控制自己的行为对于stage/work/local/remote的影响 尽可能拆分commit local: 每完成一个阶段性的任务就创建一个commit来便于rollback和比对自己的修改 remote: 所有的commit都应该基于main/dev创建, commit之间保持平行关系, 每次push之前fetch 保持主分支的commit线性 pull branch显示所有的远程的分支 1git branch -r 选择远程分支: 拉取所有的远程分支和直接修改远程分支都不是最佳的实践, 这样会破坏仓库的独立性, 最好的做法是创建一个关联到远程分支的本地分支 1git switch -c feature/login origin/feature/login commit & push 在commit之前需要先获取所有的更新来同步在你创建这个分支到你commit之前这个branch发生的变更, 如果团队使用rebase来MR, 在commit后一般还需要rebase到or...
[How] 如何去了解和学习一个项目
如何了解一个项目如果我们要最快上手一个项目, 我们该从哪些地方入手, 如何渐进式地掌控这个项目, 这些问题会是无论是工作还是学习的的过程中都不得不面临的问题. 该篇文章对这个问题进行一些方法论上的总结. 了解项目的可选途径 源码 + AI IDE : 这个是最重要的资料, 可能在过去没有AI IDE的时候, 一本合适的入门书会是我更推荐的第一选择, 但是有了AI IDE以后, 源码阅读的解释性由AI补全, 配合直接阅读源码这个第一手资料带来的准确性, AI辅助阅读源码能在易读性和准确性上都有非常好的表现, 不过对于AI使用者有一定的要求, 能够问出合适而准确的问题, 也会在后续小节尤其说明应该问什么. 官方文档: TODO 书籍: TODO 博客: TODO 如何使用源码 + AI IDE快速了解一个项目 通过AI为自己建立需求: 并不是所有时候都是带着很明确的需求打开的这个项目, 这种时候去了解一个项目很容易漫无目的和失焦. 所以第一件事就是让AI为自己建立需求, 可选的路径有 让AI为自己生成一系列渐进的问题, 并给出探索的方式 你是这个组件的大师, 我的公司要使用这个组件...
Livy基础知识
概念理解Livy 解决了什么问题?为什么不直接用 spark-submit?解决了用户提交spark任务的易用性和控制性问题, 使用户能通过HTTP请求向spark提交任务 权限问题: 使用spark-submit, 用户需要登陆上服务器, 使用spark-submit命令提交, 这将spark所在的服务器的访问权限和提交spark任务的权限绑定, 但是实际上提交spark任务的role和访问服务器的role应该是分离的. 易用性问题: 在过去用户需要在本地写好代码, 通过SFTP上传到服务器上, 再通过spark-submit提交任务, 现在用户可以通过jupyter + livy的方式, 在本地编写代码, 动态变更并且随时通过HTTP向Livy提交任务 自动化问题: 直接通过spark-submit提交任务, 无法对于spark任务进行集中管理, 捕获一些指标, 或者进行配置覆盖等其他的自动化的操作, Livy的引入相当于为用户和spark-submit之间注入了一个管理的中间层 Livy 支持哪几种 Session 类型?它们的区别是什么?Session Type分成I...
xv6 traps and system callls
traptrap有三种类型 system call exception interrupt 每次触发trap的时候我们都会从用户态陷入到内核态, 并且这个过程对于用户程序来说应该是没有感知的, 在执行完trap以后, 从内核态回到用户态. 所有的trap都只在内核中执行, 这样能保证对物理设备访问的隔离性, 也能在处理异常的时候可以做出像kill用户进程这样的内核才有权限执行的响应方式 完成一个trap需要四步 硬件CPU上的动作 准备好的汇编代码, 用于进入到内核中对印的trap处理c函数上 处理这个trap的c函数 内核运行代码的内核进程 RISC-V寄存器指令 用于系统控制的特殊的寄存器, 不能随便地读写, 需要特殊的指令才能读写 csrr: CSR寄存器 read csrw: CSR寄存器 write 寄存器 系统控制寄存器 sstatus: Supervisor Status Register监督者状态 SPP: (bit 8, 1L<< 8) 记录异常发生前的CPU的特权级别, 1 = 来自Supervisor, 0 = ...