【Flink】flink流批一体(3)

目录

流处理的相关概念

数据的时效性

流处理和批处理

批处理和流处理的对比

流批一体API

流批一体编程模型

Data Source

预定义的Source

基于集合的Source

基于文件的Source

基于socket的source

自定义的source

随机生成数据

MySQL

代码实现

在pom文件中添加java连接mysql的依赖

运行,查看结果

Transformations

整体分类

基本操作

map

faltMap

keyBy

filter

sum

reduce

合并-拆分

一        union和connect

 需求

代码实现

输出结果

 二       Select和Side Outputs

需求

代码实现

输出结果

分区

rebalance重平衡分区

代码实现

​编辑

其他分区

Data Sink

预定义Sink

自定义Sink

主程序

实体类

自定义数据下沉工具类

输出结果

Connector

JDBC Connector


流处理的相关概念

数据的时效性

日常工作中,我们一般会先把数据存放在表中,然后对数据进行加工和分析。这就有时效性的问题。

如果以年、月、天为单位的级别的数据处理,进行统计分析,个性化推荐,这样的数据一般称之为批数据。如果以小时、分钟、秒这样的单位进行处理,这样的数据一般称之为流数据。比如对网站的实时监控、日志的处理等。在这样的场景下,如果还要收集数据存储到数据库中,再取出来统一进行处理,就无法满足高时效性的需求。

流处理和批处理

批处理

Batch Analytics,统一收集数据->存储到数据库->对数据进行批量处理,例如MP、Hive、FlinkDataSet、Spark Batch等,生成离线报表

流处理

Streaming Analytics,就是对数据流进行处理,例如Storm、Flink Stream、Spark Streaming实时处理分析数据,应用场景如实时大屏、实时报表等

批处理和流处理的对比

  1. 数据的时效性不同:流处理实时、低延迟,批处理非实时、高延迟
  2. 数据特征不同:流处理的数据一般是动态的、没有边界,而批处理的数据一般是静态的
  3. 应用场景不同:流处理应用在实时场景,批处理对实时性要求不高
  4. 运行方式不同:流处理的任务是持续进行,批处理的任务是一次性完成

流批一体API

Flink的DataStream API既支持批处理模式,又支持流处理模式,可以认为批处理是流处理的一种特例。

流批一体的好处:

  1. 可复用性:作业可以在流、批两种模式之间自由切换,而无需重写代码。
  2. 维护简单:统一的api,维护简单

流批一体编程模型

Data Source

预定义的Source

基于集合的Source

api

  1. env.fromElements(可变参数)
  2. env.fromCollection(各种集合)
  3. env.generateSequence(开始,结束)
  4. env.fromSequence(开始,结束)

演示

package DataStream;

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

import java.util.Arrays;

/**
 * description flink的基于集合的source演示
 * env.fromElements(可变参数)
 * env.fromCollection(各种集合)
 * env.generateSequence(开始,结束)
 * env.fromSequence(开始,结束)
 * @date 2022/4/25
 */
public class DataSourceCollectionDemo {
    public static void main(String[] args) throws Exception {
        //1、env
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
        //2、source
        //2.1 env.fromElements()
        DataStream<String> ds1 = env.fromElements("spark","flink","hadoop","hive");
        //2.2 env.fromCollection
        String [] s1 = {"java","flume","azkaban","sqoop"};
        DataStream<String> ds2 = env.fromCollection(Arrays.asList(s1));
        //2.3 env.generateSequence
        DataStream<Long> ds3 = env.generateSequence(1,10);
        //2.4 env.fromSequence
        DataStream<Long> ds4 = env.fromSequence(20,30);
        //3、transformation
        //4、sink
        ds1.print();
        ds2.print();
        ds3.print();
        ds4.print();
        //5、execute
        env.execute();
    }
}

输出结果

基于文件的Source

api

env.readTextFile(本地/HDFS/文件夹/压缩文件)

演示

package DataStream;

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

import java.util.Arrays;

/**
 * description flink的基于文件的source演示
 * env.readTextFile(本地/HDFS/文件夹/压缩文件)
 * @date 2022/4/25
 */
public class DataSourceFileDemo {
    public static void main(String[] args) throws Exception {
        //1、env
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
        //2、source
        //2.1 读取本地文件
        DataStream<String> ds1 = env.readTextFile("D:\\wordcount\\input\\a.txt");
        //2.2 读取本地文件夹
//        DataStream<String> ds2 = env.readTextFile("F:\\0操作地址\\wordcount\\input");
        //2.3 读取hdfs文件
//        DataStream<String> ds3 = env.readTextFile("hdfs://hadoop01:9000/wordcount/input/a.txt");
        //2.4 读取hdfs文件夹
//        DataStream<String> ds4 = env.readTextFile("hdfs://hadoop01:9000/wordcount/input");
        //2.5 读取压缩文件
//        DataStream<String> ds5 = env.readTextFile("F:\\0操作地址\\wordcount\\a.txt.gz");
        //2.6
//        DataStream<String> ds6 = env.readTextFile("hdfs://hadoop01:9000/wordcount/input/a.txt.gz");
        //3、transformation
        //4、sink
        ds1.print();
//        ds2.print();
//        ds3.print();
//        ds4.print();
//        ds5.print();
//        ds6.print();
        //5、execute
        env.execute();
    }
}

准备gz格式压缩文件

https://pan.baidu.com/s/1Nv8cIICk4HwNwdsdgkoFjA?pwd=1234  提取码:1234

查看结果

截取其中的一个

基于socket的source

socket是指网络通讯,需要有一个发送端一个接送端,类似于插头和插座(socket),用于和一些智能硬件的对接。比如门禁的人脸机就是一个智能设备,每个人脸机都有一个ip地址,也有一个端口,根据ip地址和端口号就可以和这个人脸机进行通讯。

1 模拟socket通讯,安装nc(没有四级标题了,就用符号了)

nc是netcat的简称,可以利用它向某台主机的某个端口发送数据,模拟socket通讯的发送端,也就是作为source

2 启动nc,发送数据,相当于socket通讯的发送端

3 使用telnet来接收数据,测试socket是否工作正常

 

 linux主机下,也可以安装telnet进行测试

4 编写flink代码,作为socket通讯的接收端,接收发送的数据进行处理

package DataStream;

import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExec
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星欲冷hx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值