使用flink-connector-jdbc实现flink写入clickhouse、mysql等

适用范围:flink1.11.0及之后版本,包名为flink-connector-jdbc

  1. 编辑pom.xml中的小节添加依赖。

          <dependency>
                <groupId>org.apache.flinkgroupId>
                <artifactId>flink-table-planner-blink_${scala.binary.version}artifactId>
                <version>${flink.version}version>
                <scope>providedscope>
            dependency>
            <dependency>
                <groupId>org.apache.flinkgroupId>
                <artifactId>flink-table-api-scala-bridge_${scala.binary.version}artifactId>
                <version>${flink.version}version>
            dependency>
            <dependency>
                <groupId>org.apache.flinkgroupId>
                <artifactId>flink-table-commonartifactId>
                <version>${flink.version}version>
                <scope>providedscope>
            dependency>
    
    			flink-connector-jdbc flink版本需在1.11.0之后
          <dependency>
              <groupId>org.apache.flinkgroupId>
              <artifactId>flink-connector-jdbc_${scala.binary.version}artifactId>
              <version>${flink.version}version>
          dependency>
    
     				 clickhouse jdbc连接
            <dependency>
                <groupId>ru.yandex.clickhousegroupId>
                <artifactId>clickhouse-jdbcartifactId>
                <version>0.2.4version>
            dependency>
    
            mysql jdbc连接
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>5.1.44version>
            dependency>
    
    1. Java实现demo
    import org.apache.flink.api.java.tuple.Tuple2;
    import org.apache.flink.connector.jdbc.JdbcConnectionOptions;
    import org.apache.flink.connector.jdbc.JdbcExecutionOptions;
    import org.apache.flink.connector.jdbc.JdbcSink;
    import org.apache.flink.connector.jdbc.JdbcStatementBuilder;
    import org.apache.flink.streaming.api.datastream.DataStream;
    import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
    import org.apache.flink.streaming.api.functions.ProcessFunction;
    import org.apache.flink.streaming.api.functions.sink.SinkFunction;
    import org.apache.flink.util.Collector;
    
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Arrays;
    
    public class JdbcSink_Test {
        public static void main(String[] args) throws Exception {
            //构造执行环境
            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    
            //source,数组形式获取
            DataStream<String> input = env.fromCollection(Arrays.asList("10001 tom", "10002 jane", "10003 jack"));
    
            //transform
            DataStream<Tuple2<Integer, String>> result = input.process(new ProcessFunction<String, Tuple2<Integer, String>>() {
                @Override
                public void processElement(String s, Context context, Collector<Tuple2<Integer, String>> collector) throws Exception {
                    String[] user = s.split(" ");
                    collector.collect(new Tuple2<>(Integer.parseInt(user[0]), user[1]));
                }
            });
    
            //sink,采用JdbcSink工具类 (flink 1.11 版本提供)
            /**
             * sink方法需要依次传入四个参数:1.预编译的SQL字符串 2.实现JdbcStatementBuilder的对象,用于对预编译的SQL进行传值
             *                        3.JDBC执行器,可以设置批量写入等参数,负责具体执行写入操作 4.JDBC连接设置 包含连接驱动、URL、用户名、密码
             * 说明:不同的数据库在jdbc连接设置部分传入不同的驱动、url等参数即可
             */
            String sql = "insert into user(user_id,name) values(?,?)";
            SinkFunction<Tuple2<Integer, String>> sink = JdbcSink.sink(sql, new MysqlBuilder(),
                    JdbcExecutionOptions.builder().withBatchSize(50).build(),
                    new JdbcConnectionOptions.JdbcConnectionOptionsBuilder()
                            .withDriverName("com.mysql.jdbc.Driver") // clickhouse使用.withDriverName("ru.yandex.clickhouse.ClickHouseDriver")
                            .withUrl("jdbc:mysql://localhost/test?characterEncoding=utf8&useSSL=false") //clickhouse使用 .withUrl("jdbc:clickhouse://localhost/test")
                            .withUsername("root")
                            .withPassword("root").build());
    
            result.addSink(sink);
            env.execute();
        }
    
        //自定义StatementBuilder 实现accept方法实现对预编译的SQL进行传值
        public static class MysqlBuilder implements JdbcStatementBuilder<Tuple2<Integer,String>>{
            @Override
            public void accept(PreparedStatement preparedStatement, Tuple2<Integer, String> user) throws SQLException {
                preparedStatement.setInt(1,user.f0);
                preparedStatement.setString(2,user.f1);
            }
        }
    }
    
    

你可能感兴趣的:(大数据,Java,jdbc,flink,clickhouse,mysql,sink)