深入解析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的多个计算实例进行运维管理操作,包括启动、停止、删除计算实例,对计算实例进行资源配置,扩缩容等。
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结构如下。
post /app/v1/services { "name": "hello-world", "version": "1.0.0", "description": "hello world example", "components" : [ { "name": "hello", "number_of_containers": 1, "artifact": { "id": "nginx:latest", "type": "docker" }, "launch_command": "./start_nginx.sh", "resource": { "cpus": 1, "memory": "256", "additional" : { "yarn.io/gpu" : { "value" : 4, "unit" : "" } } } } ]
- 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时指定资源文件即可。
租户绑定
hetuengine支持将计算实例与yarn的租户队列绑定,每个队列上都可以运行一套coordinator + worker的组合。基于前面yarn service能力,只需在构造json时,指定队列信息即可。除了队列,还可以设置container的放置策略(plecement policy),这里不进行详述,可以参考yarn的文档。
资源管理
hetuengine支持用户自定义coordinator和worker的个数以及cpu内存大小。如下图,在hetuengine的hsconsole页面,用户可以设置计算实例的cpu,内存,节点个数。内部实现是由hsbroker接收用户输入,将container运行所需的资源大小设置在json的resource段中。
当前hetuengine支持横向扩展worker的个数,实现资源的弹性伸缩。即使在计算实例处于运行中时,也可以手动调整worker的个数,无需重启计算实例。这得益于yarn service的api中提供的flex接口,可以实现向一个运行中的application增加或者减少container的数量。
客户端使用
hetuengine的计算实例创建完成后,用户可以通过hetu-cli或者jdbc程序进行访问,需要用户绑定对应的租户队列权限,才能向指定的队列提交任务。
hetu cli示例:
hetu-cli --catalog hive --tenant tenantname --schema schemaname
租户名:(可选)租户名。指定hetuengine启动的租户资源队列,不指定为租户的默认队列。使用此参数时,kinit的用户需要具有该租户对应角色的权限。
hetu jdbc示例:
properties properties = new properties(); ...… properties.setproperty("tenant", "default"); properties.setproperty("deploymentmode", "on_yarn"); …… connection = drivermanager.getconnection(url, properties); ……
本文主要介绍了hetuengine on yarn的原理,其实现主要是借助了yarn service提供的能力,感兴趣的读者可以深入阅读开源社区相关的介绍。
到此这篇关于解析hetuengine实现on yarn原理的文章就介绍到这了,更多相关hetuengine实现on yarn原理内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!