前言
先前presto使用了版本为prestosql350的作为线上部署。后来用着用着发现它底层不支持hive view的md5等诸多hive基础函数,故此将其升级到trino最新版本(trino381版本)
一、升级到trino要考虑的问题
1、trino和ranger整合问题
这个问题主要因为trino在prestosql350往后,改名了。导致trino项目结构、包名全部修改了一边。而ranger插件并未做修改,依然以prestosql作为依赖版本,spi也是基于prestosql的。所以导致接口包名不一致,而整合失败。这个是我们升级trino先要考虑解决的问题。
2、trino配置变更
一方面,trino的一些配置名称,从presto->trino。比如原先的xxx.xxx.presto.keytab 现在换到trino变成xxx.xxx.trino.keytab。
另一方面,trino的一些安全特性,需要在config配置文件新增节点内部通信使用的secret(自定义即可)。
二、前期环境准备
trino的编译环境必须选择在mac和linux环境下编译,否则会报错。为了后面更新代码方便,我选择在我办公及安装vmware使用ubuntu20.4作为linux系统编译此项目并使用idea修改项目源码。
我们在ubuntu20.4上,提前准备好以下几个安装包:
- idea2021.3.1 linux版本
- jdk11.0.14
- maven3.8.5
具体配置环境略过,自行百度。这里贴出百度云网盘链接自取自愿:
链接:https://pan.baidu.com/s/1wcX1aJLeO1b0oeYlvX0psA
提取码:iqtj
idea2021.3.1破解教程 参考:https://blog.csdn.net/qq_41973729/article/details/122353737
- git clone trino项目
git clone https://github.com/trinodb/trino.git
- 编译准备
在整个项目开始编译的时候,请留意,如果你不是从官方直接git clone下来的项目,需要在根目录的pom.xml文件中,依次在<build> -> <pluginManagement> -> <plugins>
添加如下内容,跳过插件的配置信息
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
如果不添加会编译报错。
会遇到“pl.project13.maven:git-commit-id-plugin:4.0.3:revision git directory is not found! Please specify a valid [dotGitDirectory] in your pom.xml”
除此之外,presto的编译要求你必须在linux系统中安装了docker的环境,否则presto-doc将编译不通过,当然,这个doc项目不是必须的,你可以在根目录的pom下吧presto-doc的module干掉。
三、修改源码
修改源码需要在父pom中注释掉一些checkstyple的检测等,不影响项目,只是在编译的时候会影响。
直接进入到项目的根目录,在properties标签里面加入下面的配置,禁止checkstyle检测:
<air.check.fail-checkstyle>false</air.check.fail-checkstyle>
<air.check.skip-checkstyle>true</air.check.skip-checkstyle>
除此之外,如果你修改了源码,可能会在打包的时候遇到license头信息的检查,如果你添加的类上没有按官方标注license,也会报错,license header长这个样子:
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
于是解决这个问题就有了,两种办法:
1)在新创建的类中,加上上述license的头信息。推荐
推荐这个方法有两个原因:1.能够保证原有的规范;2.下面的第2种修改不方便
2)找出打包时,检测license头信息的插件
经调查发现,检测license头信息的插件名为license-maven-plugin
我们可以通过如下配置,来取消对头信息的检查。在plugins标签下加入:
<plugin>
<groupId>com.mycila</groupId>
<artifactId>license-maven-plugin</artifactId>
<configuration>
<excludes>
<!-- 都不检查license -->
<exclude>**</exclude>
</excludes>
</configuration>
</plugin>
至此,你就可以愉快的修改源码了。
当你修改完成源码后,并不需要重新将所有的项目都重新编译,只需要打包你修改的那个模块。我们可以将修改完的jar包上传到trino-server目录下的lib、plugin对应模块中替换即可。我们可以看看先前部署的trino-server的lib目录:
[root@yjd-presto-0-150 lib]# ls | grep trino
trino-array-382-SNAPSHOT.jar
trino-client-382-SNAPSHOT.jar
trino-collect-382-SNAPSHOT.jar
trino-geospatial-toolkit-382-SNAPSHOT.jar
trino-main-382-SNAPSHOT.jar
trino-matching-382-SNAPSHOT.jar
trino-memory-context-382-SNAPSHOT.jar
trino-parser-382-SNAPSHOT.jar
trino-plugin-toolkit-382-SNAPSHOT.jar
trino-server-main-382-SNAPSHOT.jar
trino-spi-382-SNAPSHOT.jar
当你修改了上面模块的时候直接放到lib中替换即可。
而plugin目录就对应到presto源码目录中各个插件的模块了,比如hive模块在plugin目录对应到hive-hadoop2,我们进入看看:
[root@yjd-presto-0-150 hive]# ls | grep trino
coral-trino-2.0.55.jar
coral-trino-parser-2.0.55.jar
trino-array-382-SNAPSHOT.jar
trino-collect-382-SNAPSHOT.jar
trino-hive-382-SNAPSHOT.jar
trino-hive-hadoop2-382-SNAPSHOT.jar
trino-hive-hadoop2-382-SNAPSHOT-services.jar
trino-matching-382-SNAPSHOT.jar
trino-memory-context-382-SNAPSHOT.jar
trino-orc-382-SNAPSHOT.jar
trino-parquet-382-SNAPSHOT.jar
trino-plugin-toolkit-382-SNAPSHOT.jar
trino-rcfile-382-SNAPSHOT.jar
我们需要额外关注hive plugin中的coral这个模块
[root@yjd-presto-0-150 hive]# ls | grep coral
coral-common-2.0.55.jar
coral-hive-2.0.55.jar
coral-trino-2.0.55.jar
coral-trino-parser-2.0.55.jar尤其是coral-hive,这个模块是presto将hive view sql能够在presto中执行的关键。它底层支持哪些hive udf函数,也就表示presto能够执行哪些hive view中包含的函数。
和lib一样,修改了哪个模块替换哪个jar即可。
四、ranger-plugin的源码修改
由于ranger默认不支持trino的包名格式,我们需要修改ranger-presto-plugin的源码,让它支持。本次ranger-presto-plugin基于ranger2.1.0版本。
源码修改涉及到的地方主要在ranger-presto-plugin和ranger-presto-plugin-shim这两个模块。
1、修改ranger根目录的pom.xml
将presto.version升级到381:
<presto.version>381</presto.version>
2、更改组件包名称
先前ranger的presto模块基于prestosql,所以要将模块中包含io.prestosql 的包名统一替换成io.trino下面了,涉及到io.prestosql的pom.xml都必须要修改。主要修改模块ranger-presto-plugin和ranger-presto-plugin-shim中的pom.xml
<!--将原先io.prestosql 替换成 io.trino,将prestosql替换成trino即可-->
<dependency>
<groupId>io.trino</groupId>
<artifactId>trino-spi</artifactId>
<version>${presto.version}</version>
</dependency>
<dependency>
<groupId>io.trino</groupId>
<artifactId>trino-jdbc</artifactId>
<version>${presto.version}</version>
</dependency>
3、修改代码
- ranger-presto-plugin修改地方:
修改类RangerSystemAccessControl.java
首先全局替换io.prestosql 为io.trino;
其次全局替换PrestoPrincipal为TrinoPrincipal;
最后,修改一些方法,适配trino最新spi接口需求格式:
修改方法filterColumns, 将List<ColumnMetadata>
改成Set<String>
,修改后如下:
/**
* This is a NOOP, no filtering is applied
*/
@Override
public Set<String> filterColumns(SystemSecurityContext context, CatalogSchemaTableName table, Set<String> columns) {
return columns;
}
修改方法checkCanCreateTable,在传参中新增 Map<String, Object> properties
,适配trino.spi接口
/**
* Create table is verified on schema level
*/
@Override
public void checkCanCreateTable(SystemSecurityContext context, CatalogSchemaTableName table,//新增参数
Map<String, Object> properties) {
if (!hasPermission(createResource(table.getCatalogName(), table.getSchemaTableName().getSchemaName()), context, PrestoAccessType.CREATE)) {
LOG.debug("RangerSystemAccessControl.checkCanCreateTable(" + table.getSchemaTableName().getTableName() + ") denied");
AccessDeniedException.denyCreateTable(table.getSchemaTableName().getTableName());
}
}
新增后这个参数没有特别的含义,保留先前的认证格式即可。
修改方法checkCanShowRoles。注释掉先前的实现,以及原先方法参数String catalogName
,因为最新版本的trino-spi已经把这个方法的接口参数的catalogName干掉了,导致只传入context,原先hasPermission方法又必须要求传递catalogName,而context对象内部并未发现存在记录catalogName的参数。这个方法实际上放开权限也无大碍,毕竟它只能查看角色,而不是查看某张表的数据。
@Override
public void checkCanShowRoles(SystemSecurityContext context) {
/* if (!hasPermission(createResource(catalogName), context, PrestoAccessType.SHOW)) {
LOG.debug("RangerSystemAccessControl.checkCanShowRoles(" + catalogName + ") denied");
AccessDeniedException.denyShowRoles(catalogName);
}*/
}
可以后面有需要加上鉴权需求,自己重写这个方法,或者等官网适配了ranger,再做相应适配也行。目前官网其实也未解释为啥干掉了catalogName…
- ranger-presto-plugin-shim修改地方:
1.修改PrestoRangerPlugin类,将io.prestosql统一替换成io.trino
2.修改RangerSystemAccessControl类
首先将io.prestosql统一替换成io.trino 。 同时将PrestoPrincipal统一替换成TrinoPrincipal
然后修改以下几个方法:
修改checkCanCreateTable 和前面修改一样,新增properties参数即可
public void checkCanCreateTable(SystemSecurityContext context, CatalogSchemaTableName table, Map<String, Object> properties) {
try {
activatePluginClassLoader();
//这里也要做新增,实际上这里应用的就时ranger-presto-plugin模块的修改
systemAccessControlImpl.checkCanCreateTable(context, table,properties);
} finally {
deactivatePluginClassLoader();
}
}
修改filterColums方法,和上面一样,将List<ColumnMetadata>
替换成Set<String>
public Set<String> filterColumns(SystemSecurityContext context, CatalogSchemaTableName table, Set<String> columns) {
Set<String> filteredColumns;
try {
activatePluginClassLoader();
filteredColumns = systemAccessControlImpl.filterColumns(context, table, columns);
} finally {
deactivatePluginClassLoader();
}
return filteredColumns;
}
修改checkCanShowRoles方法,同理,将catalogName干掉,适配接口
public void checkCanShowRoles(SystemSecurityContext context) {
try {
activatePluginClassLoader();
systemAccessControlImpl.checkCanShowRoles(context);
} finally {
deactivatePluginClassLoader();
}
}
3.修改resources目录下META-INF/services/
目录的io.prestosql.spi.Plugin文件名,变成:io.trino.spi.Plugin
该文件主要在trino启动的时候加载插件时,会读取,然后去寻找文件中指定的具体插件实现类,实现插件的加载逻辑。同理,未来你要是定义一个trino插件,也要写一个插件类,通过这个文件指定,文件的目录格式就和这个一样放到reousrces目录的META-INF/services/
。具体请参阅官方插件开发文档。
4、打包
完成上面的修改之后,需要对ranger打包。需要注意的是,trino的模块已经使用jdk11去编写了,所以打包引入trino包的项目模块的时候,都需要使用jdk11进行打包。当然,ranger的其他项目模块还是使用jdk1.8去打包。
mvn clean compile package assembly:assembly install -Dmaven.test.skip=true;
5、线上配置
首先在上面打包好的根目录下的target目录中,将ranger-presto-plugin.tar.gz
这个东西搞下来。传到线上机器并解压。
其次,进行配置。进入到解压目录,修改install.properties
文件如下几项:
#ranger地址
POLICY_MGR_URL=http://yjd-mtc-2-35.meizu.mz
#ranger中对应presto插件repository策略名称
REPOSITORY_NAME=mzcluster_presto
#trino安装目录
COMPONENT_INSTALL_DIR_NAME=/opt/presto/trino/trino-server-382-SNAPSHOT
#下面审计日志相关的无需开启
XAAUDIT.SUMMARY.ENABLE=false
XAAUDIT.SOLR.ENABLE=false
最后,通过./enable-presto-plugin.sh
将插件关联jar包进行安装到trino目录。
启动trino,验证是否有问题。我遇到的问题是启动是后缺少log4j的包。此时仅需要找到log4j的jar包,将它放到trino的plugin/ranger/ranger-presto-plugin-impl
中即可。因为trino启动加载插件的时候,会有个classloader load这个目录中jar的一些类。需保证依赖的类对应的jar存在。
最后修改一处,移步到trino-server的etc目录下,修改access-control.properties如下:
access-control.name=ranger
#添加此句,开启角色身份匹配ranger中presto的策略设定的资源
ranger.use_ugi=true
通过阅读ranger的源码发现,如果不添加这个配置,将会导致ranger-presto插件无法通过用户在ranger配置的角色访问ranger中配置的资源权限。
五、支持hive view特性
1、trino-hive源码修改
由于公司挺多hive表都是hive view的,故我们需要trino支持hive view。
通过阅读trino的源码,发现HiveMetadata
类中的getView方法(大概在2436行),发现trino默认判断如果不是presto view,就直接抛异常了:
public Optional<ConnectorViewDefinition> getView(ConnectorSession session, SchemaTableName viewName)
{
if (isHiveSystemSchema(viewName.getSchemaName())) {
return Optional.empty();
}
return metastore.getTable(viewName.getSchemaName(), viewName.getTableName())
.filter(ViewReaderUtil::canDecodeView)
.map(view -> {
//判断不是prestoview就抛异常,真头痛。。。
if (!translateHiveViews && !isPrestoView(view)) {
throw new HiveViewNotSupportedException(viewName);
}
//实际上createViewReader底层实现了Hive view的解析类,但trino官方依旧默认限制只能通过prestoview访问....
ConnectorViewDefinition definition = createViewReader(metastore, session, view, typeManager, this::redirectTable, metadataProvider, hiveViewsRunAsInvoker)
.decodeViewData(view.getViewOriginalText().get(), view, catalogName);
//......其他省略......
再进一步发现,上面代码的间接调用的createViewReader方法,已经实现了支持原生hive view的解析类,并且这个解析类通过coral这个框架解析整个hive view:
public static ViewReader createViewReader(
SemiTransactionalHiveMetastore metastore,
ConnectorSession session,
Table table,
TypeManager typeManager,
BiFunction<ConnectorSession, SchemaTableName, Optional<CatalogSchemaTableName>> tableRedirectionResolver,
MetadataProvider metadataProvider,
boolean runHiveViewRunAsInvoker)
{
//....省略.....
//此类默认通过coral框架解析hive view
return new HiveViewReader(
new CoralSemiTransactionalHiveMSCAdapter(metastore, coralTableRedirectionResolver(session, tableRedirectionResolver, metadataProvider)),
typeManager,
runHiveViewRunAsInvoker);
}
这里也就是前面提到的,必须coral框架支持hive view的函数,比如md5函数,才能够让presto执行。同时presto也必须实现hive的md5函数,这里就需要自定义插件的方式注入presto中了,下面会说明。
当然,trino最新版本的coral已经支持大多数的hive函数。并且这个coral也在更新,后续有最新版本的话,可以直接修改coral的version,打包即可。
回到前面,我们仅仅需要加一个判断,让getView方法匹配到原生hive view的时候不报错就行,为此我们在HiveUtil类中实现了判断:
public static boolean isHiveView(Table table) {
return table.getTableType().equals(TableType.VIRTUAL_VIEW.name());
}
上面的getView方法加入isHiveView判断即可:
if (!translateHiveViews && !isPrestoView(view) &&
//加这里
!HiveUtil.isHiveView(view)) {
throw new HiveViewNotSupportedException(viewName);
}
修改完后,打包trino-hive模块,将得到的jar放到trino-server的plugin/hive
中替换旧的jar并重启trino-server即可。(worker和coordinator都要更新这个jar)
2、presto适配hive函数插件开发
前面,我们仅仅通过修改trino放开了对原生hive view的解析。提到底层通过coral框架来解析hive view用到的一些函数。通过解析的函数,还会回到presto自身携带的函数库中匹配是否存在这种hive的函数。咱们拿md5函数举例子,presto的md5函数和hive的md5函数参数类型不一样,如果你没有让presto支持hive的md5函数,那么你去select hive view的时候,会报md5函数不存在。
所以我们这里必须要开发presto的hive函数适配插件,注入到presto函数库中。
据了解,早在5年前,就有第三方实现了一匹的presto的hive函数插件。但是由于它用的presto版本实在太旧了,我们需要将代码下下来,自己做一些调整。
git clone https://github.com/aaronshan/presto-third-functions.git
打开这个项目按下面步骤修改:
step1: 修改根目录的pom文件
将presto.version版本为381
<presto.version>381</presto.version>
将依赖com.facebook.presto改成io.trino
<dependency>
<groupId>io.trino</groupId>
<artifactId>trino-spi</artifactId>
<version>${presto.version}</version>
</dependency>
和前面ranger替换的方法一样操作即可。
我们这里可以把它的test测试单元干掉,那么就不需要引入trino-main模块以及junit模块了。
step2:类文件import包名替换
我们移步到项目的java文件中,将import旧版本的presto的spi包名统一替换成io.trino.spi
将PrestoException修改成TrinoException。总之哪里报错改哪里,和前面修改ranger一样,你懂的!
step3:UdfPlugin函数的改造
UdfPlugin是这个项目的trino的插件实现类。我试了一下,用项目默认加载的方法,会在trino项目中报错,这里我们还是改成官方推荐加载类的格式。修改getFunctions方法如下:
public class UdfPlugin implements Plugin {
@Override
public Set<Class<?>> getFunctions() {
return ImmutableSet.<Class<?>>builder()
.add(ArrayValueCountFunction.class) //可添加多个函数方法名
.add(ChinaTypeOfDayFunction.class)
.add(DayOfWeekFunctions.class)
.add(ZodiacSignFunctions.class)
.add(GeographicFunctions.class)
.add(IsNullFunctions.class)
.add(JsonArrayExtractFunction.class)
.add(MapValueCountFunction.class)
.add(ChinaIdCardFunctions.class)
.add(ChineseToPinYinFunctions.class)
.add(HashFunctions.class)
.build();
}
}
**step4:**修改resources/META-INF/services/
下的Plugin文件名
改成io.trino.spi.Plugin
修改完成后,通过mvn clean install -Dmaven.test.skip=true
打包即可。
打包完成后,可以在target目录中,找到两个jar:
#不将依赖打入jar包
trino-third-functions-0.5.1.jar
#将项目第三方依赖统一和源码一起打入jar包
trino-third-functions-0.5.1-shaded.jar
如果使用前者,需要你额外找到第三方的jar上传到trino/plugin对应的插件目录。而后者不用。
step5:trino-server新建插件目录部署插件
在trino-server的plugin目录下,新建一个目录,名字你喜欢即可。暂且叫他dev-plugin吧
把前面的trino-third-functions-0.5.1-shaded.jar传入到这个新建目录下。同样,coordinator和worker都要进行更新,并且重启项目。
搞完后,请通过show functions命令检查是否存在对应的注入函数。然后搞一条hive viewsql 试试。
六、presto-gateway调整
在presto-gateway这块,有一个ActiveClusterMonitor类,这个类内部会以get请求的方式调用http://${trinohost:port}/ui/login?username=xxx
。这个接口是trino的接口,它主要目的是通过登录,返回对应的cookie,然后用户每次请求都能够看到自己query的详细信息。必须要调用这个接口获取trino服务器生成的cookie,否则在后面调用/ui/api/stats
接口的时候会通过不了认证。感兴趣可以看Trino源码AuthenticationFilter
。
trino将/ui/login接口的请求方式改成了post方式即可。
CookieManager manager = new CookieManager();
//设置cookie策略,只接受与你对话服务器的cookie,而不接收Internet上其它服务器发送的cookie
manager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);
CookieHandler.setDefault(manager);
String target = proxyTo + UI_API_STATS_PATH;
HttpURLConnection conn2 = null;
try {
//获取目标target指向的服务器
URL url2 = new URL(proxyTo+"/ui/login");
//try post request
conn2 = (HttpURLConnection) url2.openConnection();
conn2.setRequestMethod(HttpMethod.POST);
conn2.setDoOutput(true);
// 设置请求头
conn2.setRequestProperty("Accept", "*/*");
// 设置请求体
String body = "username=admin";
OutputStream outputStream = conn2.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
writer.write(body);
writer.close();
conn2.connect();
//....省略后续代码....
至于返回的cookie,我们使用CookieManager存放即可。
七、集群切换脚本的修改
先前做的线上和预言集群切换的脚本,也许做修改。应为trino和presto生成的cookie对应的key名称发生了改变,由Presto-UI-Token 变成了Trino-UI-Token。修改替换即可。
这两个脚本位于/opt/presto/trino/trino-cluster-switch目录下start-onlinepresto-cluster.py 、stop-onlinepresto-cluster.py
八、其他问题
1.web-ui界面http请求访问失败
早在prestosql在337发行版本的修改中增加了对prestosql webui界面的https支持,但是需要进行配置开启。当然如果你不希望webui界面使用https访问,可以和之前一样使用http访问,在etc/config.properties文件中使用:
http-server.authentication.allow-insecure-over-http=true
给出官网解释:
Security Changes
----------------
* Disable insecure authentication over HTTP by default when HTTPS with authentication is enabled. This
can be overridden via the ``http-server.authentication.allow-insecure-over-http`` configuration property. (:issue:`4199`)
* Add support for insecure authentication over HTTPS to the Web UI. (:issue:`4199`)
* Add :ref:`system_information_rules` which control the ability of a user to access to read and write system management information. (:issue:`4199`)
具体参考trino github下的issue 4199
https://github.com/trinodb/trino/issues?q=4199
如果你希望配置webui开启安全认证,请参考官网:
https://trino.io/docs/current/admin/properties-web-interface.html
2.编译问题
-
Dependency problems found
[INFO] --- maven-dependency-plugin:3.1.2:analyze-only (default) @ presto-phoenix --- [WARNING] Unused declared dependencies found: [WARNING] com.google.code.findbugs:jsr305:jar:3.0.2:compile [WARNING] com.fasterxml.jackson.core:jackson-databind:jar:2.11.1:compile [ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:3.1.2:analyze-only (default) on project presto-phoenix: Dependency problems found
提示说明,presto-phoenix存在未使用的依赖,删掉后继续打包即可:
mvn clean install -Dmaven.test.skip=true -rf :presto-phoenix
3.shared-secret问题
trino最新版本要求当启用trino的认证机制后,比如你开了kerberos,就必须要求trino节点内部通信提供一个shared-secret,这个secret你可以自定义。worker和coordinator的shared-secret保持一致即可。
#节点之间不需要使用https通信,在内网部署无需,外网需打开
internal-communication.https.required=false
#节点通信秘钥凭证
internal-communication.shared-secret=trino-secret
4.trino变更的些许配置
我遇到的主要有以下几个配置停用了
experimental.reserved-pool-enabled
node-scheduler.network-topology
query.max-total-memory-per-node
删掉重启即可。
另外在catalog中的hive.properties配置中,修改以下两项,将presto变成trino
hive.hdfs.trino.principal
hive.hdfs.trino.keytab
其他的遇到了搜官网文档都有说明,或者报错都有说明,改过来就行。
5.trino-yarn的问题
trino-yarn这里也需要修改一下。观察过这个项目的源码的同学,都发现实际上trino-yarn是通过slider的tarball.py
脚本触发调度trino在yarn机器节点跑起来的。而这个python脚本最终会到trino-yarn目录下的metainfo.xml中获取presto的版本。我们需要做以下的修改:
1、替换目录trino-yarn/package/files下的presto安装包为trino-server-{version}.tar.gz的安装包
2、修改metainfo.xml中存在引用了旧presto版本的信息,例如我现在的trino版本{version} = 381,则该文件改成:
<metainfo>
<schemaVersion>2.0</schemaVersion>
<application>
<name>TRINO</name>
<comment>TRINO</comment>
<version>381</version>
<exportGroups>
<exportGroup>
<name>Trino</name>
<exports>
<export>
<name>coordinator_address</name>
<value>${COORDINATOR_HOST}:${site.global.presto_server_port}</value>
</export>
</exports>
</exportGroup>
</exportGroups>
<components>
<component>
<name>COORDINATOR</name>
<category>MASTER</category>
<appExports>Presto-coordinator_address</appExports>
<minInstanceCount>1</minInstanceCount>
<maxInstanceCount>1</maxInstanceCount>
<commandScript>
<script>scripts/presto_coordinator.py</script>
<scriptType>PYTHON</scriptType>
</commandScript>
</component>
<component>
<name>WORKER</name>
<category>SLAVE</category>
<commandScript>
<script>scripts/presto_worker.py</script>
<scriptType>PYTHON</scriptType>
</commandScript>
</component>
</components>
<osSpecifics>
<osSpecific>
<osType>any</osType>
<packages>
<package>
<type>tarball</type>
<name>files/trino-server-381.tar.gz</name>
</package>
</packages>
</osSpecific>
</osSpecifics>
</application>
</metainfo>
3、zip打包trino-yarn安装目录,重命名为 trino-yarn-package-1.6-SNAPSHOT-381.zip
4、修改slider/conf目录下,所有涉及到引用到trino-yarn-package-1.6-SNAPSHOT-381.zip的文件,将旧的名称替换成最新的即可。一般改下appConfig-default.json,改如下两项:
{
"schema":"http://example.org/specification/v2.0.0",
"metadata":{
},
"global":{
//...省略...
"site.global.app_name":"trino-server-381",
"application.def":".slider/package/trino/trino-yarn-package-1.6-SNAPSHOT-381.zip",
//...省略...
},
"components":{
//...省略...
}
}
5、安装trino-yarn-package-1.6-SNAPSHOT-381.zip到hdfs
../bin/slider package --install --name trino --package /opt/presto-precluster/trino/trino-yarn/trino-yarn-package-1.6-SNAPSHOT-381.zip --replacepkg
6、触发slider调度trino在yarn上跑起来
/opt/presto-precluster/hd/bin/hdfs dfs -rm -r /user/presto/.slider/cluster
../bin/slider create trino-query --template appConfig-default.json --resources resources-default.json