Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flink 在Flink流媒体中如何在进程级别缓存局部变量?_Apache Flink_Flink Streaming - Fatal编程技术网

Apache flink 在Flink流媒体中如何在进程级别缓存局部变量?

Apache flink 在Flink流媒体中如何在进程级别缓存局部变量?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,在Flink任务实例中,当事件发生时,我需要访问远程web服务来获取一些数据,但是我不想每次事件发生时都访问远程web服务,所以我需要将数据缓存在本地内存中,并且可以被进程的所有任务访问,如何做到?在类级别将数据存储在静态私有变量中 例如下面的示例,如果将局部变量localCache设置为class Splitter,它将在操作符级别而不是进程级别进行缓存 公共类WindowWordCount{ 公共静态void main(字符串[]args)引发异常{ StreamExecutionEnvir

在Flink任务实例中,当事件发生时,我需要访问远程web服务来获取一些数据,但是我不想每次事件发生时都访问远程web服务,所以我需要将数据缓存在本地内存中,并且可以被进程的所有任务访问,如何做到?在类级别将数据存储在静态私有变量中

例如下面的示例,如果将局部变量localCache设置为class Splitter,它将在操作符级别而不是进程级别进行缓存

公共类WindowWordCount{
公共静态void main(字符串[]args)引发异常{
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
DataStream DataStream=env
.socketTextStream(“localhost”,9999)
.flatMap(新拆分器())
.keyBy(0)
.时间窗口(时间.秒(5))
.总数(1);
dataStream.print();
环境执行(“窗口字数”);
}
公共静态类拆分器实现FlatMapFunction{
***私有对象本地缓存***
@凌驾
公共void flatMap(字符串语句,收集器输出)引发异常{
for(字符串字:句子。拆分(“”){
out.collect(新的Tuple2(word,1));
}
}
}
}

就像你说的那样。您可以在
RichFlatMapFunction
中使用静态变量,并在
open
中初始化它<在输入任何记录之前,将对每个TaskManager调用代码>打开
。请注意,为每个不同的插槽创建一个拆分器实例,因此在大多数情况下,一个TaskManager上有多个拆分器实例。因此,您需要防止双重创建

public static class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
    private transient Object localCache;


    @Override
    public void open(Configuration parameters) throws Exception {
        if (localCache == null)
            localCache = ... ;
    }

    @Override
    public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception {
        for (String word: sentence.split(" ")) {
            out.collect(new Tuple2<String, Integer>(word, 1));
        }
    }
}
公共静态类拆分器实现FlatMapFunction{
私有瞬态对象本地缓存;
@凌驾
公共void open(配置参数)引发异常{
if(localCache==null)
localCache=;
}
@凌驾
公共void flatMap(字符串语句,收集器输出)引发异常{
for(字符串字:句子。拆分(“”){
out.collect(新的Tuple2(word,1));
}
}
}

就像你说的那样。您可以在
RichFlatMapFunction
中使用静态变量,并在
open
中初始化它<在输入任何记录之前,将对每个TaskManager调用代码>打开
。请注意,为每个不同的插槽创建一个拆分器实例,因此在大多数情况下,一个TaskManager上有多个拆分器实例。因此,您需要防止双重创建

public static class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
    private transient Object localCache;


    @Override
    public void open(Configuration parameters) throws Exception {
        if (localCache == null)
            localCache = ... ;
    }

    @Override
    public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception {
        for (String word: sentence.split(" ")) {
            out.collect(new Tuple2<String, Integer>(word, 1));
        }
    }
}
公共静态类拆分器实现FlatMapFunction{
私有瞬态对象本地缓存;
@凌驾
公共void open(配置参数)引发异常{
if(localCache==null)
localCache=;
}
@凌驾
公共void flatMap(字符串语句,收集器输出)引发异常{
for(字符串字:句子。拆分(“”){
out.collect(新的Tuple2(word,1));
}
}
}

一种可伸缩的方法可能使用源操作符实际执行对web服务的调用,然后将结果写入流。然后,您可以将该流作为广播流访问给您的运营商,从而将发送到广播流的一个对象(web调用结果)发送给接收运营商的每个实例。这将在集群中的所有机器和JVM上共享单个web调用的结果。随着集群的扩展,您还可以保持广播状态并与运营商的新实例共享。

可扩展的方法可能使用源运营商实际执行对web服务的调用,然后将结果写入流。然后,您可以将该流作为广播流访问给您的运营商,从而将发送到广播流的一个对象(web调用结果)发送给接收运营商的每个实例。这将在集群中的所有机器和JVM上共享单个web调用的结果。随着集群的扩展,您还可以保持广播状态并与运营商的新实例共享