Flink Kafka BroadCast

需求:在统计数据时,需要按照一定的规则将数据丢弃,规则是变化的。

方案:选择了使用kafka来完成Flink的全局广播。

未解决问题:当规则改变后,之前所统计的历史数据不可用。

代码:

  public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment tableEnv = StreamTableEnvironment.getTableEnvironment(env);
        Kafka011JsonTableSource orderSource = new OrderStreamKafkaReader(Constants.ORDER_TOPIC).getTableSource("crm_stream");
        tableEnv.registerTableSource("orderDetail", orderSource);
        Table orderDetailTable = tableEnv.sqlQuery("SELECT * FROM orderDetail ");
        //getItemTable 字段转换方法
        Table itemIdTable = new TestBroadCast().getItemTable(orderDetailTable);
        DataStream<OrderDetailInfo4Stat> dataStream = tableEnv.toAppendStream(itemIdTable, OrderDetailInfo4Stat.class);
        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers", Constants.KAFKA_BROKER);
        properties.setProperty("group.id", "crm_stream");
        DataStream<String> stream = env.addSource(new FlinkKafkaConsumer011<>("test", new SimpleStringSchema(), properties));
        //申请内存空间
        MapStateDescriptor<String, String> ruleStateDescriptor = new MapStateDescriptor<String, String>("RulesBroadcastState", String.class, String.class);
        BroadcastStream<String> bdPatterns = stream.broadcast(ruleStateDescriptor);
        dataStream.connect(bdPatterns).process(new BroadcastProcessFunction<OrderDetailInfo4Stat, String, OrderDetailInfo4Stat>() {
            private static final long serialVersionUID = 2671485873668322356L;

            @Override
            public void processElement(OrderDetailInfo4Stat value, ReadOnlyContext ctx, Collector<OrderDetailInfo4Stat> out) throws Exception {
                //非广播元素
                ReadOnlyBroadcastState<String, String> broadcastState = ctx.getBroadcastState(new MapStateDescriptor<String, String>("RulesBroadcastState", String.class, String.class));
                String channelType = broadcastState.get("orderEnvChannelType");
                if (value.getOrderEnvironmentChannelType().equals(Integer.valueOf(channelType))) {
                    //通过自定义到的规则发送数据
                    out.collect(value);
                }
            }

            @Override
            public void processBroadcastElement(String value, Context ctx, Collector<OrderDetailInfo4Stat> out) throws Exception {
                //广播元素
                //获取申请内存空间后的map
                BroadcastState<String, String> broadcastState = ctx.getBroadcastState(new MapStateDescriptor<String, String>("RulesBroadcastState", String.class, String.class));
                //通过广播流为map赋值
                broadcastState.put("orderEnvChannelType", value);
            }
        }).print();
        env.execute("demo broadCast");
    }

在启动时需要先输入广播流,或者在processElement()方法中判断广播规则是否为null。

努力吧,皮卡丘。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值