Flink笔记-异步IO

1、异步IO

AsyncDataStream

        Async I/O提供了两种模式:ORDERED和UNORDERED.

                UNORDERED:异步请求一结束就马上输出结果,因为异步请求完成时间的不确定性,结果输出的顺序可能和输入不同.

                此模式调用:AsyncDataStream.unorderedWait(...)

                ORDERED:在这个模式下结果输出的顺序和输入的顺序是一样的,为了实现这一点,后输入的数据异步请求先完成了只能缓存在一个指定的结果中,直到在此之前的记录全部完成异步请求并输出后,才能输出,因此带来了一些额外的延迟和checkpoint开销.

                此模式吊用:AsyncDataStream.orderedWait(...)

public class AsyncIOStream {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(3);

        DataStreamSource<String> source = env.addSource(new FlinkKafkaConsumer010<String>("dwd", new SimpleStringSchema(), KafkaUtils.comsumerProps()));

        SingleOutputStreamOperator<Tuple2<String, Integer>> vodStream = source.map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String line) throws Exception {
                JSONObject jn = JSON.parseObject(line);
                return new Tuple2<String, Integer>(jn.getString("vodid"), Integer.parseInt(jn.getString("seconds")));
            }
        });

        SingleOutputStreamOperator<Tuple2<String, Integer>> result = vodStream
                .keyBy(0)
                .timeWindow(Time.seconds(5))
                .sum(1);

        String url = "jdbc:mysql://192.168.3.160:3306/datax_a?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
        String user = "root";
        String passwd = "root1234";
        String sql = "insert into flink_dws_table (vodid,seconds) values (?,?)";

        // 通过AsyncDataStream,将流异步应用到RichAsyncFunction上
        AsyncDataStream.unorderedWait(result, new MysqlAsyncSink(url, user, passwd, sql), 100, TimeUnit.SECONDS, 100);

        env.execute();
    }
}

class MysqlAsyncSink extends RichAsyncFunction<Tuple2<String, Integer>, Void> {

    private final String url;
    private final String user;
    private final String passwd;
    private final String sql;
    private Connection conn;
    private PreparedStatement statement;

    public MysqlAsyncSink(String url, String user, String passwd, String sql) {
        this.url = url;
        this.user = user;
        this.passwd = passwd;
        this.sql = sql;
    }

    @Override
    public void open(Configuration parameters) throws Exception {
        conn = DriverManager.getConnection(url, user, passwd);
        statement = conn.prepareStatement(sql);
        super.open(parameters);
    }

    @Override
    public void asyncInvoke(Tuple2<String, Integer> value, ResultFuture<Void> resultFuture) throws Exception {
        System.out.println(value);
        statement.setString(1, value.f0);
        statement.setInt(2, value.f1);
        statement.execute();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        try {
            statement.close();
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        return super.clone();
    }
}

Flink异步IO是指在流处理中,可以并发地处理多个异步请求和接收多个响应,从而提高处理吞吐量。异步IO的控制参数包括超时参数和容量参数。超时参数定义了异步请求发出多久后未得到响应即被认定为失败,防止一直等待得不到响应的请求。容量参数定义了可以同时进行的异步请求数,限制并发请求的数量,避免积压。\[1\] Flink提供了两种模式来控制异步IO的结果记录顺序。无序模式是异步请求一结束就立刻发出结果记录,流中记录的顺序在经过异步IO算子之后发生了改变。这种模式具有最低的延迟和最少的开销,适用于使用处理时间作为基本时间特征的场景。有序模式保持了流的顺序,发出结果记录的顺序与触发异步请求的顺序相同。为了实现这一点,算子将缓冲一个结果记录直到这条记录前面的所有记录都发出(或超时)。有序模式通常会带来一些额外的延迟和checkpoint开销,因为记录或结果需要在checkpoint的状态中保存更长的时间。\[3\] 总之,Flink异步IO可以通过控制参数来限制并发请求数和超时时间,从而提高流处理的吞吐量。同时,可以选择无序模式或有序模式来控制结果记录的顺序。 #### 引用[.reference_title] - *1* *2* *3* [Flink之外部数据访问的异步 I/O](https://blog.csdn.net/weixin_45366499/article/details/115265800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值