化鲲为鹏,我有话说【程序奔溃】华为鲲鹏云服务器 presto 0.212软件运行奔溃

敏敏君主 发表于 2019/11/29 15:52:31 2019/11/29
【摘要】 1. 简介Presto是针对于大数据的分布式查询工程。官方链接:https://github.com/prestodb/presto类别:分布式数据库2. 基础环境类别子项版本获取地址(方法)华为云华为云虚拟机RC3(916)--OSCentOS7.5Kernel4.14软件包presto0.212java1.8.0Python 2.4+maven3.3.9+3. 环境准备此步骤建议...

化鲲为鹏,我有话说    

1. 简介

Presto是针对于大数据的分布式查询工程。

官方链接:https://github.com/prestodb/presto

类别分布式数据库

2. 基础环境

类别

子项

版本

获取地址(方法)

华为云

华为云

虚拟机

RC3(916)

--

OS

CentOS

7.5


Kernel

4.14


软件包

presto

0.212


java

1.8.0


Python

2.4+


maven

3.3.9+


3. 环境准备

此步骤建议在chroot环境下进行,一来对chroot环境可以随意修改,不会影响系统,二来多人共用系统环境,免不了对系统有更改,chroot环境更纯净。

1) 创建chroot环境

执行后/root/zmm目录下就是个可用的chroot环境,chroot进去即可进行任意操作。

[root@arm-team-0009 ~]# yum install --installroot=/root/zmm/ -y basesystem yum rpm-build

[root@arm-team-0009 ~]# mount --bind /dev/ /root/zmm/dev

[root@arm-team-0009 ~]# mount --bind /proc/ /root/zmm/proc/

Chroot环境创建后,进去发现很多基础命令没有,比如vi,需要自行安装对应的rpm包。

2) 配置YUM

推荐所有reo源修改为华为开源镜像站,速度更快更稳定。

bash-4.2# grep "huawei" -ri /etc/yum.repos.d/

/etc/yum.repos.d/CentOS-EPEL.repo:baseurl=https://mirrors.huaweicloud.com/epel/7/aarch64/

/etc/yum.repos.d/euleros.repo:baseurl=http://mirrors.huaweicloud.com/euler/2.3/os/aarch64/

/etc/yum.repos.d/euleros.repo:gpgkey=http://mirrors.huaweicloud.com/euler/2.3/os/RPM-GPG-KEY-EulerOS

/etc/yum.repos.d/CentOS-Base.repo:baseurl=https://mirrors.huaweicloud.com/centos-altarch/7/os/aarch64/

/etc/yum.repos.d/CentOS-Base.repo:baseurl=https://mirrors.huaweicloud.com/centos-altarch/7/updates/aarch64/

/etc/yum.repos.d/CentOS-Base.repo:baseurl=https://mirrors.huaweicloud.com/centos-altarch/7/extras/aarch64/

/etc/yum.repos.d/CentOS-Base.repo:baseurl=https://mirrors.huaweicloud.com/centos-altarch/7/centosplus/aarch64/

3) 源码包准备

bash-4.2# yum install -y which wget git sudo make maven

bash-4.2# git clone https://github.com/prestodb/presto.git

bash-4.2# git checkout 0.212

4. 编译

maven包的编译

说明:presto 0.212版本要求的maven版本是3.3.9+,而yum安装的是maven 3.0.5。而高版本的maven编译安装依赖低版本的maven,所以我们需要先使用yum安装一下低版本的maven。

bash-4.2#mkdir maven

bash-4.2#git clone https://github.com/apache/maven.git

bash-4.2#git checkout maven-3.5.0

bash-4.2#cd maven

bash-4.2#mvn -DdistributionTargetDir="$HOME/app/maven/apache-maven-3.5.0-SNAPSHOT" clean package

jansi-native包的编译

jansi-native编译存在两个问题

第一、执行presto-cli命令的时候出现oops。

修改下面的代码:

jansi-native/src/main/java/org/fusesource/jansi/internal/CLibrary.java

第一个HAVE_ISATTY,是给window用的。可以不用关注。

参考https://github.com/fusesource/jansi-native/issues/17中的解决办法,undef HAVE_TTYNAME,问题解决。

目前原因尚不清楚,我猜测是因为java中boolean类型的大小不确定导致的。查看资料,java的boolean类型有时是1bit,有时是4bit。这对于aarch64这种对于地址要求严格的架构,猜测有影响。

 

第二、jansi-native包编译后的libjansi.so是一个架构强依赖的文件,使用file就可以查看。这个so包含在apache-maven-3.5.0-bin.zip文件中,apache-maven-3.5.0-bin.zip文件是从apache官网下载的,并非在aarch64架构环境编译得到,而apache官网只有x86的。

配置从官网获取的地方如下:

文件:/xxx/presto/.mvn/wrapper/maven-wrapper.properties

distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip

所以我们需要下载jansi-native源码,指定aarch64架构编译。

bash-4.2#mkdir jansi-native

bash-4.2#git clone https://github.com/fusesource/jansi-native.git

bash-4.2#cd jansi-native

bash-4.2#mvn -Dplatform=aarch64 package

使用file libjansi.so查看编译好的so的架构是否是aarch64的。

bash-4.2#file ./target/generated-sources/hawtjni/lib/META-INF/native/aarch64/libjansi.so

./target/generated-sources/hawtjni/lib/META-INF/native/aarch64/libjansi.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=571b5282a8e322bededdb59552ec4d5f75d4d212, not stripped

   查看java.library.path路径,把编译好的libjansi.so拷贝到你的环境的java.library.path路径。

说明:查看java.library.path路径的办法网上建议写函数,我是用的在编译presto的命令后带-X参数,将打印重定向到文件的方式,查看打印中的java.library.path的路径的。比如我的路径是/lib。

presto包的编译

修改下面的代码:

./presto-main/src/main/java/com/facebook/presto/server/PrestoSystemRequirements.java

修改后(红色下划线):

1575013784597680.png

bash-4.2#cd presto

bash-4.2#./mvnw clean install -DskipTests

5. 测试

presto-cli启动

[root@arm-team-0009 small7]# mv presto-cli-0.212-executable.jar prestocliarm

[root@arm-team-0009 small7]#  ./prestocliarm --server localhost:9000 --catalog hive --schema default

presto-server启动

[root@arm-team-0009 small7]# tar xf presto-server/target/presto-server-0.212.tar.gz

[root@arm-team-0009 small7]# cd presto-server-0.212

将附件中的配置拷贝到presto-server-0.212目录,如下

1575013816595256.png

链接:

https://stackoverflow.com/questions/19972294/prestodb-cannot-connect-to-discovery-server-for-refresh/19986501?r=SearchResults#19986501

目前的确是这样的,jps一下就可以看到PrestoServer的进程在,杀死进程(kill -9 )重来即可。如上图所示,ERROR只打印了3条,没有再无休止的打印了。

查看Announcer.class文件所对应的开源工程项目 https://github.com/airlift/airlift,change中明确写了,refresh功能是在0.95版本新增的。官网信息如下:

 

1575013864535414.png


我也验证了presto 0.56版本,没有重复打印

ERROR   Announcer-0     io.airlift.discovery.client.Announcer   Service announcement failed after

的信息。

6. 参考信息

https://blog.csdn.net/Eason_oracle/article/details/53187563

https://yugouai.iteye.com/blog/2002504

https://stackoverflow.com/questions/19972294/prestodb-cannot-connect-to-discovery-server-for-refresh/19986501?r=SearchResults#19986501


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。