一、 ProgressReporter每个流处理进度计算
1、ProgressReporter示例数据及分析
ProgressReporter是每个StreamExecution持有的特性:
abstract class StreamExecution(
xxx )
extends StreamingQuery with ProgressReporter with Logging {
}
在当前批次计算完成并写出到sink后,会调用ProgressReporter的finishTrigger()方法,统计当前批次的运行时长、处理数据量、offset信息等,是监控流处理性能的一个重要类。每个批次统计出来的信息及解析如下(updateProgress()方法会在日志中直接打印):
Streaming query made progress: {
// ProgressReporter定义的id,实现在StreamExecution,可以读取offset/metadata文件的id内容,没有读取到则是创建流的时候生成,可以用于流的恢复
"id" : "98693db5-2285-4d5c-829a-e22b637dc43f",
// 当前流的运行id,流创建的时候,生成的随机uuid
"runId" : "f3b0ad00-b033-42b2-a364-8c4a666e73fd",
// 通过dataStreamWriter.queryName(name)设置的内容,可用于识别流
"name" : "FileSink with nodeIndex:2_6, createTable:",
// 时间戳,为机器时间,不是输入数据json解析出来的时间
"timestamp" : "2018-08-30T06:03:50.000Z",
// 批次号,每运行一个批次,+1
"batchId" : 108654,
// 上个trigger结束到当前trigger开始期间,输入的数据总量,本次设定为10s
"numInputRows" : 310854,
// numInputRows除以10s得到的数据
"inputRowsPerSecond" : 31085.4,
// numInputRows除以triggerExecution得到的速度
"processedRowsPerSecond" : 111817.9856115108,
"durationMs" : {
// 数据写出到sink用时,重要的性能指标
"addBatch" : 2674,
"getBatch" : 2,
"getOffset" : 33,
"queryPlanning" : 38,
"triggerExecution" : 2780,
"walCommit" : 32
},
"eventTime" : {
// watermark设定字段的各项指标
"avg" : "2018-08-24T00:14:32.963Z",
"max" : "2018-08-30T14:03:00.000Z",
"min" : "1970-01-01T00:00:00.000Z",
// 数据中计算出来的水印时间
"watermark" : "2018-08-30T14:02:00.000Z"
},
// stateStore的状态,需要关注聚合数据量和占用的内存,100个最近version,实际每个stateStore所用内存为(memoryUsedBytes/32分区)x100
"stateOperators" : [ {
"numRowsTotal" : 169184,
"numRowsUpdated" : 27670,
"memoryUsedBytes" : 125625783
} ],
// kafka source的开始、结束offset,流与流join则有多个source,当前示例为一个
"sources" : [ {
"description" : "KafkaSource[Subscribe[NginxLogTopic]]",
"startOffset" : {
"NginxLogTopic" : {
"8" : 13674827351,
"2" : 13674826934,
"5" : 13712751413,
"4" : 13674827290,
"7" : 13674832434,
"1" : 13674832486,
"9" : 13674832435,
"3" : 13674832458,
"6" : 23882070074,
"0" : 13674827347
}
},
"endOffset" : {