HeavyDB(前身为OmniSciDB)
HeavyDB是一个开源的基于SQL的关系型列式数据库引擎,它充分利用现代硬件(包括CPU和GPU)的全部性能和并行能力,能够在毫秒级内查询数十亿行的数据集,无需索引、预聚合或降采样。HeavyDB可以在混合CPU/GPU系统(目前支持Nvidia GPU)上运行,也可以在仅使用CPU的系统上运行,支持X86、Power和ARM(实验性支持)架构。为了实现最佳性能,HeavyDB采用了存储、CPU内存和GPU内存之间的多级缓存数据方式,以及创新的即时(JIT)查询编译框架。
有关使用信息,请参阅产品文档,有关系统内部架构的更多详细信息,请查看开发者文档。更多技术讨论可以在HEAVY.AI社区论坛上找到。
该存储库包含了多个在单独许可下提供的第三方软件包。有关这些软件包及其各自许可证的详细信息,请参阅ThirdParty/licenses/index.md。
下载和安装说明
HEAVY.AI为项目的稳定版本提供了Linux预构建二进制文件:
开发HeavyDB:目录
链接
许可证
本项目采用Apache许可证2.0版。
该存储库包含了多个在单独许可下提供的第三方软件包。有关这些软件包及其各自许可证的详细信息,请参阅ThirdParty/licenses/index.md。
贡献
为了明确授予任何个人或实体贡献的知识产权许可,HEAVY.AI必须有一份已由每个贡献者签署的贡献者许可协议("CLA")存档,表示同意贡献者许可协议。在提交拉取请求后,机器人将通知您是否需要签署CLA,并提供如何签署的说明。请在签署之前仔细阅读协议,并保留一份副本以供记录。
构建
如果这是您第一次构建HeavyDB,请安装下面依赖部分中提到的依赖项。
HeavyDB使用CMake作为其构建系统。
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=debug ..
make -j 4
以下cmake
/ccmake
选项可以启用/禁用不同的功能:
-DCMAKE_BUILD_TYPE=release
- 要使用的构建类型和编译器选项。 选项包括Debug
、Release
、RelWithDebInfo
、MinSizeRel
和不设置。-DENABLE_ASAN=off
- 启用地址sanitizer。默认为off
。-DENABLE_AWS_S3=on
- 如果可用,启用AWS S3支持。默认为on
。-DENABLE_CUDA=off
- 禁用CUDA。默认为on
。-DENABLE_CUDA_KERNEL_DEBUG=off
- 为CUDA内核启用调试符号。会显著降低内核性能。默认为off
。-DENABLE_DECODERS_BOUNDS_CHECKING=off
- 为列解码启用边界检查。默认为off
。-DENABLE_FOLLY=on
- 使用Folly。默认为on
。-DENABLE_IWYU=off
- 启用include-what-you-use。默认为off
。-DENABLE_JIT_DEBUG=off
- 为JIT启用调试符号。默认为off
。-DENABLE_ONLY_ONE_ARCH=off
- 仅为主机架构编译GPU代码,加快编译速度。默认为off
。-DENABLE_PROFILER=off
- 启用google perftools。默认为off
。-DENABLE_STANDALONE_CALCITE=off
- 需要独立的Calcite服务器。默认为off
。-DENABLE_TESTS=on
- 构建单元测试。默认为on
。-DENABLE_TSAN=off
- 启用线程sanitizer。默认为off
。-DENABLE_CODE_COVERAGE=off
- 启用代码覆盖率符号(仅限clang)。默认为off
。-DPREFER_STATIC_LIBS=off
- 如果可用,静态链接依赖项。默认为off
。仅在CentOS上有效。
测试
HeavyDB使用Google Test作为其主要测试框架。测试位于Tests目录下。
sanity_tests
目标运行最常见的测试。如果使用Makefiles构建,可以使用以下命令运行测试:
make sanity_tests
AddressSanitizer
可以通过在新的构建目录中设置ENABLE_ASAN
CMake标志来激活AddressSanitizer。此时还必须禁用CUDA。在空的构建目录中运行CMake并编译:
mkdir build && cd build
cmake -DENABLE_ASAN=on -DENABLE_CUDA=off ..
make -j 4
最后运行测试:
export ASAN_OPTIONS=alloc_dealloc_mismatch=0:handle_segv=0
make sanity_tests
ThreadSanitizer
可以通过在新的构建目录中设置ENABLE_TSAN
CMake标志来激活ThreadSanitizer。此时还必须禁用CUDA。在空的构建目录中运行CMake并编译:
mkdir build && cd build
cmake -DENABLE_TSAN=on -DENABLE_CUDA=off ..
make -j 4
我们使用TSAN抑制文件来忽略第三方库中的警告。通过将其添加到TSAN_OPTIONS
环境变量中来使用抑制文件:
export TSAN_OPTIONS="suppressions=/path/to/heavydb/config/tsan.suppressions"
最后运行测试:
make sanity_tests
生成软件包
HeavyDB使用CPack来生成用于分发的软件包。在CentOS上生成的启用静态链接的软件包可以在大多数其他最新的Linux发行版上使用。
要在CentOS上生成软件包(假设从heavydb仓库的顶层开始):
mkdir build-package && cd build-package
cmake -DPREFER_STATIC_LIBS=on -DCMAKE_BUILD_TYPE=release ..
make -j 4
cpack -G TGZ
第一个命令创建一个新的构建目录,以确保没有上一次构建的残留。
第二个命令配置构建,优先链接到依赖项的静态库而不是(默认的)共享库,并使用CMake的release
配置(启用编译器优化)进行构建。链接到库的静态版本可以减少目标系统上必须安装的依赖项数量。
最后一个命令生成一个.tar.gz
包。TGZ
可以替换为,例如,RPM
或DEB
以分别生成.rpm
或.deb
。
使用
startheavy
包装脚本可用于在测试环境中启动HeavyDB。这个脚本执行以下任务:
- 如果需要,通过
initdb
初始化data
存储目录 - 启动主HeavyDB服务器,
heavydb
- 提供下载和导入示例数据集的选项,使用
insert_sample_data
脚本
假设你在build
目录中,并且它是heavydb
仓库的子目录,可以通过以下方式运行startheavy
:
../startheavy
手动启动
假设以下命令在build
目录内运行。
初始化data
存储目录。这个命令只需要运行一次。
mkdir data && ./bin/initdb data
启动 HeavyDB 服务器:
./bin/heavydb
如果需要,在新终端中运行 insert_sample_data
脚本插入示例数据集:
../insert_sample_data
现在您可以开始使用数据库了。可以使用 heavysql
工具从命令行与数据库交互:
./bin/heavysql -p HyperInteractive
其中 HyperInteractive
是默认密码。如果未提供用户名,则默认使用 admin
用户。
代码风格
贡献的代码应在大多数 Linux 发行版上使用最新的编译器编译时不产生警告。代码更改应遵循 C++ 核心指南。
clang-format
在存储库的顶层提供了一个基于 Chromium 风格指南的 .clang-format
样式配置。请在提交前使用最新版本(首选 8.0+)的 ClangFormat 格式化您的代码。
使用方法:
clang-format -i File.cpp
clang-tidy
在存储库的顶层提供了一个 .clang-tidy
配置。请在提交前使用最新版本(首选 6.0+)的 clang-tidy 对您的代码进行 lint 检查。
clang-tidy
需要在运行前生成所有文件。最简单的方法是在运行 clang-tidy
之前进行完整构建。提供了一个运行 clang-tidy
的构建目标。使用方法:
make run-clang-tidy
注意:clang-tidy
可能会对源代码进行无效或过于冗长的更改。建议先提交您的更改,然后运行 clang-tidy
并在将其修改添加到您的提交之前审查其建议的更改。
注意:clang-tidy
目标使用 LLVM 提供的 run-clang-tidy.py
脚本,该脚本可能依赖于 PyYAML
。该目标还依赖于 jq
,用于过滤 compile_commands.json
文件的部分内容。
依赖项
HeavyDB 有以下依赖项:
软件包 | 最低版本 | 是否必需 |
---|---|---|
CMake | 3.16 | 是 |
LLVM | 9.0 | 是 |
GCC | 8.4.0 | 否,如果使用 clang 构建 |
Go | 1.12 | 是 |
Boost | 1.72.0 | 是 |
OpenJDK | 1.7 | 是 |
CUDA | 11.0 | 是,如果编译时支持 GPU |
gperftools | 是 | |
gdal | 2.4.2 | 是 |
Arrow | 3.0.0 | 是 |
CentOS 7
HeavyDB 需要一些在常见的 CentOS/RHEL 软件包存储库中不提供的依赖项。为 CentOS 7(x86_64)提供了一个包含所有这些依赖项的预构建软件包。
使用 scripts/mapd-deps-prebuilt.sh 构建脚本安装预构建的依赖项。
这些依赖项将安装到 /usr/local/mapd-deps
下的目录中。mapd-deps-prebuilt.sh
脚本还安装了 Environment Modules,以简化所需环境变量的管理。运行 mapd-deps-prebuilt.sh
脚本后,请注销并重新登录以激活 Environment Modules 命令 module
。
默认情况下,mapd-deps
环境模块是禁用的。要在当前会话中激活它,请运行:
module load mapd-deps
要禁用 mapd-deps
模块:
module unload mapd-deps
警告:mapd-deps
软件包包含较新版本的软件包,如 GCC 和 ncurses,这些可能与您的其他环境不兼容。在编译其他软件包之前,请确保禁用 mapd-deps
模块。
下面是安装 CUDA 的说明。
CUDA
建议(但不是必需)使用 .rpm 安装 CUDA 和 NVIDIA 驱动程序,具体方法请参见 NVIDIA 提供的说明。rpm(网络)
方法(首选)可确保您始终拥有最新的稳定驱动程序,而 rpm(本地)
方法允许您安装而无需互联网访问。
.rpm 方法需要安装 DKMS,可以从 Extra Packages for Enterprise Linux 存储库获得:
sudo yum install epel-release
安装后请务必重启以激活 NVIDIA 驱动程序。
环境变量
mapd-deps-prebuilt.sh
脚本包含两个具有适当环境变量的文件:mapd-deps-<date>.sh
(用于从shell配置中源引)和mapd-deps-<date>.modulefile
(用于Environment Modules,yum包environment-modules
)。这些文件放置在mapd-deps安装目录中,通常为/usr/local/mapd-deps/<date>
。可以使用其中任何一个来配置环境:.sh
可以在shell配置中源引;.modulefile
需要移动到modulespath。
构建依赖项
scripts/mapd-deps-centos.sh脚本用于构建依赖项。如果您想更改依赖项版本或在其他CPU架构上构建,请修改此脚本并运行。
cd scripts
module unload mapd-deps
./mapd-deps-centos.sh --compress
macOS
提供了scripts/mapd-deps-osx.sh,它会自动安装和/或更新Homebrew,并使用它来安装所有依赖项。运行之前请确保macOS完全更新,并已安装Xcode。Xcode可以从App Store安装。
CUDA
mapd-deps-osx.sh
将通过Homebrew自动安装CUDA,并将正确的环境变量添加到~/.bash_profile
中。
Java
mapd-deps-osx.sh
将通过Homebrew自动安装Java和Maven,并将正确的环境变量添加到~/.bash_profile
中。
Ubuntu
HeavyDB所需的大多数构建依赖项都可以通过APT获得。某些依赖项,如Thrift、Blosc和Folly必须自行构建,因为它们要么在默认仓库中不存在,要么版本过时。为Ubuntu 18.04(x86_64)提供了一个包含所有这些依赖项的预构建包。默认情况下,依赖项将安装到/usr/local/mapd-deps/
;请参阅下面的环境变量部分,了解如何将这些依赖项添加到您的环境中。
Ubuntu 16.04
HeavyDB需要比Ubuntu 16.04提供的版本更新的Boost版本。scripts/mapd-deps-ubuntu1604.sh构建脚本将编译并安装更新版本的Boost到/usr/local/mapd-deps/
目录。
Ubuntu 18.04
使用scripts/mapd-deps-prebuilt.sh构建脚本安装预构建的依赖项。
这些依赖项将安装到/usr/local/mapd-deps
下的目录中。上述mapd-deps-prebuilt.sh
脚本将生成一个名为mapd-deps.sh
的脚本,其中包含需要设置的环境变量。只需在当前会话中源引此文件(或将其符号链接到/etc/profile.d/mapd-deps.sh
)即可激活它:
source /usr/local/mapd-deps/mapd-deps.sh
环境变量
需要将CUDA和mapd-deps的lib
目录添加到LD_LIBRARY_PATH
中;需要将CUDA和mapd-deps的bin
目录添加到PATH
中。mapd-deps-ubuntu.sh
和mapd-deps-prebuilt.sh
脚本将生成一个名为mapd-deps.sh
的脚本,其中包含需要设置的环境变量。只需在当前会话中源引此文件(或将其符号链接到/etc/profile.d/mapd-deps.sh
)即可激活它:
source /usr/local/mapd-deps/mapd-deps.sh
CUDA
Ubuntu的最新版本在标准仓库中提供了NVIDIA CUDA Toolkit和驱动程序。安装方法:
sudo apt install -y \
nvidia-cuda-toolkit
安装后请务必重启以激活NVIDIA驱动程序。
构建依赖项
scripts/mapd-deps-ubuntu.sh和scripts/mapd-deps-ubuntu1604.sh脚本分别用于构建Ubuntu 18.04和16.04的依赖项。这些脚本将安装所有必需的依赖项(除CUDA外)并构建需要的依赖项。如果您想更改依赖项版本或在其他CPU架构上构建,请修改此脚本并运行。
cd scripts
./mapd-deps-ubuntu.sh --compress
Arch
提供了scripts/mapd-deps-arch.sh,它将使用yay从Arch User Repository安装软件包,并为下面列出的一些软件包使用自定义PKGBUILD脚本。如果您还没有yay
,请先安装它:https://github.com/Jguer/yay#installation
软件包版本要求:
CUDA
可以使用以下方法安装CUDA和NVIDIA驱动程序。
yay -S
linux-headers
cuda
nvidia
安装完成后请务必重启以激活NVIDIA驱动。
环境变量
cuda 软件包应该会设置使用CUDA所需的环境变量。如果你收到错误提示说找不到 nvcc,那么需要将CUDA的 bin 目录添加到 PATH 中:最简单的方法是创建一个名为 /etc/profile.d/mapd-deps.sh 的新文件,内容如下:
PATH=/opt/cuda/bin:$PATH
export PATH