在Flink RichMapFunction中没有调用open方法

时间:2017-05-03 18:16:47

标签: java apache-flink

我正在尝试使用apache flink来描述Shortcuts中描述的一个简单示例。但是,我注意到从未调用open方法,因此我在map函数的第一行得到了空指针异常。

public class MyMap extends RichMapFunction<Integer, Integer> {

    private ValueState<Integer> test;

    public void open(Configuration cfg) {
        test = getRuntimeContext().getState(new 
                ValueStateDescriptor<Integer>("myTest", Integer.class));
        System.out.println("1:" + test);
    }


    @Override
    public Integer map(Integer i) throws Exception {
        System.out.println("2:" + test.value()); //test is null here
        test.update(test.value() == null? 1: test.value() + 1);
        System.out.println("3:" + test.value());
        return i;
    }
}

2 个答案:

答案 0 :(得分:0)

更新

您是否尝试@Override打开功能?

第一次

test test.value应该是null。 您处于键控上下文中,这意味着每条消息都有一个flink已经知道的密钥。当您进入有状态运算符时,flink将尝试从配置的状态后端获取该键的值。除非您将ValueStateDescriptor配置为具有默认值(不推荐使用),否则在第一次处理特定键的消息时,状态将为null。因此,您的应用程序应该处理null值。

尝试以下示例(我的java生锈了,这是scala。请问我是否需要帮助转换它):

env.fromElements(("key1", 2),("key2", 4), ("key1", 5))
  .keyBy(_._1)
  .map {
    new RichMapFunction[(String, Int), (String, Int)] {

      lazy val stateTypeInfo: TypeInformation[Int] = implicitly[TypeInformation[Int]]
      lazy val serializer: TypeSerializer[Int] = stateTypeInfo.createSerializer(getRuntimeContext.getExecutionConfig)
      lazy val stateDescriptor = new ValueStateDescriptor[Int]("dummy state", serializer)

      var testVar: ValueState[Int] = _

      override def open(config: Configuration) = {
        testVar = this.getRuntimeContext.getState(stateDescriptor)
      }

      override def map(in: (String, Int)): (String, Int) = {
        println(s"message $in")
        println(s"state ${testVar.value()}")
        println()
        val sum = Option(testVar.value()).getOrElse(0) + in._2
        testVar.update(sum)
        (in._1, sum)
      }
  }
}.print()

env.execute() 

这应该产生:

message (key1,2) (first time key1 is seen)
state null       (state is null)

(key1,2)  (output)
message (key2,4) (first time key2 is seen)
state null       (state is null)

(key2,4)  (output)
message (key1,5) (second time key1 is seen!! We stored something there!)
state 2 (we stored a 2)

(key1,7) (thus output is 2+5=7)

答案 1 :(得分:0)

我有类似的问题。我可以通过替换以下导入来解决问题:

import java.lang.module.Configuration;

与此:

import org.apache.flink.configuration.Configuration;