化鲲为鹏,我有话说【程序奔溃】华为鲲鹏云服务器 presto 0.212软件运行奔溃
化鲲为鹏,我有话说
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.cn/epel/7/aarch64/ /etc/yum.repos.d/euleros.repo:baseurl=http://mirrors.huaweicloud.cn/euler/2.3/os/aarch64/ /etc/yum.repos.d/euleros.repo:gpgkey=http://mirrors.huaweicloud.cn/euler/2.3/os/RPM-GPG-KEY-EulerOS /etc/yum.repos.d/CentOS-Base.repo:baseurl=https://mirrors.huaweicloud.cn/centos-altarch/7/os/aarch64/ /etc/yum.repos.d/CentOS-Base.repo:baseurl=https://mirrors.huaweicloud.cn/centos-altarch/7/updates/aarch64/ /etc/yum.repos.d/CentOS-Base.repo:baseurl=https://mirrors.huaweicloud.cn/centos-altarch/7/extras/aarch64/ /etc/yum.repos.d/CentOS-Base.repo:baseurl=https://mirrors.huaweicloud.cn/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
修改后(红色下划线):
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目录,如下
链接:
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版本新增的。官网信息如下:
我也验证了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
- 点赞
- 收藏
- 关注作者
评论(0)