Flink - DataStream Sink

476 阅读1分钟

image.png [DataStream Sink](Overview | Apache Flink) 的不同 API 用于操作数据源写入的方式,可以基于控制台或者文件,也可以基于自定义的方式,实际应用中,基于自定义的方式时比较常用的。

基于控制台和文件

package com.learn.flink.sink;

import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

/**
 * sink - 基于控制台和文件
 */
public class SinkDemo1 {

    public static void main(String[] args) throws Exception {
        //0: env
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
        //1: source
        DataStream<String> ds = env.readTextFile("data/words1");

        //2: transformation

        //3: sink
        ds.print(); // 输出到控制台
        ds.printToErr();// 在控制台以红色输出
        ds.printToErr("输出标识放置前:");
        ds.writeAsText("data/output/result1").setParallelism(1); // 并行度为1 时, result 为文件名
        ds.writeAsText("data/output/result2").setParallelism(2); // 并行度大于1 时, result 为文件夹名

        //4: execute
        env.execute();
    }
}

自定义写入 mysql

package com.learn.flink.sink;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

/**
 * sink - 自定义
 */
public class SinkDemo2 {

    public static void main(String[] args) throws Exception {
        //0: env
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
        //1: source
        final DataStream<Student> ds = env.fromElements(new Student("004", "wangwu", 20));

        //2: transformation

        //3: sink
        ds.addSink(new MySqlSink());
        //4: execute
        env.execute();
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Student {
        private String id;
        private String name;
        private Integer age;
    }

    public static class MySqlSink extends RichSinkFunction<Student> {
        private Connection conn = null;
        private PreparedStatement ps = null;

        /**
         * 适合用于开启资源
         * @param parameters
         * @throws Exception
         */
        @Override
        public void open(Configuration parameters) throws Exception {
            conn = DriverManager.getConnection("jdbc:mysql://node01:3306/bigdata", "root", "root");
            String sql = "INSERT INTO `t_student`(`id`, `name`, `age`) VALUES (?, ?, ?);";
            ps = conn.prepareStatement(sql);
        }

        @Override
        public void invoke(Student student, Context context) throws Exception {
            ps.setString(1, student.getId());
            ps.setString(2, student.getName());
            ps.setInt(3, student.getAge());
            ps.execute();
        }

        /**
         * 用于关闭资源
         * @throws Exception
         */
        @Override
        public void close() throws Exception {
            if (conn != null) conn.close();
            if (ps != null) ps.close();
        }
    }
}