Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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 beam 如何使用ApacheBeam合并两个流并对合并的流执行有状态操作_Apache Beam - Fatal编程技术网

Apache beam 如何使用ApacheBeam合并两个流并对合并的流执行有状态操作

Apache beam 如何使用ApacheBeam合并两个流并对合并的流执行有状态操作,apache-beam,Apache Beam,我有两个卡夫卡流,我想通过一些键合并,在合并的流之上,我想执行有状态操作,这样我就可以将两个流的计数相加 这是我试过的,但没用 PCollection stream1=。。读卡夫卡 PCollection stream2=。。读卡夫卡 PCollection wonrdCount1=stream1.apply(…) PCollection wonrdCount2=stream2.apply(…) PCollection merged=使用CoGroupByKey合并wordcount1和wor

我有两个卡夫卡流,我想通过一些键合并,在合并的流之上,我想执行有状态操作,这样我就可以将两个流的计数相加

这是我试过的,但没用


PCollection stream1=。。读卡夫卡
PCollection stream2=。。读卡夫卡
PCollection wonrdCount1=stream1.apply(…)
PCollection wonrdCount2=stream2.apply(…)
PCollection merged=使用CoGroupByKey合并wordcount1和wordcount2
PCollection finalStream=mergred.apply(…)
对于
finalstream
apply state

公共类KafkaWordCount实现可序列化{
私有字符串kafkaBrokers=null;
私有字符串主题=null;
公共KafkaWordCount(字符串代理,字符串主题){
这个。卡夫卡布洛克=经纪人;
this.topic=主题;
}
公共PCollection构建(管道p){
最后一个字符串myState=“HELLO”;
PCollection res=
p、 apply(KafkaIO.read()
.使用bootstrapserver(此为.kafkaBrokers)
.withTopic(this.topic)
.withKeyDeserializer(LongDeserializer.class)
.withValueDeserializer(StringDeserializer.class))
.适用(新DoFn()的第{
@过程元素
public void processElement(ProcessContext ProcessContext){
KafkaRecord记录=processContext.element();
processContext.output(record.getKV().getValue());
}
}))
.apply(“提取单词”,
(新DoFn()的副部长{
@过程元素
公共void processElement(ProcessContext c){
for(字符串字:c.element().split([^\\p{L}]+”){
如果(!word.isEmpty()){
c、 输出(字,1L)千伏;
}
}
}
}));
返回res;
}
}
公共类数据管道{
公共静态void main(字符串[]args){
最后一个字符串stateId=“myMapState”;
最后一个字符串myState=“myState”;
PipelineOptions=PipelineOptionsFactory.create();
options.as(FlinkPipelineOptions.class).setRunner(FlinkRunner.class);
Pipeline p=Pipeline.create(选项);
PCollection stream1=
新KafkaWordCount(“本地主机:9092”,“idm”)
.建造(p)
.申请(
窗
.进入(
固定窗口数(持续时间毫秒(3600000)))
.触发(
重复。永久(AfterPane.ElementCount至少(1)))
.允许延迟(持续时间为零)
.丢弃火锅());
P收集流2=
新卡夫卡沃德计数(“本地主机:9092”,“协助”)
.建造(p)
.申请(
窗
.进入(
固定窗口数(持续时间毫秒(3600000)))
.触发(
重复。永久(AfterPane.ElementCount至少(1)))
.允许延迟(持续时间为零)
.丢弃火锅());
final TupleTag web=new TupleTag();
最终TupleTag assist=新TupleTag();
PCollection联合流=
KeyedPCollectionTuple.of(web,stream1)
.及(协助,2)
.apply(CoGroupByKey.create());
PCollection finalCountStream=
联合流
.适用(
新DoFn(){
@StateId(StateId)
私有最终状态规范mapState=
StateSpecs.map();
@过程元素
公共无效处理元素(
ProcessContext ProcessContext,
@StateId(StateId)映射状态(state state){
KV element=processContext.element();
Iterable count1=element.getValue().getAll(web);
Iterable count2=element.getValue().getAll(辅助);
长金额=
河道支护
.小溪(
易怒
.concat(count1,count2)
.spliterator(),
(错误)
.collect(收集器.summingLong(n->n));
System.out.println(element.getKey()+“:”+sumAmount);
//processContext.output(element.getKey()+“:”+sumAmount);
Long currCount=state.get(element.getKey()).read()=null?0L:state.get(element.getKey()).read();
Long newCount=currCount+summantium;
state.put(element.getKey(),sumAmount);
processContext.output(KV.of(element.getKey(),sumAmount));
}
}));
最终结算流
.适用(新DoFn()的第{
@过程元素
public void processElement(ProcessContext ProcessContext){
processContext.output(processContext.element());
}
}))
.适用(“最终状态”,第页(新DoFn)(){
@StateId(myState)
私有最终状态规范mapState=
StateSpecs.map();
@过程元素
公共无效处理元素(
进程上下文c,
@StateId(myState)映射状态(state状态){
KV e=c.元件();
System.out.println(“线程ID:
+Thread.currentThread().getId());
长电流计数=
state.get(e.getKey()).read()==null
?0升
:state.get(例如getKey()).read();
Long newCount=currCount+e.getValue();
state.put(例如getKey(),newCount);
c、 输出(如getKey()+“:”+newCount);
}
}))
.apply(KafkaIO.write()
.WithBootstrapServer(“本地主机:9092”)
.withTopic(“测试”)
.withValueSerializer(StringSerializer.class)
.values());
/*finalCountStream.apply(卡夫卡约)。