Java 8 在Flink作业之间传递参数

Java 8 在Flink作业之间传递参数,java-8,parameter-passing,apache-flink,flink-streaming,Java 8,Parameter Passing,Apache Flink,Flink Streaming,我有一个任务,从Cassandra读取数据并将数据存储为列表(下面附加的filloncegencesfromdb()方法),然后创建StreamExecutionEnvironment并使用Kafka队列中的数据 在数据流转换期间,我尝试引用最近填充的静态ArrayList,但它是空的 将以前填写的清单传递到下一份工作的最佳做法是什么? 任何想法都将不胜感激 private static ArrayList<GeoFences> allGeoFences = new ArrayLi

我有一个任务,从Cassandra读取数据并将数据存储为列表(下面附加的filloncegencesfromdb()方法),然后创建StreamExecutionEnvironment并使用Kafka队列中的数据

在数据流转换期间,我尝试引用最近填充的静态ArrayList,但它是空的

将以前填写的清单传递到下一份工作的最佳做法是什么? 任何想法都将不胜感激

private  static ArrayList<GeoFences> allGeoFences = new ArrayList<>();

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        env.enableCheckpointing(5000); // checkpoint every 5000 msecs
        env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

        Properties kafkaProps = new Properties();
        kafkaProps.setProperty("zookeeper.connect", LOCAL_ZOOKEEPER_HOST);
        kafkaProps.setProperty("bootstrap.servers", LOCAL_KAFKA_BROKER);
        kafkaProps.setProperty("group.id", KAFKA_GROUP);
        kafkaProps.setProperty("auto.offset.reset", "earliest");

        fillOnceGeoFencesFromDB();   // populate data in ArrayList<GeoFences> allGeoFences

        DataStream <Tuple6<UUID, String, String, String, String, Timestamp>> stream_parsed_with_timestamps = env
                .addSource(new FlinkKafkaConsumer010<>(KAFKA_SUBSCRIBE_TOPIC, new SimpleStringSchema(), kafkaProps))
                .rebalance().map(new MapFunction<String, Tuple4<UUID, String, String, Timestamp>>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public Tuple4<UUID, String, String, Timestamp> map(String value) throws Exception {
                        return mapToTuple4(value);
                    }})
private static ArrayList allgeofines=new ArrayList();
公共静态void main(字符串[]args)引发异常{
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
环境(一);
环境启用检查点(5000);//每5000毫秒检查一次
环境setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
属性Kafkapprops=新属性();
Kafkapprops.setProperty(“zookeeper.connect”,本地\ zookeeper \主机);
setProperty(“bootstrap.servers”,本地卡夫卡代理);
kafkaProps.setProperty(“group.id”,KAFKA_group);
Kafkapprops.setProperty(“auto.offset.reset”、“最早”);
filloncegencesfromdb();//在ArrayList allGeoFences中填充数据
使用时间戳=env解析的数据流流
.addSource(新的FlinkKafkaConsumer010(KAFKA_SUBSCRIBE_主题,新的SimpleStringSchema(),kafkaProps))
.rebalance().map(新的映射函数(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共Tuple4映射(字符串值)引发异常{
返回mapToTuple4(值);
}})
。 . . . .
.

请记住,map函数中发生的任何事情都将发生在任务管理器上,而main中的所有代码仅用于定义作业

将参数显式传递给MapFunction(这将使代码更易于阅读)

私有静态类GeoFenceMapper实现映射函数{
私人ArrayList Allgeofenses;
公共GeoFenceMapper(ArrayList allGeoFences){
this.allgeofens=allgeofens;
}
@凌驾
公共Tuple4映射(字符串值)引发异常{
返回mapToTuple4(值);
}})   
}
然后使用此新映射器:

DataStream <Tuple6<UUID, String, String, String, String, Timestamp>> stream_parsed_with_timestamps = env
                .addSource(new FlinkKafkaConsumer010<>(KAFKA_SUBSCRIBE_TOPIC, new SimpleStringSchema(), kafkaProps))
                .rebalance().map(new GeoFenceMapper(fillOnceGeoFencesFromDB())) 
DataStream\u已解析,\u时间戳=env
.addSource(新的FlinkKafkaConsumer010(KAFKA_SUBSCRIBE_主题,新的SimpleStringSchema(),kafkaProps))
.rebalance().map(新的GeoFenceMapper(FillOnceGenesFromDB()))
希望这有帮助

DataStream <Tuple6<UUID, String, String, String, String, Timestamp>> stream_parsed_with_timestamps = env
                .addSource(new FlinkKafkaConsumer010<>(KAFKA_SUBSCRIBE_TOPIC, new SimpleStringSchema(), kafkaProps))
                .rebalance().map(new GeoFenceMapper(fillOnceGeoFencesFromDB()))