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