Flink带有状态的转换操作

本篇是对一篇Flink文章的翻译:https://training.ververica.com/lessons/stateful.html
实现一个场景:我们需要输出每个传感器的每个采集值(数值),但是传感器的数据波动很大,如何对数据处理,使其波动没有那么大。这就需要当前的采集值需要联系之前的采集值,换而言之,就需要知道当前传感器的状态。

为什么Flink需要管理状态

flink在状态管理上提供了一些引人瞩目的的特性:

  1. local:Flink state可以被保存在本地机器中,可以以内存的速度访问
  2. durable:Flink state 可以自动被存储下来
  3. vertically scalable(垂直扩展):state可以被存在数据库中,通过增加存储来扩展
  4. horizontally scalable(水平扩展):当集群数目增大,state可以重新分配
  5. queryble:state可以通过rest api查询的

Rich Function

这点我们已经看过许多这样的函数式接口,包括FilterFunction, MapFunction, and FlatMapFunction. 这些都是单一抽象方法模式。
每个接口,Flink都提供了rich 模式,rich接口包含其他的方法,包括:

  • open():operator初始化时调用一次。这可以用来加载静态data,或者打开链接。
  • close():释放资源
  • getRuntimeContext()提供对一切潜在感兴趣的东西的访问,最重要的是你可以创造和获取state

一个keyed state的例子

这个例子,我们有一个传感器数据流<String,double>,指的是传感器id,和读的数据。我们的目标是将传来的数据平滑处理。通过Smoother(下面的类)

为了完成这个,我们的smoother需要记录最近的传感器数据,这可以通过Flink keyed state接口实现。

当你处理类似的键流,flink将会维持一个key -value的存储,来管理每个事件的state。

Flink支持多种类型的键状态,这个例子我们来讨论最简单的,叫做ValueState。这意味着,Flink会为每个key保持一个对象。本例子中,称为MovingAverage。因为一些性能上的原因,FLink也有支持特殊类型的State,包括ListState和MapState。

我们的Smoother有两个方法:open(),map()。在open中,我们通过ValueStateDescriptor创建了我们需要的state。这个方法的参数包含名字,而且提供了序列化需要的信息(MovingAverage.class)。

public static class Smoother extends RichMapFunction<Tuple2<String, Double>, Tuple2<String, Double>> {
  private ValueState<MovingAverage> averageState;

  @Override
  public void open (Configuration conf) {
    ValueStateDescriptor<MovingAverage> descriptor =
      new ValueStateDescriptor<>("moving average", MovingAverage.class);
    averageState = getRuntimeContext().getState(descriptor);
  }

  @Override
  public Tuple2<String, Double> map (Tuple2<String, Double> item) throws Exception {
    // access the state for this key
    MovingAverage average = averageState.value();

    // create a new MovingAverage (with window size 2) if none exists for this key
    if (average == null) average = new MovingAverage(2);

    // add this event to the moving average
    average.add(item.f1);
    averageState.update(average);

    // return the smoothed result
    return new Tuple2(item.f0, average.getAverage());
  }
}

这个map方法会用来让每个事件值更加平滑。每个事件都会调用一次map,当然这个事件是与一个特定的key相关(一个传感器),valueState保存了某个传感器(key)的之前事件的信息,我们可以将本次事件的值与之前事件的传感器值联系起来,去一个更加平滑的值。可以通过取平均值。

Clearing State
这里有一个潜在的问题,如果传感器的key是无穷的,那么Flink需要为每一个传感器保存一个状态值(MovingState)。所以将一些结束,不再会用到的key清除掉。像:

averageState.clear()

在key没有用到的一段时间后,我们就可以这样做。我们将会看到如何用Timer做这个,这要等到学了ProcessFunction后。(之后会更新)

本篇分析了Keyed Stream State,还有Non-keyed State ,通常叫做operator state,这个实现有些特殊,但是不常用。

Further Reading


因为喜欢,所以坚持

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容