Trino升级和二次改造
前言
先前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文件中,依次在 -> ->
添加如下内容,跳过插件的配置信息
<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> <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.jartrino-client-382-SNAPSHOT.jartrino-collect-382-SNAPSHOT.jartrino-geospatial-toolkit-382-SNAPSHOT.jartrino-main-382-SNAPSHOT.jartrino-matching-382-SNAPSHOT.jartrino-memory-context-382-SNAPSHOT.jartrino-parser-382-SNAPSHOT.jartrino-plugin-toolkit-382-SNAPSHOT.jartrino-server-main-382-SNAPSHOT.jartrino-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.jarcoral-trino-parser-2.0.55.jartrino-array-382-SNAPSHOT.jartrino-collect-382-SNAPSHOT.jartrino-hive-382-SNAPSHOT.jartrino-hive-hadoop2-382-SNAPSHOT.jartrino-hive-hadoop2-382-SNAPSHOT-services.jartrino-matching-382-SNAPSHOT.jartrino-memory-context-382-SNAPSHOT.jartrino-orc-382-SNAPSHOT.jartrino-parquet-382-SNAPSHOT.jartrino-plugin-toolkit-382-SNAPSHOT.jartrino-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
<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
改成Set
,修改后如下:
/ * This is a NOOP, no filtering is applied */ @Override public Set<String> filterColumns(SystemSecurityContext context, CatalogSchemaTableName table, Set<String> columns) { return columns; }
修改方法checkCanCreateTable,在传参中新增 Map 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
替换成Set
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=falseXAAUDIT.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-enablednode-scheduler.network-topologyquery.max-total-memory-per-node
删掉重启即可。
另外在catalog中的hive.properties配置中,修改以下两项,将presto变成trino
hive.hdfs.trino.principalhive.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