Apache TsFile 常用 CLI 命令与工具详解
梳理 Apache TsFile 2.4.0 构建与运行命令:Maven 生命周期、依赖管理、exec:java 运行、java -cp 直跑、包内类检查与 jshell 常量查询,附 JVM 堆验证与报错定位。
Apache TsFile 常用 CLI 命令与工具详解
一、定位与准备
TsFile 是文件格式库,官方不提供独立 CLI 可执行程序(区别于 IoTDB 的 start-cli.sh)。因此本章沉淀的是「构建 + 运行 + 检查」三类命令:Maven 全生命周期、java 直跑、以及 jar/字节码级别的检查工具。全部命令实测于 tsfile 2.4.0(OpenJDK 17 + Maven 3.6.3/3.9.16)。
前置工程最小集(沿用 Maven 标准布局):
mkdir -p /root/tsfile-demo/src/main/java/demo
cd /root/tsfile-demo
pom.xml 中与本章相关的关键片段(完整 pom 见《Ubuntu 22.04 安装 Apache TsFile 指南》4.2 节,两处一致):
<properties>
<tsfile.version>2.4.0</tsfile.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.tsfile</groupId>
<artifactId>tsfile</artifactId>
<version>${tsfile.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.17</version>
</dependency>
</dependencies>
运行示例主类:demo.WriteDemo(写 4000 行生成 demo.tsfile)与 demo.ReadDemo(元数据遍历 + 时间窗口查询),源码见安装指南 4.3/4.4 节。
二、Maven 命令详解
2.1 生命周期命令
(1)编译:
export MAVEN_OPTS="-Xms256m -Xmx512m"
mvn -q compile
实测退出码 0。-q 只输出错误与警告,日常验证用;去掉 -q 可看到完整插件执行清单。
(2)清理 + 打包:
mvn -q clean package
ls target/*.jar
实测回显:
target/tsfile-demo-1.0.0.jar
注意:clean 会删除整个 target 目录,包括此前 dependency:copy-dependencies 生成的 target/dependency(实测踩坑:clean 之后再用旧依赖目录运行 java 会报 NoClassDefFoundError,需重新执行 copy-dependencies)。
2.2 依赖管理命令
(1)解析并下载全部依赖:
mvn -q dependency:resolve
实测:首次执行从 repo1.maven.org 拉取 tsfile-2.4.0 及 common/zstd-jni/snappy-java/lz4-java/xz/slf4j-api/antlr4-runtime,退出码 0。
(2)打印依赖树:
mvn dependency:tree
实测回显:
com.example:tsfile-demo:jar:1.0.0
+- org.apache.tsfile:tsfile:jar:2.4.0:compile
| +- org.apache.tsfile:common:jar:2.4.0:compile
| +- com.github.luben:zstd-jni:jar:1.5.6-3:compile
| +- org.xerial.snappy:snappy-java:jar:1.1.10.5:compile
| +- at.yawk.lz4:lz4-java:jar:1.10.1:compile
| +- org.tukaani:xz:jar:1.10:compile
| +- org.slf4j:slf4j-api:jar:2.0.17:compile
| \- org.antlr:antlr4-runtime:jar:4.13.2:compile
\- org.slf4j:slf4j-simple:jar:2.0.17:compile
(3)复制运行时依赖到固定目录(配合 java -cp 直跑):
mvn -q dependency:copy-dependencies -DoutputDirectory=target/dependency
ls target/dependency/
实测回显:
antlr4-runtime-4.13.2.jar
common-2.4.0.jar
lz4-java-1.10.1.jar
slf4j-api-2.0.17.jar
slf4j-simple-2.0.17.jar
snappy-java-1.1.10.5.jar
tsfile-2.4.0.jar
xz-1.10.jar
zstd-jni-1.5.6-3.jar
(4)不改 pom 临时切换版本(多版本排查利器,实测通过):
mvn -q dependency:resolve -Dtsfile.version=1.1.4
实测退出码 0,~/.m2/repository/org/apache/tsfile/tsfile/1.1.4/ 出现对应 jar。
2.3 运行命令 exec:java
export MAVEN_OPTS="-Xms256m -Xmx512m -Dfile.encoding=UTF-8"
mvn -q compile exec:java -Dexec.mainClass=demo.WriteDemo
实测回显:
写入完成: /root/tsfile-demo/demo.tsfile 大小=9984 字节, 耗时=125ms
要点:
- exec:java 在 Maven 自身 JVM 内执行业务代码,因此堆由
MAVEN_OPTS控制(256–512 MB 档位验证方式见第五章)。 - 中文乱码时给 MAVEN_OPTS 追加
-Dfile.encoding=UTF-8(实测 Maven 默认继承平台字符集导致乱码)。 - 常用参数:
-Dexec.mainClass=完整类名;-Dexec.cleanupDaemonThreads=false可关闭退出时的线程清理提示。
2.4 其他高频参数
| 参数 | 作用 | 实测场景 |
|---|---|---|
| -q | 静默模式,仅错误输出 | 日常编译验证 |
| -e | 打印异常栈 | 依赖冲突排查 |
| -DskipTests | 跳过测试 | package 加速(本工程无测试用例) |
| -Dtsfile.version=1.1.4 | 覆盖 pom 属性 | 多版本切换验证 |
三、java 直跑方式
3.1 目录式 classpath(开发期)
java -Dfile.encoding=UTF-8 -cp 'target/classes:target/dependency/*' demo.ReadDemo
实测回显(节选):
root.demo.device1 -> temperature : FLOAT
root.demo.device1 -> humidity : DOUBLE
root.demo.device1 -> status : TEXT
== 查询结果(root.demo.device1 temperature/humidity, 3 秒窗口) ==
1700000000000 | FLOAT:20.0 | DOUBLE:45.0
共命中 3 行(本次仅展示 3 行)
3.2 打包 jar 直跑(交付期)
mvn -q dependency:copy-dependencies -DoutputDirectory=target/dependency
java -Dfile.encoding=UTF-8 -cp 'target/tsfile-demo-1.0.0.jar:target/dependency/*' demo.ReadDemo
实测查询结果与 3.1 一致。默认打包不含 Main-Class 清单,java -jar 不可用;如需 -jar 形式,可在 pom 中加入 maven-shade-plugin 并设置 mainClass(属工程侧扩展)。
3.3 classpath 通配符必须加引号(实测坑)
错误写法(实测报错):
Error: Unable to initialize main class demo.ReadDemo
Caused by: java.lang.NoClassDefFoundError: org/apache/tsfile/read/filter/basic/Filter
原因:-cp a.jar:dir/* 不加引号时,shell 会把 dir/* 展开成多个空格分隔的词,java 只收到第一个词,classpath 被截断。正确写法是把整段 classpath 用单引号包住,交由 JVM 自行展开通配符。
3.4 打包后运行的堆参数
直跑场景堆在命令行指定:
java -Xms256m -Xmx512m -cp 'target/tsfile-demo-1.0.0.jar:target/dependency/*' demo.WriteDemo
验证方式见第五章。
四、文件与包内检查工具
4.1 od 验证文件魔数
TsFile 文件首尾各有一段 TsFile 魔数(首部后跟版本字节,尾部前有 4 字节尾部长度):
head -c 10 demo.tsfile | od -c | head -2
tail -c 10 demo.tsfile | od -c
实测回显:
0000000 T s F i l e 004 \0 002 022
0000000 \0 \0 \0 302 T s F i l e
4.2 jar tf 检查类是否在包内
JAR=~/.m2/repository/org/apache/tsfile/tsfile/2.4.0/tsfile-2.4.0.jar
jar tf $JAR | grep -E 'TsFileWriter|TsFileSequenceReader|Tablet.class'
实测回显:
org/apache/tsfile/read/TsFileSequenceReader.class
org/apache/tsfile/write/TsFileWriter.class
org/apache/tsfile/write/record/Tablet.class
排查 NoClassDefFoundError 时,先用该命令确认类所在 jar,再核对 classpath。
4.3 javap 查看 API 签名
javap -cp $JAR org.apache.tsfile.write.TsFileWriter | head -8
实测回显:
public class org.apache.tsfile.write.TsFileWriter implements java.lang.AutoCloseable {
public org.apache.tsfile.write.TsFileWriter(java.io.File) throws java.io.IOException;
public org.apache.tsfile.write.TsFileWriter(java.io.File, org.apache.tsfile.encrypt.EncryptParameter) throws java.io.IOException;
public org.apache.tsfile.write.TsFileWriter(java.io.File, org.apache.tsfile.write.schema.Schema) throws java.io.IOException;
public org.apache.tsfile.write.TsFileWriter(java.io.File, org.apache.tsfile.write.schema.Schema, org.apache.tsfile.common.conf.TSFileConfig) throws java.io.IOException;
需要私有字段/全部成员时加 -p。升级版本前后对比签名是快速发现 API 变化的办法(如 2.4.0 的 Tablet.setRowSize)。
4.4 jshell 查询常量
不写工程直接查包内常量:
echo 'System.out.println(org.apache.tsfile.common.conf.TSFileConfig.CONFIG_FILE_NAME);' \
| jshell --class-path $JAR -s -
实测回显:
iotdb-system.properties
同法实测其他常量:MIN_BLOOM_FILTER_ERROR_RATE=0.01、MAX_BLOOM_FILTER_ERROR_RATE=0.1、RLE_MAX_REPEATED_NUM=32767、RLE_MAX_BIT_PACKED_NUM=63。
4.5 strings 提取配置键
cd /tmp && mkdir -p jarx && cd jarx
jar xf $JAR org/apache/tsfile/common/conf/TSFileDescriptor.class
strings org/apache/tsfile/common/conf/TSFileDescriptor.class | grep -E '^[a-z][a-z0-9_.]+$' | sort -u
实测可得 2.4.0 从 iotdb-system.properties 读取的全部键(page_size_in_byte、group_size_in_byte、compressor、float_precision、batch_size、lz4_use_jni、encrypt_type 等),是编写配置文件时最可靠的键名依据。
五、JVM 堆验证
标准动作三件套(程序运行期间在另一会话执行):
(1)ps 回显(Ubuntu 22.04 + Maven 3.6.3 实测):
ps -ef | grep [j]ava
root 7582 1 33 12:11 ? 00:00:04 /usr/bin/java -Xms256m -Xmx512m -classpath /usr/share/maven/boot/plexus-classworlds-2.x.jar ... org.codehaus.plexus.classworlds.launcher.Launcher -q exec:java -Dexec.mainClass=demo.HeapHolder
(2)jps -v 回显:
7582 Launcher -Xms256m -Xmx512m -Dclassworlds.conf=/usr/share/maven/bin/m2.conf ...
(3)程序内断言(主类第一行打印后驻留):
maxMemory=512MB
CentOS 8 + Maven 3.9.16 环境的 ps 回显略有差异(多一个 JDK 17 原生访问开关参数),堆参数同样可见:
root 1625 1 31 12:32 ? 00:00:04 /usr/lib/jvm/java-17-openjdk/bin/java --enable-native-access=ALL-UNNAMED -Xms256m -Xmx512m ...
六、常见问题
Q1:mvn clean package 后 java -cp ... dependency/* 直跑报 NoClassDefFoundError?
A:clean 清掉了 target/dependency。重新执行 mvn dependency:copy-dependencies -DoutputDirectory=target/dependency 后再运行(实测复现)。
Q2:java -jar 提示 target/tsfile-demo-1.0.0.jar 中没有主清单属性?
A:默认 jar 不含 Main-Class。用 -cp 'app.jar:dependency/*' 主类名 直跑,或工程内引入 maven-shade-plugin 指定 mainClass 后再打包。
Q3:exec:java 输出中文乱码?
A:export MAVEN_OPTS="... -Dfile.encoding=UTF-8" 后重跑。
Q4:如何不写代码确认某配置键是否被 2.4.0 支持?
A:按 4.5 节 strings 提取 TSFileDescriptor 字节码键清单;不在清单中的字段(如 bloomFilterErrorRate)只能走代码 setter。
Q5:官方有没有 TsFile 专用 CLI 工具?
A:没有。tsfile 包内也未内置可执行 main 类(实测 jar tf 检索无 Main/Tools 入口),命令行形态就是「Maven 构建 + java 直跑 + jar/javap/jshell 检查」的组合。
七、参考链接
- TsFile 官网:https://tsfile.apache.org/
- TsFile GitHub 仓库:https://github.com/apache/tsfile
- Maven Central:https://central.sonatype.com/artifact/org.apache.tsfile/tsfile
- Apache Maven 官方文档:https://maven.apache.org/guides/
- IoTDB 官方文档(Java 原生 SDK):https://iotdb.apache.org/zh/UserGuide/latest/API/Programming-Java-Native-SDK.html