Presto部署到maven私服实战

1. 序言

  • 在玩Presto时,最多是mvn clean install -DskipTests
  • 在没有通过MAVEN_OPTS设置为较大内存时,甚至还用上了多线程加速
    • -DskipTests,表示跳过测试
    • -Dmaven.compile.fork=true,表示允许进行多线程编译
    • -T表示多线程,2C表示每核2个线程。假设这是一个64核的服务器,则在进行构建时可以使用 2 * 64 = 128个线程
    mvn -T 2C clean install -DskipTests -Dmaven.compile.fork=true 
    
  • 关于maven的并行构建,可以参考官方文档:Parallel builds in Maven 3
  • 但是,自从接触maven依赖,自己还从没将项目deploy到maven远程仓库(私服)过
  • 在这里记录下,将Presto 0.240版本部署到maven私服遇到问题和解决办法

2. 准备工作

  • 要想将presto部署到私服,需要设置在settings.xml文件中添加私服的server

  • 一般release版本和snapshot版本,有各自的私服server

    <servers>
        <server>
            <id>nexus-releases</id>
            <username>admin</username>
            <password>p@ssword</password>
        </server>
        <server>
            <id>nexus-snapshots</id>
            <username>admin</username>
            <password>p@ssword</password>
        </server>
    </servers>
    
  • 然后,需要在presto-root模块的pom.xml文件的倒数第二行,添加仓库配置

    <!-- 项目打包上传配置 -->
    <distributionManagement>
        <repository>
        	<!-- 这里的id要与server中的id保持一致 -->
            <id>nexus-releases</id>
            <name>Local Nexus Repository</name>
            <url>http://xxx.com/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <name>Local Nexus Repository</name>
            <url>http://xxx.com/nexus/content/repositories/snapshots</url>
        </snapshotRepository>
    </distributionManagement>
    

3. deploy过程中的注意事项

3.1 模块version与父模块保持一致

问题描述

  • 为了避免与来自maven中央仓库的Presto官方版本的maven坐标冲突,将presto-root(presto项目的父模块和聚合模块)的version从0.240更新为0.240-deploy-SNAPSHOT

    <groupId>com.facebook.presto</groupId>
    <artifactId>presto-root</artifactId>
    <version>0.240-deploy-SNAPSHOT</version>
    <packaging>pom</packaging>
    
  • 使用如下命令进行部署

    mvn clean deploy -DskipTests -Dmaven.compile.fork=true 
    
  • 执行时报错:

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.0.0:check (checkstyle) on project presto-bm-functions: 
    	Failed during checkstyle execution: Unable to find configuration file at location: src/checkstyle/presto-checks.xml: 
    	Could not find resource 'src/checkstyle/presto-checks.xml'. -> [Help 1]
    

报错原因分析

  • 从报错信息看,在执行checkstyle时,presto-bm-functions模块找不到checkstyle的配置文件presto-checks.xml

  • checkstyle的配置文件,位于presto-root模块的src/checkstyle/presto-checks.xml

  • 通过检查presto-bm-functions模块的pom.xml文件发现,该模块指定的父模块presto-root的version还是0.240

    <parent>
        <groupId>com.facebook.presto</groupId>
        <artifactId>presto-root</artifactId>
        <version>0.240</version>
    </parent>
    
  • 错误的version,怎么可能找到父模块presto-root呢?

解决办法:

  • 将所有子模块中定义的presto-root的version都改为0.240-deploy-SNAPSHOT

3.2 上传私服时,提示Request Entity Too Large

  • 整个部署进到一大半了,结果出错了
    Error deploying artifact: Failed to transfer file:
    	http://xxx.xxx.xxx.xxx/nexus/content/repositories/snapshots/com/facebook/0.240-deploy-SNAPSHOT/presto-server-0.240-deploy-SNAPSHOT.tar.gz. 
    	Return code is: 413, ReasonPhrase: Request Entity Too Large.
    
  • 通过查阅资料发现,应该是最后生成的安装包presto-server-0.240-deploy-SNAPSHOT.tar.gz过大(800多MB)

解决方法一:修改nginx配置

解决方法二:禁止生成安装包

  • 通过查看presto-server模块的pom.xml文件发现,maven-assembly-plugin插件控制其生成tar.gz安装包
  • 为了以绝后患,整个Presto项目中,所有使用到maven-assembly-plugin插件的,都将该插件注释掉

3.3 Could not transfer artifact xxx:Network is unreachable

问题描述

  • 超级奇怪的事情,一直都使用的settings.xml文件,在部署到私服时突然报错
  • 提示到某个仓库的网络不通,无法获取com.sun:tools:pom:1.8
    [ERROR] Failed to execute goal com.hubspot.maven.plugins:dependency-scope-maven-plugin:0.8:check (default) on project presto-main: 
    	Error resolving descriptor for artifact com.sun:tools:1.8: Failed to read artifact descriptor for com.sun:tools:jar:1.8: 
    	Could not transfer artifact com.sun:tools:pom:1.8 from/to nexus-aliyun (http://xxxx/nexus/content/repositories/public/): 
    		Transfer failed for http://xxx/nexus/content/repositories/public/com/sun/tools/1.8/tools-1.8.pom: Network is unreachable (connect failed) -> [Help 1]
    

问题的解决

  • 最开始,还以为是自身的网络问题,等到第二天再试试。第二天还是同样的问题,于是求助同事
  • 负责maven私服的同事说,这个仓库地址是其他领域的仓库地址,这个仓库最近可能出问题了无法使用
  • 建议将其他领域的仓库地址去除,只保留我所在领域的仓库地址,说这个地址应该能满足我所有的需求

一点小收获

  • 自己后来总结了下,错误原因如下:

    • 配置的仓库可能存在问题,导致无法访问
    • 服务器网络管控,无法访问外部仓库地址
  • 菜鸟的解决办法:

    • 找一个使用正常的settings.xml配置,照抄作业(当然,感兴趣的大佬可以自己研究研究)

3.4 presto-server-rpm模块的处理

3.4.1 关于rpm

  • presto中,除了有presto-server模块,还有一个presto-server-rpm模块
  • 看了presto-server-rpm模块的README.md,大意是:presto-server-rpm模块可以提供RPM包以便使用RPM方式安装Presto

    You can build an RPM package for Presto server and install Presto using the RPM. Thus, the installation is easier to manage on RPM-based systems.

  • 通过上网查阅资料,发现博客《Linux下rpm软件包rpm命令的安装及卸载》是这样介绍RPM的

    RPM 的全称为Redhat Package Manager ,是由Redhat 公司提出的,用于管理Linux 下软件包的软件。
    Linux 安装时,除了几个核心模块以外,其余几乎所有的模块均通过RPM 完成安装

  • 突然想起来,貌似Linux系统的软件安装包,大多都是以.rpm结尾的,例如JDK的安装除了tar包,还有rpm包
  • 这些rpm包可以使用rpm命令进行安装,只是我们可能习惯了使用yum(CentOS 系统)、 apt-get install(Ubuntu系统)
  • 之所以不直接使用rpm命令,博客《如何在 CentOS Linux 上安装 RPM 软件包》中说,这是因为rpm命令不会解决依赖问题

3.4.2 deploy时,不部署presto-server-rpm模块

  • 如果不对presto-server-rpm模块的pom.xml文件做任何改动,deloy时target目录将生成.rpm文件
    在这里插入图片描述

  • .rpm文件有800多MB,上传到私服时,会因为Request Entity Too Large问题而部署失败

  • 所以,需要修改presto-server-rpm模块的pom.xml文件,使其不要生成.rpm文件

  • 具体改动如下:

    // 打包方式为rpm,将其注释掉
    <!--<packaging>rpm</packaging>-->
    
    // 注释掉依赖,这是因为之前的presto-server模块并未生成tar.gz包,若不注释掉,编译无法通过
    <!-- <dependency>
        <groupId>com.facebook.presto</groupId>
        <artifactId>presto-server</artifactId>
        <type>tar.gz</type>
        <scope>runtime</scope>
    </dependency> -->
    
    // 注释掉对maven-dependency-plugin插件的配置
    <!-- <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        ......
    </plugin> -->
    

4. 同事的deploy方法

  • 自己直接使用mvn deloy,会将Presto的每个模块都上传到私服

  • 后来,偶然看到了同事写的公共帮助文档

  • 发现该同事是将打包编译后的安装包,通过mvn deploy:deploy-file直接上传到私服的

  • 完整的mvn deploy:deploy-file命令如下,关于deploy:deploy-file的详细说明可以查看官网

    mvn deploy:deploy-file
    -Dmaven.test.skip=true 
    -Dfile={源码包本地目录} 
    -DgroupId={包的groupId} 
    -DartifactId={包的artifactId} 
    -Dversion={包的版本} 
    -Dpackaging=jar 
    -DrepositoryId={仓库id,就是在settings.xml中配置的<server> -> <id>}
    -Durl={私服地址}
    
  • 我和同事的两种方式都通过扫描了,如果其他人有同样的需求,请一定要询问相关同事,确定通过何种方式deloy到私服!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Presto集群的部署,可以按照以下步骤进行操作: 1. 确保你有一个运行Java的环境,Presto是用Java编写的。你可以从官方网站下载并安装Java Development Kit(JDK)。 2. 下载Presto服务器的二进制文件。你可以从Presto官方网站的下载页面获得最新版本的二进制文件。 3. 解压缩下载的二进制文件到你想要安装Presto的目录中。 4. 配置节点信息。在Presto安装目录下的etc目录中,有一个配置文件叫做`node.properties`,你需要编辑这个文件,指定集群中每个节点的唯一标识符和通信地址。 5. 配置集群连接信息。在etc目录中,有一个配置文件叫做`config.properties`,你需要编辑这个文件,指定连接到Presto集群所需的信息,比如访问控制、元数据存储等。 6. 配置分布式查询协调器。在etc目录中,有一个配置文件叫做`coordinator.properties`,如果你打算使用Presto集群中的一个节点作为协调器节点,你需要编辑这个文件,并指定协调器节点的配置信息。 7. 配置工作节点。在etc目录中,有一个配置文件叫做`worker.properties`,如果你打算使用Presto集群中的某些节点作为工作节点,你需要编辑这个文件,并指定每个工作节点的配置信息。 8. 启动Presto集群。在Presto安装目录下执行命令`./bin/launcher start`或者`./bin/launcher run`以启动Presto集群。前者以守护进程方式启动,后者将在前台运行。 9. 进入Presto CLI。在Presto安装目录下执行命令`./bin/presto-cli`以进入Presto CLI,你可以使用CLI与Presto集群进行交互查询。 这些是基本的Presto集群部署步骤,你可以根据你的特定需求和环境进行配置和调整。请确保在部署之前,详细阅读Presto官方文档并遵循最佳实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值