[Clickhouse]手把手教你开发一个Clickhouse组件

328人浏览 / 0人评论

Clickhouse源码是通过一个统一入口https://github.com/ClickHouse/ClickHouse/blob/master/programs/main.cpp,加载各个不同的Application(也就是组件,来实现不同的功能),代码是2021-06-30下载的最新master代码编译的, 目前最新的release为:

 

我们看最终的这个编译结果:

图1

 

clickhouse-benchmark:性能测试工具

clickhouse-client:Clickhouse的客户端工具

clickhouse-compressor:压缩工具

clickhouse-copier:Clickhouse数据迁移工具

clickhouse-extract-from-config:大家看代码吧

clickhouse-format:格式化工具

clickhouse-git-import:大家看代码吧

clickhouse-keeper:大家看代码吧

clickhouse-library-bridge:大家看代码吧

clickhouse-local:Clickhouse本地版本

clickhouse-obfuscator:大家看代码吧

clickhouse-odbc-bridge:odbc连接器

clickhouse-server:大家用的Clickhouse服务

 

clickhouse-tiger:我自定义的一个组件,  该组件打印输入参数,实现效果如下:

 

 

如果开发一个clickhouse-tiger组件,有哪些修改点呢?我把修改文件截图如下:

图2

 

接下来,我将详细说明每个文件的修改点:

第一个修改文件:./programs/CMakeLists.txt


这些修改是将我们需要开发的tiger模块添加到clickhouse的编译流程中,在编译时和clickhouse一起编译,连接。

定义编译开关变量,默认将编译该模块: option (ENABLE_CLICKHOUSE_TIGER "Tiger Program" ${ENABLE_CLICKHOUSE_ALL})

 

图3

 

打印开关值:

if (ENABLE_CLICKHOUSE_TIGER)

message(STATUS "Tiger mode: ON")

else()

message(STATUS "Tiger mode: OFF")

endif()

图4

 

新模块有源码,include,编译需要link的,定义后加入系统编译

图5

 

添加子模块:  add_subdirectory (tiger)

添加模块target:

if (ENABLE_CLICKHOUSE_TIGER)

list (APPEND CLICKHOUSE_ALL_TARGETS clickhouse-tiger)

endif ()

 

图6

 

将新模块添加到target中:

if (ENABLE_CLICKHOUSE_TIGER)

clickhouse_target_link_split_lib(clickhouse tiger)

endif ()

图7

 

添加独立target lib:

if (ENABLE_CLICKHOUSE_TIGER)

add_custom_target (clickhouse-tiger ALL COMMAND ${CMAKE_COMMAND} -E create_symlink clickhouse clickhouse-tiger DEPENDS clickhouse)

install (FILES "${CMAKE_CURRENT_BINARY_DIR}/clickhouse-tiger" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT clickhouse)

list(APPEND CLICKHOUSE_BUNDLE clickhouse-tiger)

endif ()

图8

 

 

第二个:./programs/config_tools.h.in

添加cmake变量,会生成main.cpp中对应的宏定义。有宏定义的模块入口将被clickhouse系统加载:

#cmakedefine01 ENABLE_CLICKHOUSE_TIGER

 

图9

 

第三个:./programs/main.cpp


clickhouse的入口所在, 定义新模块入口函数:

#if ENABLE_CLICKHOUSE_TIGER

int mainEntryClickHouseTiger(int argc, char ** argv);

#endif


图10

 

如果满足宏定义,将新模块添加到clickhouse启动系统中,启动时自动判断调用什么入口函数,启动对应的模块:

#if ENABLE_CLICKHOUSE_TIGER

{"tiger", mainEntryClickHouseTiger},

#endif

图11

 

因为clickhouse的Cmake文件很多地方的变量名和模块名相关,所以尽量和clickhouse保持一致的命名风格,不然报错很难找。目录名:小写,和模块名一样

 

第四个:./programs/tiger/Tiger.cpp

添加模块入口函数,由此展开自己的逻辑功能


图12
 

第五个:./programs/tiger/clickhouse-tiger.cpp


入口定义,文件名必须为clickhouse-xxx, xxx表示小写的模块名:

int mainEntryClickHouseTiger(int argc, char ** argv);

int main(int argc_, char ** argv_) { return mainEntryClickHouseTiger(argc_, argv_); }

 


图13

 

第六个:./programs/tiger/CMakeLists.txt

模块的cmake文件,这里定义的源码变量Link变量Include头文件变量 需要添加到图5的配置中才会生效。

set (CLICKHOUSE_TIGER_SOURCES Tiger.cpp)

set (CLICKHOUSE_TIGER_LINK

dbms

)

set(CLICKHOUSE_TIGER_INCLUDE "") ## 需要的时候加

clickhouse_program_add(tiger) ## 添加组件到系统中

 


图14

 

这篇文章在OLAP的公众号上同步发布: https://mp.weixin.qq.com/s/Vvc5ALu5f_MtzfviU6872w

全部评论