> 文档中心 > Trino升级和二次改造

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  

天天排行榜