背景
有需求了解一下Opentsdb的源码,然后想着能在本地run起来,打些断点和日志来跟一下,然后兴致勃勃去网上找了资料看看能否快速run起来,但是发现所有的博客、文档啥的好像都来自同一出处,而且最后run起来也是很模糊,按教程我还是没成功。于是自己摸索着,慢慢解决问题run了起来,然后记录一下,希望对想要学习opentsdb的同学有帮助。转载的话麻烦注明出处~
1. 拉代码
首先fork一下opentsdb的源码库
拉取opentsdb
git clone https://github.com/whua3/opentsdb.git
切换分支
git checkout v2.4.0
创建自己的开发分支
git checkout -b dev/240
2. 本地编译
如果仅仅是本地编译源码,还是比较简单的,按如下步骤就行
mkdir build cp -r third_party ./build ./build.sh
发现在maven中央仓库下载jar包失败了,换一下maven仓库地址。将Makefile.in中的 http://central.maven.org 和 http://repo1.maven.org 全部替换为 https://repo1.maven.org
然后重新./build.sh
编译完成,同时在build目录下可以看到生成的tsdb-2.4.0.jar包
3. 本地IDE运行Opentsdb
然后是把opentsdb源码,在本地IDE中运行起来,这个比较麻烦。
opentsdb这个不是个标准的maven项目,首先我们来生成pom文件
sh build.sh pom.xml
然后我们发现有生成pom.xml文件和src-main,src-test两个目录,其中src-main和src-test是src中文件的软链接,
打包
mvn clean package -Dmaven.test.skip=true -P hbase
发现会报两错
Caused by: org.apache.maven.plugin.MojoExecutionException: Command execution failed Caused by: org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)
注释掉pom.xml 里面的这两个execution
- create-plugin-test-jar
- attach-javadocs
重新打包
mvn clean package -Dmaven.test.skip=true -P hbase
打包成功,发现生成了一个target目录
然后我们要把target目录中生成的, target/generated-sources/net/opentsdb/query/expression/parser目录复制到 src-main/net/opentsdb/query/expression目录下, 把target/generated-sources/net/opentsdb/tools/BuildData.java 复制到src-main/net/opentsdb/tools 目录下。
接下来我们尝试在本地idea中起一下,首先将pom.xml.in挪到项目外去,如果新生成的pom.xml没有被识别,鼠标选中pom.xml,然后右键选择”add as maven project“,然后reload maven project
然后新增一个application configuration
然后直接运行,报错 java: duplicate class: tsd.client.QueryString
我们搜索一下这个类,发现src-main/tsd/client 和 src-main/net/opentsdb/tsd/client这里重复了
因为src-main/tsd/client这个是src的软链接,我们可以把src-main/tsd/client这个目录excluded掉
再次运行发现,TSDMain已经成功运行起来了,只是缺少opentsdb的配置文件。
我们此时在TSDMain的main方法中新增一条测试日志,打上断点,然后debug模式运行,可以看到成功停在了断点处,测试日志也打印出来了。
然后加上配置,让opentsdb在本地run起来,在configuration的program arguments中加上配置
--config=/Users/garyhwang/Documents/projects/IdeaProjects/opentsdb/src/opentsdb.conf
其中配置文件需要改3处
tsd.network.port = 4242 tsd.http.staticroot = /Users/garyhwang/Documents/localTestDir/opentsdb/static/ tsd.http.cachedir = /Users/garyhwang/Documents/localTestDir/opentsdb/cache/
另外在配置中我还加了几个配置,具体配置的作用可以参考opentsdb官网文档
tsd.core.autocreate_metrics = true tsd.query.skip_unresolved_tagvs = true tsd.query.timeout = 10000 tsd.storage.enable_compaction = false tsd.core.tag.allow_specialchars =!@#$%^&*() {}|: <>?~`-=[];',./"
然后再次启动,发现还是失败,可以看到是连接本地2181端口失败了,这里是因为本地没有起Zookeeper和HBase,因为Opentsdb底层就是要依赖存储的(一般为HBase),所以要想在本地run起opentsdb,首先需要在本地run起HBase和Zookeeper(HBase会内置)。
于是我们先去在本地把HBase 的HMaster run起来,具体怎么run起HBase不在本文中介绍了,或者后面有时间再写点东西记录下。
然后我们再次运行opentsdb,这次失败是报错少了tsdb表,我们还需要再HBase中把Opentsdb需要的几张表创建出来。
我们可以看到src目录下有个create_table.sh,如果是在服务器上,直接运行这个脚本就可以在HBase中将四张对应的表创建出来,在本地的话,我是启动了一个hbase-shell,然后将建表命令手动复制进去的。
代码语言:txt复制create 'tsdb-uid', {NAME => 'id', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}, {NAME => 'name', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
create 'tsdb', {NAME => 't', VERSIONS => 1, BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF', TTL => '604800'}
create 'tsdb-tree', {NAME => 't', VERSIONS => 1, BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
create 'tsdb-meta', {NAME => 'name', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
其中tsdb表(存数据的表)设置的TTL为604800(7天)
再次运行opentsdb,发现在本地成功启动,4242端口成功监听。
然后我们来测试一下opentsdb的读写功能
代码语言:txt复制curl -i -X POST -d '{
"metric":"gary-test",
"timestamp":1624091745,
"value":0.85,
"tags":{
"host":"127.0.0.1"
}
}' http://localhost:4242/api/put?details
curl -d '{
"start": "30m-ago",
"queries": [
{
"aggregator": "none",
"downsample": "30s-last",
"metric": "gary-test",
"tags": {
"host":"127.0.0.1"
}
}
]
}' http://localhost:4242/api/query
可以看到opentsdb写入数据和读取数据都成功了~
4. 结束
至此,在搭建Opentsdb本地开发环境正式结束,愿各位有有需求的同学都能run起来~
有需要的同学也可以拉我仓库的这个代码,是我在文中改过的,能方便各位更快run起来~
https://github.com/whua3/opentsdb/tree/local-run
最后:
转载的话麻烦注明出处~