Flink自定义Sink

Flink 自定义Sink,把socket数据流数据转换成对象写入到mysql存储。

#创建Student类
public class Student { private int id;
private String name;
private int age; @Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

Step2:继承RichSinkFunction,自定义Sink

public class Sink2Mysql extends RichSinkFunction<Student> {

    Connection connection;
PreparedStatement pstmt; private Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/imooc_flink";
conn = DriverManager.getConnection(url,"root","123456"); } catch (Exception e) {
e.printStackTrace();
} return conn;
} @Override
public void open(Configuration parameters) throws Exception {
super.open(parameters); connection = getConnection();
String sql = "insert into student(id,name,age) values (?,?,?)";
pstmt = connection.prepareStatement(sql); System.out.println("open");
} // 每条记录插入时调用一次
public void invoke(Student value, Context context) throws Exception {
System.out.println("invoke~~~~~~~~~");
// 未前面的占位符赋值
pstmt.setInt(1, value.getId());
pstmt.setString(2, value.getName());
pstmt.setInt(3, value.getAge()); pstmt.executeUpdate(); } @Override
public void close() throws Exception {
super.close(); if(pstmt != null) {
pstmt.close();
} if(connection != null) {
connection.close();
}
}
}

Step3:在mysql创建存储表

create table student (
id int(11) not null auto_increment,
name varchar(25),
age int(10),
primary key (id)
);

Step4:

将socket流转成Student对象,并存储到mysql

public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<String> source = env.socketTextStream("localhost",7777); SingleOutputStreamOperator<Student> stuStream = source.map(new MapFunction<String, Student>() {
@Override
public Student map(String value) {
String[] splits = value.split(","); Student stu = new Student();
stu.setId(Integer.parseInt(splits[0])) ;
stu.setName(splits[1]);
stu.setAge(Integer.parseInt(splits[2])); return stu;
}
}); stuStream.addSink(new Sink2Mysql()); env.execute("JavaStreamSink2MysqlApp");
}

Step5:测试

在终端开启socket流,并输入数据:

1,xiao,17

2,ming,24

3,uzi,20

查询mysql表:

select * from student;

结果如下:

mysql> select * from student;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | xiao | 17 |
| 2 | ming | 24 |
| 3 | uzi | 20 |
+----+------+------+
3 rows in set (0.00 sec)

注意一点:

如果运行程序时,报错:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

可能原因是没有添加依赖 mysql-jdbc 依赖,需要在pom文件添加:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>

这里的版本不需要跟mysql版本对应。

Flink自定义Sink的更多相关文章

  1. Flink的sink实战之四:自定义

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. Flink的sink实战之一:初探

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. Flink的sink实战之二:kafka

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. Flink的sink实战之三:cassandra3

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. Hadoop生态圈-Flume的组件之自定义Sink

    Hadoop生态圈-Flume的组件之自定义Sink 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍sink相关的API使用两个小案例,想要了解更多关于API的小技 ...

  6. Flink 自定义source和sink,获取kafka的key,输出指定key

    --------20190905更新------- 沙雕了,可以用  JSONKeyValueDeserializationSchema,接收ObjectNode的数据,如果有key,会放在Objec ...

  7. 4、flink自定义source、sink

    一.Source 代码地址:https://gitee.com/nltxwz_xxd/abc_bigdata 1.1.flink内置数据源 1.基于文件 env.readTextFile(" ...

  8. flume自定义Source(taildirSource),自定义Sink(数据库),开发完整步骤

    一.flume简单了解推荐网站(简介包括简单案例部署): http://www.aboutyun.com/thread-8917-1-1.html 二.我的需求是实现从ftp目录下采集数据,目录下文件 ...

  9. flink 自定义触发器 定时或达到数量触发

    flink 触发器 触发器确定窗口(由窗口分配程序形成)何时准备由窗口函数处理.每个WindowAssigner都带有一个默认触发器. 如果默认触发器不适合需求,我们就需要自定义触发器. 主要方法 触 ...

随机推荐

  1. spring的IOC(反转控制)

    Spring概念 1.1.1 spring 是什么 Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制 ...

  2. 打开桌面的Eclipse闪退,打不开

    参考了网上说的方法: .在C:/WINDOWS/system32 系统文件夹中ctrl+F 然后搜索java.exe,如果存在java.exe, javaw.exe etc.全部删除. 2.内存不足, ...

  3. Python初学者的自我修养,找到自己的方向

    今天是 Python专题 的第22篇文章,原本今天是准备和大家继续Python当中多线程的使用的相关内容.然而前两天有一个读者在后台问我,学习Python有哪些适合新手入门的小项目推荐,所以今天这篇临 ...

  4. Prometheus监控神器-Alertmanager篇(1)

    本章节主要涵盖了Alertmanager的工作机制与配置文件的比较详细的知识内容,由浅入深的给大家讲解. 警报一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的.警 ...

  5. PyQt QML

  6. Zabbix5 对接 SAML 协议 SSO

    Zabbix5 对接 SAML 协议 SSO 在 Zabbix5.0 开始已经支持 SAML 认证 官文文档: https://www.zabbix.com/documentation/current ...

  7. Docker 阿里镜像

    Docker 配置阿里镜像 Dokcer 拉取镜像非常慢,配置阿里镜像加速. 步骤 首先注册阿里云,找到 "容器镜像服务" --> "镜像加速器" ,复制 ...

  8. three.js 着色器材质之变量(三)

    这篇郭先生在练习一下着色器变量,在度娘上面或者官网上经常看到类似水波一样的效果,这篇就试着做一个这样的效果,顺便巩固一下顶点着色器和片元着色器,毕竟多多练习才能更好地掌握.效果如下图,在线案例请点击博 ...

  9. Netty之旅:你想要的NIO知识点,这里都有!

    高清思维导图原件(xmind/pdf/jpg)可以关注公众号:一枝花算不算浪漫 回复nio即可.(文末有二维码) 前言 抱歉好久没更原创文章了,看了下上篇更新时间,已经拖更一个多月了. 这段时间也一直 ...

  10. Java基础—封装

    封装是面向对象的核心特征之一,它提供了一种信息隐藏技术.类的包装包含两层含义:一是将数据和对数据的操作组合起来构成类,类是一个不可分割的独立单位:二是类中既要提供与外部联系的接口,又要尽可能隐藏类的实 ...