入门必备!iotdb 源码debug方法!
想要深入了解一个组件,阅读调试源码是不可或缺的一步!本文是基于乔嘉林大佬早期的博文迈出加入 Apache IoTDB 社区的第一步!(订阅邮件、调试代码拓展而来,因为大佬发文时iotdb版本较低为0.xx版本,而新版本架构及源码都作了很多调整,所以整理了最新版本V1.3.1的源码调试方法,供大家参考。
原创文字,IoTDB 社区可进行使用与传播
本地调试
1.拉取源码:
git clone https://github.com/apache/iotdb.git
2.切换到你所使用的版本
比如你正在使用iotdb最新开源版本v1.3.1,那么就直接切换到tags/v1.3.1,并新建分支,或者在git 命令行执行
git checkout -b my_v1.3.1 v1.3.1
3.编译打包源码
执行
mvn clean package -DskipTests
进行整个源码编译
编译打包后target/generated-sources/会自动标记为项目源码
注: idea某些版本会有bug不会自动标记,此时引用了thrift和antlr 的模块的类都会飘红
这里是idea的bug,可以参考 这篇文章 执行 File –> Invalidate Caches/Restart,或者直接手动标记iotdb-protocol模块以及iotdb-core/antlr模块将generate-sources阶段生成的${project.build.directory}/generated-sources/thrift
和${project.build.directory}/generated-sources/antlr4
目录标记为项目源码,之后就可以运行项目啦。
4.开始调试
a.启动ConfigNode
首先我们以debug模式启动confignode,入口为org.apache.iotdb.confignode.service.ConfigNode#main
然后在org.apache.iotdb.db.protocol.thrift.impl.ClientRPCServiceImpl#executeStatementV2处打上断点
b.启动DataNode
再以debug模式 启动org.apache.iotdb.db.service.DataNode#main
此时会遇到报错
这是因为confignode源码指定了默认Running mode而在datanode源码中未指定默认的Running mode
我们必须显示的传入,所以我们点击 Edit Configuration,传入参数指定Running mode为 -s
然后再次启动即可成功启动
c.启动Cli
最后我们启动客户端org.apache.iotdb.cli.Cli 并执行sql show cluster details
此时会自动跳转到datanode服务进程的 debugger 里我们之前打了断点的org.apache.iotdb.db.protocol.thrift.impl.ClientRPCServiceImpl#executeStatementV2,就可以一点一点查看一个sql的完整执行流程了。_
远程调试
由于平常开发大多在windows或mac环境,部署时使用的一般是linux,个别情况下的兼容问题可能是致命的,且非常难以排查,所以远程DEBUG更能反映出真实业务环境下可能出现的问题,本文以最新版本v1.3.1 iotdb 1c1d单机版为例介绍idea 远程debug 一次sql执行过程的方式。
1. 修改配置文件
首先我们修改common配置文件中查询超时时间
vim $IOTDB_HOME/conf/iotdb-common.properties
# 防止查询超时错误
#query_timeout_threshold=60000
query_timeout_threshold=6000000
然后执行命令修改datanode启动脚本
vim $IOTDB_HOME/sbin/start-datanode.sh
添加变量
REMOTE_DEBUG=" -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5791"
然后在launch_service方法中增加
iotdb_parms="$iotdb_parms ${REMOTE_DEBUG}"
2. 重启iotdb
$IOTDB_HOME/sbin/stop-standalone.sh
$IOTDB_HOME/sbin/start-standalone.sh
3. idea配置远程debug
在idea上设置iotdb所在的host和监听的port以及希望debug的模块(这里我们选择根模块,也可选择单一模块),如下:
然后启动远程debug,就可以开开心心的进行远程debug了_
此时在服务器iotdb客户端命令行中输入执行sql
可以看到也是同样的进入了org.apache.iotdb.db.protocol.thrift.impl.ClientRPCServiceImpl#executeStatementV2
附:iotdb中的一些基础概念
名词 | 类型 | 解释 |
---|---|---|
ConfigNode | 节点角色 | 配置节点,管理集群节点信息、分区信息,监控集群状态、控制负载均衡 |
DataNode | 节点角色 | 数据节点,管理数据、元数据 |
Database | 元数据 | 数据库,不同数据库的数据物理隔离 |
DeviceId | 设备名 | 元数据树中从 root 到倒数第二级的全路径表示一个设备名 |
SeriesSlot | 元数据分区 | 每个 Database 包含多个元数据分区,根据设备名进行分区 |
SchemaRegion | 一组元数据分区 | 多个 SeriesSlot 的集合 |
SchemaRegionGroup | 逻辑概念 | 包含元数据副本数个 SchemaRegion,管理相同的元数据,互为备份 |
DataRegion | 一组数据分区 | IoTDB 以数据分区(DataRegion)为单位对元数据和数据进行管理,从序列和时间两个维度进行数据划分。 |
DataRegionGroup | 逻辑概念 | 包含数据副本数个 DataRegion,管理相同的数据,互为备份 |
希望这篇博文能帮助大家更好地理解 IoTDB 源码调试过程。如有问题,欢迎留言讨论!