解析 HetuEngine 实现 On Yarn 原理
摘要:本文介绍 HetuEngine 实现 On Yarn 的原理,通过阅读本文,读者可以了解 HetuEngine 如何在资源使用方面融入 Hadoop 生态体系。
本文分享自华为云社区《MRS HetuEngine 特性之 On Yarn原理介绍》,作者:一颗柠檬。
HetuEngine 是华为自研高性能分布式 SQL 查询 &数据虚拟化引擎。与大数据生态无缝融合,实现海量数据秒级查询;支持多源异构协同,使能数据湖内一站式 SQL 融合分析。在整合开源能力的同时,MRS HetuEngine 相较于开源社区也做了大量的优化,其中一个重要的特性就是 On Yarn。
什么是 On Yarn?
顾名思义,就是将进程运行在 Yarn 上,由 Yarn 进行资源的管理和调度。
不论是 TrinoDB/PrestoDB 还是 openLooKeng,部署方式都是将 coordinator 和 worker 进程直接运行在主机上,与主机上的其他应用程序共享资源,无法做到资源隔离,并且难以扩展。
MRS HetuEngine 借助 Yarn Service 提供的能力,将 coordinator 和 worker 进程以 Yarn application 的形式运行在 Yarn container 中,通过 MRS 集群的租户划分,可以将 HetuEngine 计算实例启动在特定租户队列里,从而实现资源隔离。
HetuEngine 架构
下图是 HetuEngine 的拓扑图。HetuEngine 向下可以对接各类数据源(比如 Hive,GaussDB,HBASE,Elasticsearch 等),对外向用户提供 CLI/JDBC 接口。在同一套 MRS 集群中,HetuEngine 可以在不同租户队列中启动多个 HetuEngine 计算实例,支持一个租户队列上启动一个计算实例。由 HetuEngine 的 HSBroker 实例与 Yarn Service 交互,将租户队列与计算实例绑定,由 HSConsole 提供运维管理页面,对 HetuEngine 的多个计算实例进行运维管理操作,包括启动、停止、删除计算实例,对计算实例进行资源配置,扩缩容等。
![](https://static001.geekbang.org/infoq/55/55a14ed89e24052e0d9069bc5f273b5a.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
HetuEngine On Yarn 原理
如前所述,On Yarn 就是把进程运行在了 Yarn 的 container 中。HetuEngine 是如何实现将 coordinator 和 worker 运行中 Yarn 中呢?
Yarn Service 提供了一系列 API 以及一个通用的 AM,让用户可以调用 API 即可将任务提交到 Yarn 上,由 Yarn 实现任务的容器化,对容器进行资源和生命周期管理。详细请参考开源社区的介绍。https://hadoop.apache.org/docs/r3.1.0/hadoop-yarn/hadoop-yarn-site/yarn-service/Overview.html
HetuEngine 的 On Yarn 实现正是借助了 Yarn Service 所提供的能力。在 HetuEngine 的 HSBroker 中,调用 Yarn Service 的 API,拉起 application,在 container 中运行 HetuEngine 自己的进程,也就是 coordinator 和 worker。其中有以下几个关键点:
Yarn Service API
创建一个 Yarn Service 服务的接口是/app/v1/services,参数 json 结构如下。
name:服务名称,显示在 Yarn 的 resource manager WEB 界面 servicename;
version:版本号
description:服务的描述
components:一个 service 中可以包含多个 component,以运行不同的任务;
components.name:component 名称
number_of_containers:此 component 中 container 的数量;
artifact:进程依赖的资源文件,包含 id 和 type 信息,type 支持 docker 和 tarball
launch_command:进程启动命令
resource:此 component 所需的资源。
HetuEngine 的 HSBroker 根据用户输入构造此 json,然后调用 Yarn Service API,实现 On Yarn。此外 Yarn Service 还提供 stop/delete 等 API,也由 HSBroker 调用,实现对 HetuEngine 计算实例的停止/删除等运维操作。
依赖文件
Yarn Service 支持资源文件在 HDFS 上的形式启动进程,其提供的 API 可以接收 tar 包以及 docker 等形式的资源文件,由 Yarn Service 自行将 HDFS 上的文件进行资源本地化。因此,HetuEngine 只需将依赖的 jar 包和资源文件提前部署在 HDFS 上的指定位置,在调用 Yarn Service 的 API 时指定资源文件即可。
租户绑定
![](https://static001.geekbang.org/infoq/0e/0ecc3b701867367ede9ead3583442a0d.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
HetuEngine 支持将计算实例与 Yarn 的租户队列绑定,每个队列上都可以运行一套 coordinator + worker 的组合。基于前面 Yarn Service 能力,只需在构造 json 时,指定队列信息即可。除了队列,还可以设置 container 的放置策略(plecement policy),这里不进行详述,可以参考 yarn 的文档。
资源管理
HetuEngine 支持用户自定义 coordinator 和 worker 的个数以及 CPU 内存大小。如下图,在 HetuEngine 的 HSConsole 页面,用户可以设置计算实例的 CPU,内存,节点个数。内部实现是由 HSBroker 接收用户输入,将 container 运行所需的资源大小设置在 json 的 resource 段中。
![](https://static001.geekbang.org/infoq/52/529846c39831f9ed9ddcf873c4067d76.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
当前 HetuEngine 支持横向扩展 worker 的个数,实现资源的弹性伸缩。即使在计算实例处于运行中时,也可以手动调整 worker 的个数,无需重启计算实例。这得益于 Yarn Service 的 API 中提供的 flex 接口,可以实现向一个运行中的 application 增加或者减少 container 的数量。
客户端使用
HetuEngine 的计算实例创建完成后,用户可以通过 hetu-cli 或者 JDBC 程序进行访问,需要用户绑定对应的租户队列权限,才能向指定的队列提交任务。
Hetu CLI 示例:
租户名:(可选)租户名。指定 HetuEngine 启动的租户资源队列,不指定为租户的默认队列。使用此参数时,kinit 的用户需要具有该租户对应角色的权限。
Hetu JDBC 示例:
本文主要介绍了 HetuEngine On Yarn 的原理,其实现主要是借助了 Yarn Service 提供的能力,感兴趣的读者可以深入阅读开源社区相关的介绍。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/da95f81bb9885570ee8f67a25】。文章转载请联系作者。
评论