在POD环境中轻量化构建UDF JAR

  其他常见问题
内容纲要

问题背景

开发一个Java程序,为了保证项目的完整性,都会使用成熟的 IDE 环境,并借助 Maven 这类项目管理工具来获取依赖、打包、发布等,有一定的操作门槛。

本文利用POD内现成的环境,省去调整java环境、获取大量依赖包的步骤,适用于开发小规模 udf jar 开发方案。大规模 udf 开发建议依旧按照完整的项目开发流程。

开发测试环境为 ArgoDB-5.2 ,后文不再进行额外标注,Inceptor 环境替换相关 pod 名与目录名即可。

操作步骤

获取任意 quark server 的 pod 名并进入 pod 环境

kubectl get pods -owide | grep quark | grep server
kubectl exec -it XXXXXX bash

file

进入依赖包目录

cd /usr/lib/inceptor/lib

确认目录中是否有 udf 必要的依赖包,例如 java 代码中用到了 jackson.databind 相关的类

import com.fasterxml.jackson.databind.JsonNode;

在当前目录搜索

ls | grep jackson

file

可以看到 ArgoDB 自带的环境满足依赖包需求,继续下一步

如果此处不满足依赖包需求,建议放弃此教程,使用完整的项目开发软件,或者在pod环境内引入必要的依赖 jar 包后,继续下一步

按照需求编写 java 代码文件,文件名以 FlattenJsonUDF.java 为例,内容略

vi FlattenJsonUDF.java

从当前目录中获取所有需要的依赖,并编译为 class 文件

javac -cp ".:/usr/lib/inceptor/lib/*" FlattenJsonUDF.java

将 class 文件打成 jar 包

jav -cvf FlattenJsonUDF.jar FlattenJsonUDF.class

移动至持久化目录,方便从主机中取出

mv FlattenJsonUDF.jar /var/log/quark1/

退出容器

exit

前往 quark server 所在节点,取出 jar 包,备份并持久化到镜像

如果 javac 编译时引入了 pod 内原本不存在的 jar 包,则此处同样要持久化到镜像中

mv /var/log/quark1/FlattenJsonUDF.jar /root/jar/
vi dockerfile
docker tag XXXXXX
docker build -f dockerfile -t XXXXXX ./
docker push XXXXXX

重启 quark,并测试 function 是否正常工作

CREATE PERMANENT FUNCTION XXXXXX AS 'XXXXXX';

兼容性

此开发方式理论上适用于所有容器化后的 Inceptor/ArgoDB 环境。

编译后的 jar 包在依赖包不发生变更的前提下,无需重新编译。例如本文用到的 jackson.databind 包,如果没有进行大版本变更,一般不会出现兼容性问题。

常见报错

javac 编译时出现 does not exist

引用的依赖包不存在,检查包名是否正确,在pod环境内引入必要的依赖 jar 包,或者放弃本教程,使用完整的项目开发软件

file

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。