从源码编译
Contents
从源码编译#
在 docker 容器内编译和使用#
此节介绍在官方编译镜像 hybridsql 中编译 OpenMLDB,主要可以用于在容器内试用和开发目的。镜像内置了编译所需要的工具和依赖,因此不需要额外的步骤单独配置它们。关于基于非 docker 的编译使用方式,请参照下面的 从源码全量编译 章节。
对于编译镜像的版本,需要注意拉取的镜像版本和 OpenMLDB 发布版本保持一致。以下例子演示了在 hybridsql:0.8.5
镜像版本上编译 OpenMLDB v0.8.5 的代码,如果要编译最新 main
分支的代码,则需要拉取 hybridsql:latest
版本镜像。
下载 docker 镜像
docker pull 4pdosc/hybridsql:0.8
启动 docker 容器
docker run -it 4pdosc/hybridsql:0.8 bash
在 docker 容器内, 克隆 OpenMLDB, 并切换分支到 v0.8.5
cd ~ git clone -b v0.8.5 https://github.com/4paradigm/OpenMLDB.git
在 docker 容器内编译 OpenMLDB
cd OpenMLDB make
安装 OpenMLDB, 默认安装到
${PROJECT_ROOT}/openmldb
make install
至此, 你已经完成了在 docker 容器内的编译工作,你现在可以在容器内开始使用 OpenMLDB 了。
从源码全量编译#
本章介绍脱离预制容器环境的源码编译方式。
硬件要求#
内存: 推荐 8GB+.
硬盘: 全量编译需要至少 25GB 的空闲磁盘空间
操作系统: CentOS 7, Ubuntu 20.04 或者 macOS >= 10.15, 其他系统未经测试,欢迎提 issue 或 PR
CPU 架构: 目前仅支持 x86 架构,暂不支持例如 ARM 等架构 (注意在 M1 Mac 上异构运行 x86 镜像同样暂不支持)
💡 注意:默认关闭了并发编译,其典型的编译时间大约在一小时左右。如果你认为编译机器的资源足够,可以通过调整编译参数 NPROC
来启用并发编译功能。这会减少编译所需要的时间但也需要更多但内存。例如下面命令将并发编译数设置成使用四个核进行并发编译:
make NPROC=4
依赖工具#
gcc >= 8 或者 AppleClang >= 12.0.0
cmake 3.20 或更新版本(建议 < cmake 3.24)
JDK 8
Python3, Python setuptools, Python wheel
如果需要从源码编译 thirdparty, 查看 third-party’s requirement 里的额外要求
编译和安装 OpenMLDB#
成功编译 OpenMLDB 要求依赖的第三方库预先安装在系统中。因此添加了一个 Makefile
, 将第三方依赖自动安装和随后执行 CMake 编译浓缩到一行 make
命令中。make
提供了两种编译方式,对第三方依赖进行不同的管理方式:
方式一:自动下载预编译库: 编译安装命令为:
make && make install
。编译脚本自动从 hybridsql 和 zetasql 两个仓库下载必须的预编译好的三方库。目前提供 CentOS 7, Ubuntu 20.04 和 macOS 的预编译包。对于其他操作系统,推荐使用方式二的完整编译。方式二:完整源代码编译: 如果操作系统不在支持的系统列表中(CentOS 7, Ubuntu 20.04, macOS),从源码编译是推荐的方式。注意首次编译三方库可能需要更多的时间,在一台 2 核 8 GB 内存机器大约需要一个小时。从源码编译安装第三方库, 传入
BUILD_BUNDLED=ON
:make BUILD_BUNDLED=ON make install
以上 OpenMLDB 安装成功的默认目录放在 ${PROJECT_ROOT}/openmldb
,可以通过修改参数 CMAKE_INSTALL_PREFIX
更改安装目录(详见下面章节 make
额外参数)。
make
额外参数#
控制 make
的行为. 例如,将默认编译模式改成 Debug:
make CMAKE_BUILD_TYPE=Debug
OPENMLDB_BUILD_DIR: 代码编译路径
默认: ${PROJECT_ROOT}/build
CMAKE_BUILD_TYPE
默认: RelWithDebInfo
CMAKE_INSTALL_PREFIX: 安装路径
默认: ${PROJECT_ROOT}/openmldb
SQL_PYSDK_ENABLE:是否编译 Python SDK
默认: OFF
SQL_JAVASDK_ENABLE:是否编译 Java SDK
默认: OFF
TESTING_ENABLE:是否编译测试目标
默认: OFF
NPROC: 并发编译数
默认: 1
CMAKE_EXTRA_FLAGS: 传递给 cmake 的额外参数
默认: ‘’
BUILD_BUNDLED: 从源码编译 thirdparty 依赖,而不是下载预编译包
默认: OFF
TCMALLOC_ENABLE: 通过 tcmalloc 的暴露应用的内存信息
默认: ON
OPENMLDB_BUILD_TARGET: 只需编译某些target时使用。例如,只想要编译一个测试程序ddl_parser_test,你可以设置
OPENMLDB_BUILD_TARGET=ddl_parser_test
。如果是多个target,用空格隔开。可以减少编译时间,减少编译产出文件,节约存储空间。默认: all
THIRD_PARTY_CMAKE_FLAGS: 编译thirdparty时可以配置额外参数。例如,配置每个thirdparty项目并发编译,
THIRD_PARTY_CMAKE_FLAGS=-DMAKEOPTS=-j8
。thirdparty不受NPROC影响,thirdparty的多项目将会串行执行。 默认:‘’
并发编译Java SDK#
make SQL_JAVASDK_ENABLE=ON NPROC=4
编译好的jar包在各个submodule的target目录中。如果你想要在自己的项目中使用你自己编译的jar包作为依赖,建议不要使用systemPath的方式引入(容易出现ClassNotFoundException
,需要处理Protobuf等依赖包的编译运行问题)。更好的方式是,通过mvn install -DskipTests=true -Dscalatest.skip=true -Dwagon.skip=true -Dmaven.test.skip=true -Dgpg.skip
安装到本地m2仓库,再使用它们。
针对特征工程优化的 OpenMLDB Spark 发行版#
OpenMLDB Spark 发行版是 Apache Spark 的定制发行版。它针对机器学习场景提供特定优化,包括达到10倍到100倍性能提升的原生 LastJoin 实现。你可以使用和标准 Spark 一样的 Java/Scala/Python/SQL 接口,来使用 OpenMLDB Spark 发行版。
注意:为了运行 OpenMLDB 的定制化 SQL 语法,你必须使用该 OpenMLDB Spark 发行版本。
下载预编译的OpenMLDB Spark发行版。
wget https://github.com/4paradigm/spark/releases/download/v3.2.1-openmldb0.8.5/spark-3.2.1-bin-openmldbspark.tgz
或者下载源代码并从头开始编译。
git clone https://github.com/4paradigm/spark.git
cd ./spark/
./dev/make-distribution.sh --name openmldbspark --pip --tgz -Phadoop-2.7 -Pyarn -Pallinone -Phive -Phive-thriftserver
设置环境变量
SPARK_HOME
来使用 OpenMLDB Spark 的发行版本来运行 OpenMLDB 或者其他应用。
tar xzvf ./spark-3.2.1-bin-openmldbspark.tgz
cd spark-3.2.1-bin-openmldbspark/
export SPARK_HOME=`pwd`
你现在可以正常使用 OpenMLDB 了,同时享受由定制化的 Spark 所带来的的性能提升体验。
快速编译适配其他平台#
如前文所述,如果你想要在其他平台运行 OpenMLDB 或 SDK,需要从源码编译。我们为以下几个平台,提供了快速编译的解决方案,其他少见的平台请自行源码编译。
Centos 6等低版本glibc Linux OS#
本地编译#
本地编译centos6适配的版本,可以使用Docker和脚本steps/centos6_build.sh
。如下所示,我们使用当前目录作为挂载目录,将编译产出放在本地。
```bash
git clone https://github.com/4paradigm/OpenMLDB.git
cd OpenMLDB
docker run -it -v`pwd`:/root/OpenMLDB ghcr.io/4paradigm/centos6_gcc7_hybridsql bash
在容器内执行编译脚本,编译产出在build
目录下。如果编译中下载bazel
或icu4c
失败,可以使用OpenMLDB提供的镜像源,配置环境变量OPENMLDB_SOURCE=true
即可。make可使用的各个环境变量同样生效,如下所示。
cd OpenMLDB
bash steps/centos6_build.sh
# THIRD_PARTY_CMAKE_FLAGS=-DMAKEOPTS=-j8 bash steps/centos6_build.sh # run fast when build single project
# OPENMLDB_SOURCE=true bash steps/centos6_build.sh
# SQL_JAVASDK_ENABLE=ON SQL_PYSDK_ENABLE=ON NPROC=8 bash steps/centos6_build.sh # NPROC will build openmldb in parallel, thirdparty should use THIRD_PARTY_CMAKE_FLAGS
本地2.20GHz CPU,SSD硬盘,32线程编译三方库与OpenMLDB主体,耗时参考:
THIRD_PARTY_CMAKE_FLAGS=-DMAKEOPTS=-j32 SQL_JAVASDK_ENABLE=ON SQL_PYSDK_ENABLE=ON NPROC=32 bash steps/centos6_build.sh
thirdparty(不包括下载src时间)~40m:zetasql打patch 13m,所有thirdparty编译30m
OpenMLDB 本体,包括python和java native,~12min
云编译#
Fork OpenMLDB仓库后,可以使用在Actions
中触发workflow Other OS Build
,编译产出在Actions
的Artifacts
中。workflow 配置方式:
不要更换
Use workflow from
为某个tag,可以是其他分支。选择
os name
为centos6
。如果不是编译main分支,在
The branch, tag or SHA to checkout, otherwise use the branch
中填写想要的分支名、Tag(e.g. v0.8.5)或SHA。编译产出在触发后的runs界面中,参考成功产出的runs链接。
一定会产出openmldb binary文件。
如果不需要Java或Python SDK,可配置
java sdk enable
或python sdk enable
为OFF
,节约编译时间。
此编译流程需要从源码编译thirdparty,且资源较少,无法开启较高的并发编译。因此编译时间较长,大约需要3h5m(2h thirdparty+1h OpenMLDB)。workflow会缓存thirdparty的编译产出,因此第二次编译会快很多(1h15m OpenMLDB)。
Macos 10.15, 11#
Macos适配不需要从源码编译thirdparty,所以云编译耗时不会太长,大约1h15m。本地编译与从源码全量编译章节相同,无需编译thirdparty(BUILD_BUNDLED=OFF
)。云编译需要在Actions
中触发workflow Other OS Build
,编译产出在Actions
的Artifacts
中。workflow 配置 os name
为macos10
/macos11
,同样可配置java sdk enable
或python sdk enable
为OFF
。