【flink学习笔记】【6】Sink 输出算子

1. 链接到外部系统

  • 流式:消息队列
  • 非流式:es、jdbc
  • 如果没有,自定义sink

2. 输出到文件

StreamingFileSink<String> steamingFileSink = StreamingFileSink.<String>forRowFormat(new Path(".\\output"),
        new SimpleStringEncoder<>("UTF-8"))
        .withRollingPolicy(DefaultRollingPolicy.builder()
        .withMaxPartSize(1024*1024*1024).withRolloverInterval(TimeUnit.MINUTES.toMillis(15))
        .withInactivityInterval(TimeUnit.MINUTES.toMillis(15)).build()
        )  //滚动策略,超过多少时间、多少大小创建新文件;
        .build();


stream.map(data -> data.toString()).addSink(steamingFileSink);

3. 输出到kafka

输入输出都是kafka,使用flink作为etl工具。

# 生产者
kafka-console-producer.sh --broker-list node00:9092 --topic clicks
# 消费者
kafka-console-consumer.sh --bootstrap-server node00:9092 --topic events
public class SinkToKafka {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        //1.读kafka
        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers","node00:9092");

        DataStreamSource<String> kafkaStream = env.addSource(new FlinkKafkaConsumer<String>("clicks", new SimpleStringSchema(), properties));

        //2. flink 处理转换
        SingleOutputStreamOperator<String> result = kafkaStream.map(new MapFunction<String, String>() {

            @Override
            public String map(String s) throws Exception {
                String[] fields = s.split(",");
                return new Event(fields[0].trim(), fields[1].trim(), Long.valueOf(fields[2].trim())).toString();
            }
        });

        //3 sink to kafka\
        result.addSink(new FlinkKafkaProducer<String>("192.168.10.132:9092","events",new SimpleStringSchema()));

        env.execute();



    }
}

在这里插入图片描述
在这里插入图片描述

3.输出到redis

4.输出到es

5. 输出到mysql(JDBC)

result.addSink(JdbcSink.sink("INSERT INTO clicks (user, url) values (?, ?)",
        ((statement, event)->{
            statement.setString(1, event.user);
            statement.setString(2, event.url);
            statement.execute();
        }),
        new JdbcConnectionOptions.JdbcConnectionOptionsBuilder()
                .withUrl("jdbc:mysql://192.168.10.134:3306/flink_study")
        .withDriverName("com.mysql.jdbc.Driver")
        .withUsername("root")
        .withPassword("123456")
        .build()
        ));

6. 自定义sink 函数

实现从kafka获取json,sink输出到mysql

//1.读kafka
Properties properties = new Properties();
properties.setProperty("bootstrap.servers","node00:9092");

SingleOutputStreamOperator<com.shinho.chapter05_sink.Event> result = env.addSource(
        new FlinkKafkaConsumer<String>("clicks", new SimpleStringSchema(), properties))
        .map(new MapFunction<String, com.shinho.chapter05_sink.Event>() {
            @Override
            public com.shinho.chapter05_sink.Event map(String s) throws Exception {
                Gson gson = new Gson();
                System.out.println(s);
                return gson.fromJson(s, com.shinho.chapter05_sink.Event.class);
            }
        });
public class MyMysqlSink extends RichSinkFunction<Event> {
    private PreparedStatement ps = null;
    Connection connection = null;
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://127.0.0.1:3306/shinho";
    String username = "root";
    String password = "383240gyz";

    @Override
    public void open(Configuration parameters) throws Exception {
        super.open(parameters);
        // 获取连接
        connection = getConn();
        //执行查询
        ps = connection.prepareStatement("insert into clicks (user, url) values (?,?);");

    }
    private Connection getConn() {
        try {
            Class.forName(driver);
            connection = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }



    @Override
    public void close() throws Exception {
        super.close();
        if(connection != null){
            connection.close();
        }
        if (ps != null){
            ps.close();
        }
    }

    @Override
    public void invoke(Event value, Context context) throws Exception {
        ps.setString(1,value.user);
        ps.setString(2,value.url);
        System.out.println("insert into clicks (user, url values ("+value.user+","+value.url+"))");
        ps.executeUpdate();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值