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预构建二进制文件:
本项目采用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
可以通过在新的构建目录中设置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
可以通过在新的构建目录中设置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
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++ 核心指南。
在存储库的顶层提供了一个基于 Chromium 风格指南的 .clang-format
样式配置。请在提交前使用最新版本(首选 8.0+)的 ClangFormat 格式化您的代码。
使用方法:
clang-format -i File.cpp
在存储库的顶层提供了一个 .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 | 是 |
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 的说明。
建议(但不是必需)使用 .rpm 安装 CUDA 和 NVIDIA 驱动程序,具体方法请参见 NVIDIA 提供的说明。rpm(网络)
方法(首选)可确保您始终拥有最新的稳定驱动程序,而 rpm(本地)