zoukankan      html  css  js  c++  java
  • Clickhouse v18编译记录

    简介

    • ClickHouse是“战斗民族”俄罗斯搜索巨头Yandex公司开源的一个极具"战斗力"的实时数据分析数据库,是面向 OLAP 的分布式列式DBMS,圈内人戏称为“喀秋莎数据库”。ClickHouse有一个简称"CK",与Hadoop、Spark这些巨无霸组件相比,ClickHouse很轻量级,其特点:

      • 列式存储数据库,数据压缩
      • 关系型、支持SQL
      • 分布式并行计算,把单机性能压榨到极限
      • 高可用
      • 数据量级在PB级别
      • 实时数据更新
      • 索引
    • ClickHouse最大的特点就是快,快,快,重要的话说三遍。为啥这样快呢?

      • 优秀的代码编写,强⼤的底层优化,严格的单元测试,内置300多个函数
      • A vector engine & Code generation
      • CPU底层指令集的使⽤
      • C++新特性
    • clickHouse数据以列式存储,具有强悍的数据聚合和并行处理能力。业界已经有不少成功的例子,比如新浪。最近在试用clickHouse,首先需要从源码编译一个clickHouse。本文主要记叙编译过程中的一些问题和解决方式。

    • 安装的过程中,为了不污染全局环境,需要安装的辅助软件以及编译环境,都是在用户自己的目录下安装的。

    • 本来编译一个源代码,不需要写什么文档,但是clickHouse是我到目前位置编译过最难的源码,没有之一,需要写一个文档记录其中遇到的问题和解决办法。这里只简单记录解决办法,解决问题的过程太过复杂,而且很多都绕弯,在此不再详细描述。

    • 参考:https://www.csdn.net/article/2018-01-14/2826786-ClickHouse

    编译环境

    • 需要最新版的GCC 7,ClickHouse对编译环境比较挑剔,最新版的ClickHouse需要用最新版的GCC,我用的GCC 7也是用源码安装的,安装到自己的目录,而不是机器公共的目录,因为GCC的安装涉及C库的更新,我所用的是开发机,不能影响其他人的使用,各种路径的配置如下,熟悉GCC安装的朋友可以略过:
    gcc_path=/data1/home_jencoldeng/gcc_7
    export PATH=$gcc_path/bin:${third}/bin:${PATH}
    export C_INCLUDE_PATH=/usr/local/include/:${C_INCLUDE_PATH}
    export CPLUS_INCLUDE_PATH=${gcc_path}/local/include/c++/6.2.0/:$CPLUS_INCLUDE_PATH
    export LD_LIBRARY_PATH=$gcc_path/lib64:$gcc_path/lib:/usr/lib:${LD_LIBRARY_PATH}
    export CXX=${gcc_path}/bin/g++ 
    export CC=${gcc_path}/bin/gcc 
    

    下载第三方库

    • 在github上下载发布版,得到文件v18.5.1-stable.tar.gz,解压得到文件夹ClickHouse-18.5.1-stable
    • 打开隐藏文件.gitmodules,得到所依赖的第三方库列表。
    [submodule "contrib/poco"]
            path = contrib/poco
            url = https://github.com/ClickHouse-Extras/poco
    [submodule "contrib/zstd"]
            path = contrib/zstd
            url = https://github.com/facebook/zstd.git
    [submodule "contrib/lz4"]
            path = contrib/lz4
            url = https://github.com/lz4/lz4.git
    [submodule "contrib/librdkafka"]
            path = contrib/librdkafka
            url = https://github.com/edenhill/librdkafka.git
    [submodule "contrib/cctz"]
            path = contrib/cctz
            url = https://github.com/google/cctz.git
    [submodule "contrib/zlib-ng"]
            path = contrib/zlib-ng
            url = https://github.com/Dead2/zlib-ng.git
    [submodule "contrib/googletest"]
            path = contrib/googletest
            url = https://github.com/google/googletest.git
    [submodule "contrib/capnproto"]
            path = contrib/capnproto
            url = https://github.com/capnproto/capnproto.git
    [submodule "contrib/double-conversion"]
            path = contrib/double-conversion
            url = https://github.com/google/double-conversion.git
    [submodule "contrib/re2"]
            path = contrib/re2
            url = https://github.com/google/re2.git
    [submodule "contrib/ssl"]
            path = contrib/ssl
            url = https://github.com/ClickHouse-Extras/ssl.git
    [submodule "contrib/boost"]
            path = contrib/boost
            url = https://github.com/ClickHouse-Extras/boost.git
    [submodule "contrib/llvm"]
            path = contrib/llvm
            url = https://github.com/ClickHouse-Extras/llvm
    
    • 如果编译机可以联网,可以使用git submodule update等命令下载相关依赖项,但是可能是因为这个是release包,命令执行失败,所以不采用这个方式,采用下面的方式手动逐个下载,这种方法普适性更强。
    • 如果编译机无法联网,可以根据第三方库上的清单,自行下载,放到contrib目录下,或建立相关软链,可以参考如下脚本下载:
    mkdir third
    cd third
    cat ../ClickHouse-18.5.1-stable/.gitmodules  | grep url| awk '{print $NF}' | while read s;
    do 
      echo "=====$s====";
      git clone $s;
    done
    
    • 把第三方库放入ClickHouse-18.5.1-stable/contrib目录下,这个目录下的第三方库都是空目录,可以直接mv进去,或者建立软链,略过不表。

    开始编译生成Makefile文件

    • ClickHouse-18.5.1-stable下建立一个build目录,作为CMake的编译目录。
    • 执行编译命令
    cd ClickHouse-18.5.1-stable/build
    p=/data1/home_jencoldeng/clickhouse_V18/ClickHouse_install #安装目录
    cmake .. -DCMAKE_INSTALL_PREFIX=$p 
    
    • 下面开始处理编译过程中出现的各种错误,注意每一次错误,需要重新编译的话,都需要把build里面的文件清空(理论上只需要把CMakeCache.txt删掉就可以了,但我是每次都清空)。

    CMake错误1:无法找到PCRE库

    set(PCRE_INCLUDE_PATH,
            "/data1/home_jencoldeng/clickhouse_V18/third/install/include")
    set(PCRE_LIB_PATH,
            "/data1/home_jencoldeng/clickhouse_V18/third/install/lib")
    list(APPEND, CMAKE_INCLUDE_PATH, PCRE_INCLUDE_PATH)
    list(APPEND, CMAKE_LIBRARY_PATH, PCRE_LIB_PATH)
    

    CMake错误2:没有找到expat库

    # $p是需要安装的路径,避免污染全局环境所以安装在自己的目录下
    # BUILD_shared是一个选项,表示是否生成共享库
    cmake -DBUILD_shared=OFF -DCMAKE_INSTALL_PREFIX=$p && make -j 8 && make install
    

    CMake错误3:没有找到zlib库

    • 没有找到zlib库
      没有找到zlib库

    • 修改contrib/CMakeLists.txt,把CMAKE_DISABLE_FIND_PACKAGE_ZLIB标志位设置为0,让他从标准路径上查找,如图:
      image.png

    CMake错误4:lz4编译有问题

    • 找不到头文件
      lz4编译有问题

    • 可能是lz4的版本问题,找一个旧版本,如lz4-1.8.0,放入contrib目录(直接代替或者软链)。

    • 至此,CMake成功通过。

    关于Makefile编译

    • ClickHouse的代码和第三方库非常巨大,所以我每次都是使用make -j 20来编译,也就是最多20个进程同时编译。并发进程数依赖于机器的性能。
    • CPP代码编译慢,所以需要多进程同事进行。

    Makefile错误1:zstd编译错

    • zstd编译不通过:Error: no such instruction
      zstd编译错

    • 根据经验,出现这个原因是因为平台优化的选项打开了,按照网上的做法,把GCC平台优化-march关闭就可以了,但是关闭后问题仍然无法解决(也可能是我修改的地方不太对,我对CMake并不十分熟悉),最后只要采用一个稍为旧的版本,如zstd-1.3.3

    Makefile错误2:zlib编译出错

    • zlib编译出错:数据类型未定义
      zlib编译出错

    • 看起来应该是头文件没有include,类型没有定义,在contrib/zlib-ng/zlib.h加上如下定义

    #include <stdarg.h>
    #ifndef z_off64_t
    #  define z_off64_t off64_t
    #endif
    
    • 注意字段长度应该是64位,不要搞错长度,避免运行时出现问题,这样的话问题非常难以定位。

    Makefile错误3:Boost连接错误

    • 一大堆boost连接错误,主要的问题是undefined reference to boost::system::system_category()`,图中只是冰山一角:
      Boost连接错误

    • 网上资料说,添加上需要的库-lboost_system即可解决

    • 经过查看CMakeList.txt,发现这个是测试功能,也就是说,可以不需要,因此修改CMakeLists.txt文件,查找ENABLE_TESTSTEST_COVERAGE,把测试功能全部屏蔽。

    • 高手可以通过修改CMakeList.txt解决。

    编译成功

    • 从这里看出,ClickHouse的二进制文件把所有可以静态链接的库都已经连接进去了,甚至连CPP库都静态连接了,部署的时候应该不难。
    $ ldd bin/clickhouse
            linux-vdso.so.1 =>  (0x00007fffe6fe2000)
            libssl.so.10 => /usr/lib64/libssl.so.10 (0x0000003a46800000)
            libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x0000003a45400000)
            libz.so.1 => /lib64/libz.so.1 (0x0000003bb0a00000)
            librt.so.1 => /lib64/librt.so.1 (0x0000003daa600000)
            libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003bafa00000)
            libdl.so.2 => /lib64/libdl.so.2 (0x0000003bafe00000)
            libm.so.6 => /lib64/libm.so.6 (0x0000003bb0600000)
            libc.so.6 => /lib64/libc.so.6 (0x0000003baf600000)
            /lib64/ld-linux-x86-64.so.2 (0x0000003baf200000)
            libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x0000003a46000000)
            libkrb5.so.3 => /lib64/libkrb5.so.3 (0x0000003a45800000)
            libcom_err.so.2 => /lib64/libcom_err.so.2 (0x0000003a44c00000)
            libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x0000003a45c00000)
            libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x0000003a46400000)
            libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x0000003a45000000)
            libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003bb1a00000)
            libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a43c00000)
    

    后记

    • 编译ClickHouse代码,真是我遇到过最麻烦的代码,各种依赖,各种错误。
    • 我对CMake方式编译还真的不熟练,需要加强。
    • 后续会有对ClickHouse的相关测试,欢迎关注。
  • 相关阅读:
    LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)
    LeetCode 21. Merge Two Sorted Lists (合并两个有序链表)
    LeetCode 720. Longest Word in Dictionary (字典里最长的单词)
    LeetCode 690. Employee Importance (职员的重要值)
    LeetCode 645. Set Mismatch (集合不匹配)
    LeetCode 500. Keyboard Row (键盘行)
    LeetCode 463. Island Perimeter (岛的周长)
    115.Distinct Subsequences
    55.Jump Game
    124.Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/monkeyteng/p/10220869.html
Copyright © 2011-2022 走看看