【翻译】Flink Table Api & SQL —Streaming 概念 —— 查询配置

本文翻译自官网:Query Configuration  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/streaming/query_configuration.html

表API和SQL查询具有相同的语义,无论其输入是有界批处理输入还是无界流输入。在许多情况下,对流输入的连续查询能够计算与脱机计算的结果相同的准确结果。 但是,这在一般情况下是不可能的,因为连续查询必须限制它们所维护的状态的大小,以避免存储空间用完并能够长时间处理无限制的流数据。 结果,根据输入数据和查询本身的特征,连续查询可能只能提供近似结果。

Flink的Table API和SQL界面提供了用于调整连续查询的准确性和资源消耗的参数。 通过QueryConfig对象指定参数。 QueryConfig可以从TableEnvironment获取,并在转换表时(即,将其转换为DataStream或通过TableSink发出时)传入。

val env = StreamExecutionEnvironment.getExecutionEnvironment
val tableEnv = StreamTableEnvironment.create(env)

// obtain query configuration from TableEnvironment
val qConfig: StreamQueryConfig = tableEnv.queryConfig
// set query parameters
qConfig.withIdleStateRetentionTime(Time.hours(12), Time.hours(24))

// define query
val result: Table = ???

// create TableSink
val sink: TableSink[Row] = ???

// register TableSink
tableEnv.registerTableSink(
  "outputTable",                  // table name
  Array[String](...),             // field names
  Array[TypeInformation[_]](...), // field types
  sink)                           // table sink

// emit result Table via a TableSink
result.insertInto("outputTable", qConfig)

// convert result Table into a DataStream[Row]
val stream: DataStream[Row] = result.toAppendStream[Row](qConfig)

在下文中,我们描述的参数QueryConfig以及它们如何影响查询的准确性和资源消耗。 

空闲状态保留时间

许多查询在一个或多个关键属性上聚合或 join 记录。 在流上执行这种查询时,连续查询需要收集记录或维护每个键的部分结果。 如果输入流的密钥域正在发展,即,活动密钥值随时间而变化,则随着观察到越来越多的不同密钥,连续查询将累积越来越多的状态。 但是,一段时间后,密钥通常变得不活动,并且它们的相应状态变得陈旧且无用。

例如,以下查询计算每个会话的点击次数。

SELECT sessionId, COUNT(*) FROM clicks GROUP BY sessionId;

sessionId属性用作分组键,连续查询会为其观察到的每个sessionId保持计数。 sessionId属性会随着时间的推移而发展,并且sessionId值仅在会话结束之前(即一段有限的时间段内)才有效。 但是,连续查询无法了解sessionId的此属性,并且期望每个sessionId值都可以在任何时间出现。 它为每个观察到的sessionId值维护一个计数。 因此,随着观察到越来越多的sessionId值,查询的总状态大小不断增长。

空闲状态保留时间参数定义密钥状态保留多长时间而不被更新,然后再将其删除。 对于上一个示例查询,sessionId的计数将在配置的时间段内未更新时立即删除。

通过删除键的状态,连续查询完全忘记了它之前已经看过该键。 如果处理了带有键的记录(其状态之前已被删除),则该记录将被视为具有相应键的第一条记录。 对于上面的示例,这意味着sessionId的计数将再次从0开始。

有两个参数可配置空闲状态保留时间:

  • 最小空闲状态保留时间定义了非活动密钥的状态至少要保留多长时间才能被删除。
  • 最大空闲状态保留时间定义非活动密钥的状态在被移除之前最多保持多长时间。

参数说明如下:

val qConfig: StreamQueryConfig = ???

// set idle state retention time: min = 12 hours, max = 24 hours
qConfig.withIdleStateRetentionTime(Time.hours(12), Time.hours(24))

清理状态需要额外的状态,这对于minTime和maxTime的差异越大变得越便宜。 minTime和maxTime之间的差异必须至少为5分钟。

 

欢迎关注Flink菜鸟公众号,会不定期更新Flink(开发技术)相关的推文

猜你喜欢

转载自www.cnblogs.com/Springmoon-venn/p/11877594.html