没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论

Hive on Spark 源码分析
基于
Hive
源码
HIVE ON SPARK 源码分析........................................................................................................................................................ 1
基于
HIVE
源码
........................................................................................................................................................................ 1
1、HIVE ON SPARK 基本原理..............................................................................................................................................................5
1.1
运行模式
...............................................................................................................................................................................5
在之前的 HIVE ON SPARK 原理的文档中已经对 HIVE ON SPARK 的运行流程进行了分析:...................................................5
HIVE ON SPARK 支持两种运行模式,本地(LOCAL)和远程(REMOTE):.........................................................................5
............................................................................................................................................................................................... 5
当用户把 SPARK MASTER URL 设置为 LOCAL 时,采用本地模式;其余情况采用远程模式。本地模式下,SPARKCONTEXT
与客户端运行在同一个 JVM 中;远程模式下,SPARKCONTEXT 运行在独立的 JVM 中。本地模式通常用于调试,所以主要
分析远程模式。...................................................................................................................................................................... 5
............................................................................................................................................................................................... 6
1.2 Hive
解析
HQL........................................................................................................................................................................6
HIVE 的 SQL 解析引擎会将每句 SQL 解析成任务,并且根据不同的执行引擎调用不同子类去生成 TASK...............................6

............................................................................................................................................................................................... 6
1.3 TaskCompile
生成
Task..........................................................................................................................................................6
在 TASKCOMPILE 中去生成 TASK 的方法:............................................................................................................................. 6
............................................................................................................................................................................................... 6
在 SPARKCOMPILE 中的实现,生成 HQL 执行的任务树:...................................................................................................... 6
2、HIVE ON SPARK 交互类图..............................................................................................................................................................7
插入图,说明:接下去的内容的交互顺序可参考此图。....................................................................................................... 7
............................................................................................................................................................................................... 8
3、源码分析................................................................................................................................................................................ 8
3.1
创建
SparkTask......................................................................................................................................................................8
1、通过 SPARKUTILITIES 创建 SPARKTASK............................................................................................................................... 8
2、SPARKTASK 执行时代码..................................................................................................................................................... 8
3.2
创建
SparkSession.................................................................................................................................................................8
1、过程中通过 SPARKSESSIONMANAGER.GETSESSION 创建 SPARKSESSION...........................................................................8
SPARKUTILITIES.GETSPARKSESSION......................................................................................................................................... 8
1、SPARKSESSIONMANAGERIMPL 中 GETSESSION.................................................................................................................. 9
3.3
实例化
SparkSessionImpl......................................................................................................................................................9
1、实例化 SPARKSESSIONIMPL,调用 OPEN 方法 2、创建一个 SPARKCLIENT........................................................................9
SPARKSESSIONIMPL:............................................................................................................................................................. 9
1、HIVESPARKCLIENTFACTORY 中 CREATEHIVESPARKCLIENT 方法实现................................................................................... 9
HIVESPARKCLIENTFACTORY:.................................................................................................................................................. 9
3.4
实例化
RemoteHiveSparkClient.............................................................................................................................................9
1、其中留意一下,INITIATESPARKCONF 会初始化 SPARK 运行环境的一些参数,后面的内容中提到。...............................9
2、实例化 REMOTEHIVESPARKCLIENT:............................................................................................................................... 10
3.5
创建
RemoteClient...............................................................................................................................................................10
1、调用 CREATEREMOTECLIENT 方法创建 REMOTECLIENT.................................................................................................... 10
1、通过 SPARKCLIENTFACTORY.CREATECLIENT 创建了 SPARKCLIENT.................................................................................... 10
1、实例化 SPARKCLIENTIMPL,在 SPARKCLIENTIMPL 中启动了一个 REMOTEDRIVER 进程...................................................10
3.6
获取
SparkWork..................................................................................................................................................................10
再回到 SPARKTASK 中,上面通过 SPARKUTILITIES 创建 SPARKSESSION 后,通过 GETWORK 获取 SPARKWORK...................10
.............................................................................................................................................................................................. 11
3.7
提交
SparkTask....................................................................................................................................................................11
1、通过 SPARKSESSION 提交封装了 SPARKTASK 的 SPARKWORK,并返回一个 SPARKJOBREF 对象,对象封装了 SPARK 任务
的引用。............................................................................................................................................................................... 11
SPARKSESSIONIMPL 中 SUBMIT 任务:................................................................................................................................. 11
REMOTEHIVESPARKCLIENT.EXECUTE 中 SUBMIT.................................................................................................................... 11
REMOTEHIVESPARKCLIENT 中 SUBMIT:............................................................................................................................... 11
(插入=====================================开始)................................................................................................... 12
.............................................................................................................................................................................................. 12
调用 SPARKJOBREF 的 MONITORJOB 方法,循环获取 SPARK 中 JOB 的状态。.....................................................................12

(插入=====================================结束)................................................................................................... 12
接着 REMOTEHIVESPARKCLIENT 中通过 REMOTECLIENT 的 SUBMIT 方法提交 JOB。最终通过 SPARKCLIENTIMPL 中的
PROTOCOL 提交任务............................................................................................................................................................. 12
3.8
启动
RemoteDriver..............................................................................................................................................................12
接下来详细介绍一下 SPARKCLIENTIMPL,这个类是连接 SPARK 的入口。也就是 SPARK 的启动流程的实例类。...............12
在上面我们已经提到,SPARKCLIENTIMPL 实例化的时候,通过 STARTDRIVER 方法启动了 REMOTEDRIVER:....................12
并且注册了 RPCSERVER,并启动了监听。........................................................................................................................... 13
我们重点看一下 STARTDRIVER,在 STARTDRIVER 中整合了所有需要跑 SPARK 任务的参数,整合参数通过 SPARK 中的
SPARKSUBMIT 类去提交 SPARK 任务。................................................................................................................................. 13
在之前的分析中,通过 HIVESPARKCLIENTFACTORY 的 CREATEHIVESPARKCLIENT 方法创建 SPARKCLIENT,在这个方法中,
初始化了 SPARK 的参数:.................................................................................................................................................... 13
SPARK.MASTER 默认为 YARN................................................................................................................................................ 13
.............................................................................................................................................................................................. 13
任务提交模式:CLUSTER...................................................................................................................................................... 13
SPARK.APP.NAME:HIVE ON SPARK...................................................................................................................................... 13
序列化方式:KRYO............................................................................................................................................................... 13
在 SPARKCLIENTIMPL 中设置 SPARK 运行内存参数:........................................................................................................... 14
.............................................................................................................................................................................................. 14
扩展类,扩展包路径:......................................................................................................................................................... 14
.............................................................................................................................................................................................. 14
使用 SPARKSUBMIT 方式提交 SPARK 任务:......................................................................................................................... 14
.............................................................................................................................................................................................. 14
设置 SPARK EXECUTOR 运行 CORE 数量、内存、实例:....................................................................................................... 14
.............................................................................................................................................................................................. 14
.............................................................................................................................................................................................. 15
以上就是 HIVE ON SPARK 中 SPARK 的启动流程。................................................................................................................ 15
3.9
提交任务
.............................................................................................................................................................................15
接下来介绍一下提交任务的过程,让我们回到 SPARKTASK 中:......................................................................................... 15
.............................................................................................................................................................................................. 15
SPARKSESSIONIMPL............................................................................................................................................................... 15
REMOTEHIVESPARKCLIENT.................................................................................................................................................... 15
其中 JOBHANDLE 就是任务的一个句柄。通过 REMOTECLIENT.SUBMIT 提交 JOB:.............................................................16
通过 SPARKCLIENTIMPL 内部类 CLIENTPROTOCOL.SUBMIT 方法,........................................................................................16
1、通过 RPC 线程池创建了 PROMISE 2、实例化 JOBHANDLE............................................................................................... 16
3、将 JOBID 和 JOB 封装成 JOBREQUEST 对象,并交给 DRIVERRPC 来发送,然后返回一个 PROMISE 对象来保存异步执行
结果 4、保持监听................................................................................................................................................................. 16
3.10 RemoteDriver
与
SparkClient
交互
....................................................................................................................................17
REMOTEDRIVER 与 SPARKCLIENT 进行交互,并向 SPARK 集群提交任务。........................................................................... 17
在 REMOTEDRIVER 构造函数中,处理参数,初始化环境变量,并将这些参数赋给相应的 SPARKCONF.............................17
.............................................................................................................................................................................................. 17
创建执行线程....................................................................................................................................................................... 17

将 REMOTEDRIVER 使用的参数保存到 MAPCONF 中............................................................................................................. 17
RPC 创建 REMOTEDRIVER 端................................................................................................................................................. 17
为 CLIENTRPC 添加监听器..................................................................................................................................................... 17
1、创建 SPARKCONTEXT 2、实例化 JOBCONTEXTIMPL 保存 JOB 执行时的运行信息............................................................17
到此,REMOTEDRIVER 的构建完成。在构建 REMOTEDRIVER 过程中,还有三个内部类,我们看一下其作用以及实现。.18
1、JOBWRAPPER JOBWRAPPER 实现了 CALLABLE 接口,其核心实现 CALL 方法..................................................................18
第一步,调用 PROTOCOL 的 JOBSTARTED 方法发送 JOBSTARTED 消息。.............................................................................18
第二步,调用封装的 JOB 中的 CALL 方法,MONITORJOB 中会发送任务提交消息..............................................................18
第三步,通过 JOBENDRECEIVED 的值等待 JOBEND............................................................................................................... 18
2、CLIENTLISTENER CLIENTLISTENER 继承自 JAVASPARKLISTENER,用来监听来自 SPARK SCHEDULER 的事件。.................18
当 JOB 开始时,触发 OBJOBSTART 方法,将 JOB 的 STAGE ID 和 JOBID 保存到 STAGEID 这个 HASHMAP 中。....................18
当任务结束时,触发 ONJOBEND。...................................................................................................................................... 18
当一个 TASK 结束时,触发 ONTASKEND............................................................................................................................... 18
3、DRIVERPROTOCOL DRIVERPROTOCOL 中定义了消息类型处理,其中最受大家关注的应该是 JOBREQUEST 了。...........18
当 DRIVERPROTOCOL 收到 JOBREQUEST 消息后,将消息封装到 JOBWRAPPER 中,将 JOBWRAPPER 提交到任务列表中。18
什么时候收到 JOBREQUEST? SPARKTASK 执行通过 SPARKCLIENT 提交任务时。................................................................18
我们看一下 REMOTEHIVESPARKCLIENT,在 REMOTEHIVESPARKCLIENT 中实例化的 JOBSTATUSJOB....................................18
通过 REMOTECLIENT 提交..................................................................................................................................................... 18
在 JOBWRAPPER 中调用 JOB 的 CALL 方法:........................................................................................................................ 18
1、反序列化得到 JOB 的配置信息 2、设置 HIVE 相关 JAR 3、反序列化本地临时路径 4、反序列化 SPARKWORK 5、生成
SPARK 执行计划 6、通过 PLAN 生成 RDD 7、提交到 SPARK 集群中.....................................................................................19
有兴趣的同学,可以自行下载 HIVE 源码进行分析。 HIVE 项目地址:HTTPS://GITHUB.COM/APACHE/HIVE.....................19
GIT CLONE HTTPS://GITHUB.COM/APACHE/HIVE.GIT............................................................................................................. 19
剩余17页未读,继续阅读
安全验证
文档复制为VIP权益,开通VIP直接复制

评论1
最新资源