一、背景信息
在过去版本中,Apache Doris 提供了 C++ 语言的原生 UDF,便于用户通过自己编写自定义函数来满足特定场景的分析需求。但由于原生 UDF 与 Doris 代码耦合度高、当 UDF 出现错误时可能会影响集群稳定性,且只支持 C++ 语言,对于熟悉 Hive、Spark 等大数据技术栈的用户而言存在较高门槛,因此在 1.2.0 新版本Apache Doris社区增加了 Java 语言的自定义函数,支持通过 Java 编写 UDF/UDAF,方便用户在 Java 生态中使用。同时,通过堆外内存、Zero Copy 等技术,使得跨语言的数据访问效率大幅提升。
C++自定义UDF函数主要适用于,1.2.0版本之前,用户需要的分析能力 Doris 并不具备的场景,比如Tableau通过固化sql直连doris查询时出现部分函数不兼容问题。用户可以自行根据自己的需求,实现自定义的函数,并且通过 UDF 框架注册到 Doris 中,来扩展 Doris 的能力,并解决用户分析需求。
二、环境信息
2.1 硬件信息
- CPU :4C
- CPU型号:x64(AVX2)
- 内存 :10GB
- 硬盘 :66GB SSD
2.2 软件信息
- Linux版本 :CentOS-7
- Apahce Doris版本 :0.15-release
三、环境准备
C++开发环境准备。
3.1 IDE选型
code:blocks
3.2 下载安装
如果使用的是windows操作系统,建议下载第四个列表中的,因为它自带了GCC/G++ compliler 和 GDB debugger,当然也可以后续自己下载MinGW。
3.3 Hello World
环境搭好后,传统手艺:Hello World
四、自定义函数流程
以官方源码为例。
4.1 源码准备
git clone https://github.com/apache/incubator-doris/tree/branch-0.15/contrib/udf/src/udf_samples
4.2 文件上传
根据官文将文件放置对应的路径下,注意修改CMakeLists.txt文件,以官文内容为主。
├── thirdparty │ │── include │ │ └── udf.h │ └── lib │ └── libDorisUdf.a └── udf_samples ├── CMakeLists.txt ├── uda_sample.cpp ├── uda_sample.h ├── udf_sample.cpp └── udf_sample.h
4.3 编译UDF文件
#进入build文件夹 cd /opt/doris/udf/udf_samples/build #生成Makefile cmake ../ #生成对应动态库 make
4.4 编译结果
├── thirdparty ├── udf_samples └── build └── src └── udf_samples ├── libudasample.so └── libudfsample.so
4.5 Nginx服务搭建
由于doris client需要http服务获取so动态库,故需搭建nginx。
#安装部署nginx步骤省略 server { listen 8088; server_name localhost; location /udf { alias /opt/doris/udf; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
4.6 函数使用
4.6.1 创建 UDF 函数
CREATE FUNCTION MyADD00(INT,INT) RETURNS INT PROPERTIES ( "symbol" = "_ZN9doris_udf6AddUdfEPNS_15FunctionContextERKNS_6IntValES4_", "object_file" = "http://10.192.119.68:8088/udf/udf_samples/build/src/udf_samples/libudfsample.so" );
4.6.2 使用UDF 函数
五、常见问题
5.1 ROS问题
make时出现ROS问题;
注意:需要在CMakeFiles.txt头部加一条SET(CMAKE_CXX_FLAGS “-std=c++0x”)命令解决。
5.2 路径问题
将CMakeFiles.txt的相对路径都调整为绝对路径或新增路径变量。
Apache Doris 自定义C++ UDF流程详解至此结束,查阅过程中若遇到问题欢迎留言交流