适配完成完整trino包,源码版本为367,适配成功后RPM包下载地址为:https://download.csdn.net/download/lp895876294/70870492
trion-hadoop-hive单独的jar包下载地址为:https://download.csdn.net/download/lp895876294/70872330
国产化环境
- 飞腾芯片
- 涉密、专用版银河麒麟操作系统。系统安全防护相对于一般国产化系统更强。
已装大数据软件
- JDK-1.8-aarch64
- Hadoop:3.1.3
- Hive:3.1.2
Presto适配要求
- 在国产化操作系统中正常运行presto服务。
- 使用presto对接Hive,支持即席查询功能。
技术调研
- presto-0.267软件本身不支持aarch64架构,运行报错为:“Presto requires amd64 or ppc64le or aarch64 on Linux”。虽然可以通过编译源码解决此适配问题,但仅限于一般的国产化操作系统,对于涉密专用版的国产化操作系统依旧无法正常运行。参考地址:Presto 0.244.1 aarch64编译_刘大宁的博客-CSDN博客_presto 鲲鹏
- presto-0.267软件的hive插件,仅支持hive-hadoop2,不支持hive3。
- presto另一版本分支trino-367版本,官宣支持hive2和hive3,并针对hive的插件支持国产化操作系统。
因此,presto软件的国产化适配方案,选择trion-367版本。
适配方案
环境准备
- 下载trion-367分支源码,以及trino-hadoop-apache-3.2.0-16的源码。
- 配置trion编译环境,jdk-11.0.18-aarch64、maven-3.8.4。
修改trino-hadoop-apache-3.2.0源码
- 在/src/main/java/io/trino/hadoop/HadoopNative.java中,调整.so文件的加载策略,优先从临时目录中加载指定的文件,如果无指定文件,还是按照原有方式加载。如下。
private static void loadLibrary(String name)
throws IOException
{
File file = null ;
// 使用指定的so文件
String targetPath = System.getProperty("java.io.tmpdir") ;
String soFilePath = targetPath + "/" + name +".so" ;
File soFile = new File(soFilePath) ;
if(soFile.exists()){
file = soFile ;
}else{
String libraryPath = getLibraryPath(name);
URL url = HadoopNative.class.getResource(libraryPath);
if (url == null) {
throw new RuntimeException("library not found: " + libraryPath);
}
file = File.createTempFile(name, null);
file.deleteOnExit();
try (InputStream in = url.openStream()) {
Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
}
System.load(file.getAbsolutePath());
}
- 将/src/main/resources/nativelib/Linux-aarch64中的so文件单独拷贝出,并分别命名为:hadoop.so、snappy.so和zstd.so,留作trion打包部署后备用。
- 编译trion-hadoop-apache-3.2.0源码,在target文件夹中生成hadoop-apache-3.2.0-16.jar。
编译trino源码
- 执行maven命令,编译trino源码,并生成编译后的trion目录如下。
- 将trion-hadoop-apache-3.2.0源码中的hadoop.so、snappy.so和zstd.so,拷贝到nativelib中。
- 将jdk-11.0.18-aarch64解压后的内容拷贝到jdk中。解决jdk8和jdk11的兼容问题;同时,是trion可以不依赖于操作系统已有jdk独立运行。
- 修改bin/launcher代码,指定使用jdk路径。
- 修改etc/jvm.config,添加运行时参数信息:-Djava.io.tempdir=/data/trino/nativelib,指定.so文件优先从此目录中直接加载已有的so文件。解决的错误为:/tmp/hadoop12393847837.tmp,无法从共享目标中映射段。参考如下。
- 按照涉密、专用版国产化操作系统安装部署要求,将trion打包为trino.rpm包,参考命令为
fpm -s dir -a aarch64 -t rpm -n trino -v 3.6.7 -f -p //data/arm64/target/trino /data/trino
数据验证
-
分别在千万级表中执行普通查询、聚合查询和关联查询验证,各SQL均执行通过,参考如下。