dump-segment 工具
DumpSegment 工具可用于转储 Apache Druid 段(segment)的元数据或内容,以便进行调试。请注意,该转储并非段的完全高保真转换。特别是,并非所有元数据都包含在内,复杂的指标值也可能不完整。
要运行此工具,请将其指向一个段目录,并提供一个文件用于写入输出内容。
java -classpath "/my/druid/lib/*" -Ddruid.extensions.loadList="[]" org.apache.druid.cli.Main \
tools dump-segment \
--directory /home/druid/path/to/segment/ \
--out /home/druid/output.txt
如果您使用 JDK 17 及以上版本,则需要添加以下附加参数:
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/sun.nio.ch=ALL-UNNAMED
以下是一个示例:
java --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED \
-classpath "/my/druid/lib/*" \
-Ddruid.extensions.loadList="[]" org.apache.druid.cli.Main \
tools dump-segment \
--directory /home/druid/path/to/segment/ \
--out /home/druid/output.txt
输出格式
数据转储
默认情况下,或使用 --dump rows 时,此工具会将段中的行转储为换行符分隔的 JSON 对象,每行一个对象,并使用每列的默认序列化方式。通常会包含所有列,但如果需要,可以使用 --column name 将转储限制为特定列。
例如,一行数据美化后的外观可能如下所示:
{
"__time": 1442018818771,
"added": 36,
"channel": "#en.wikipedia",
"cityName": null,
"comment": "added project",
"count": 1,
"countryIsoCode": null,
"countryName": null,
"deleted": 0,
"delta": 36,
"isAnonymous": "false",
"isMinor": "false",
"isNew": "false",
"isRobot": "false",
"isUnpatrolled": "false",
"iuser": "00001553",
"metroCode": null,
"namespace": "Talk",
"page": "Talk:Oswald Tilghman",
"regionIsoCode": null,
"regionName": null,
"user": "GELongstreet"
}
元数据转储
使用 --dump metadata 时,此工具会转储元数据而不是行数据。此工具生成的元数据转储格式与 SegmentMetadata 查询返回的格式相同。
位图转储
使用 --dump bitmaps 时,此工具会转储位图索引而不是行数据。此工具生成的位图转储仅包含字典编码的字符串列。输出包含一个描述段中所用位图类型的 "bitmapSerdeFactory" 字段,以及一个包含每列每个值的位图的 "bitmaps" 字段。默认情况下,它们以 base64 编码,但您也可以使用 --decompress-bitmaps 将其转储为行号列表。
通常会包含所有列,但如果需要,可以使用 --column name 将转储限制为特定列。
示例输出
{
"bitmapSerdeFactory": {
"type": "roaring"
},
"bitmaps": {
"isRobot": {
"false": "//aExfu+Nv3X...",
"true": "gAl7OoRByQ..."
}
}
}
嵌套列转储
使用 --dump nested,此工具可用于检查 Druid 嵌套列。使用 nested 必须指定且仅指定一个 --column name 参数,并可选择使用 --nested-path $.path.to.field 参数,通过 JSONPath 语法指定特定的嵌套字段。如果未指定 --nested-path,输出将包含嵌套字段及其类型的列表、全局值字典以及 null 行列表。
示例输出
{
"nest": {
"fields": [
{
"path": "$.x",
"types": [
"LONG"
]
},
{
"path": "$.y",
"types": [
"DOUBLE"
]
},
{
"path": "$.z",
"types": [
"STRING"
]
}
],
"dictionaries": {
"strings": [
{
"globalId": 0,
"value": null
},
{
"globalId": 1,
"value": "a"
},
{
"globalId": 2,
"value": "b"
}
],
"longs": [
{
"globalId": 3,
"value": 100
},
{
"globalId": 4,
"value": 200
},
{
"globalId": 5,
"value": 400
}
],
"doubles": [
{
"globalId": 6,
"value": 1.1
},
{
"globalId": 7,
"value": 2.2
},
{
"globalId": 8,
"value": 3.3
}
],
"nullRows": []
}
}
}
如果指定了 --nested-path,输出将包含:嵌套字段的类型、本地值字典(包括“全局”字典 ID 和值)、每个值的未压缩位图索引(包含该值的行号列表),以及列本身的转储(包含行号、嵌套列本身的原始 JSON 形式、该行字段的本地字典 ID,以及该行字段的值)。
示例输出
{
"bitmapSerdeFactory": {
"type": "roaring"
},
"nest": {
"$.x": {
"types": [
"LONG"
],
"dictionary": [
{
"localId": 0,
"globalId": 0,
"value": null,
"rows": [
4
]
},
{
"localId": 1,
"globalId": 3,
"value": "100",
"rows": [
3
]
},
{
"localId": 2,
"globalId": 4,
"value": "200",
"rows": [
0,
2
]
},
{
"localId": 3,
"globalId": 5,
"value": "400",
"rows": [
1
]
}
],
"column": [
{
"row": 0,
"raw": {
"x": 200,
"y": 2.2
},
"fieldId": 2,
"fieldValue": "200"
},
{
"row": 1,
"raw": {
"x": 400,
"y": 1.1,
"z": "a"
},
"fieldId": 3,
"fieldValue": "400"
},
{
"row": 2,
"raw": {
"x": 200,
"z": "b"
},
"fieldId": 2,
"fieldValue": "200"
},
{
"row": 3,
"raw": {
"x": 100,
"y": 1.1,
"z": "a"
},
"fieldId": 1,
"fieldValue": "100"
},
{
"row": 4,
"raw": {
"y": 3.3,
"z": "b"
},
"fieldId": 0,
"fieldValue": null
}
]
}
}
}
命令行参数
| 参数 | 描述 | 是否必需 |
|---|---|---|
| --directory file | 包含段数据的目录。这可以通过解压深度存储中的 "index.zip" 生成。 | 是 |
| --output file | 要写入的文件;如果省略,则写入 stdout。 | 是 |
| --dump TYPE | 转储类型:'rows'(默认)、'metadata'、'bitmaps' 或用于检查嵌套列的 'nested'。 | 否 |
| --column columnName | 要包含的列。指定多次可选择多个列;省略则包含所有列。 | 否 |
| --filter json | JSON 编码的 查询过滤器。省略则包含所有行。仅在转储行数据时使用。 | 否 |
| --time-iso8601 | 以 ISO8601 格式而非 long 格式格式化 __time 列。仅在转储行数据时使用。 | 否 |
| --decompress-bitmaps | 将位图转储为数组,而不是 base64 编码的压缩位图。仅在转储位图时使用。 | 否 |
| --nested-path | 使用 JSONPath 语法指定特定的嵌套列字段。仅在转储嵌套列时使用。 | 否 |