时间类型(TimeCharacteristic)

刘超 18天前 ⋅ 1024 阅读   编辑

一、介绍

  DataStream支持的三种time,分别是ProcessingTime、IngestionTime、EventTime,区别如下图所示

 

  1、EventTime
  a、事件产生时间,这个时间在进入Flink之前就已经存在。如果要使用EventTime,需从event的某个字段提取,同时也需要配置EventTime最大容忍度Watermarks(水位线)
  b、优势:确定性,即使在面对乱序、延时、或者数据重放等情况,都能给出正确的结果
  c、弱点:处理无序事件时性能和延迟受到影响

  2、IngestTime
  a、事件进入flink的时间,即在source里获取的当前系统的时间,后续操作统一使用该时间。不需要指定watermarks的生成方式(自动生成)
  b、弱点:不能处理无序事件和延迟数据

  3、ProcessingTime
  a、执行操作的机器的当前系统时间(每个算子都不一样),不需要流和机器之间的协调
  b、优势:最佳的性能和最低的延迟
  c、弱点:不确定性 ,容易受到各种因素影像(event产生的速度、到达flink的速度、在算子之间传输速度等),压根就不管顺序和延迟

二、举例

  根据业务选择最合适的时间,Hadoop的日志进入Flink的时间为2018-12-23 17:43:46,666(Ingest Time),在进入window操作时那台机器的系统时间是2018-12-23 17:43:47,120(Processing Time),日志的具体内容是: 

(Event Time)2018-12-23 16:37:15,624 INFO org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider - Failing over to rm2

 要统计每个5min内的日志error个数,哪个时间是最有意义的? 最佳选择就是event time。一般都需要使用event time,除非由于特殊情况只能用另外两种时间来代替。下面来设置time类型

// Flink
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
// 不设置Time类型,默认是processingTime。如果使用EventTime则需要在source之后明确指定Timestamp Assigner & Watermark Generator

 


注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: