目录
流处理的相关概念
数据的时效性
日常工作中,我们一般会先把数据存放在表中,然后对数据进行加工和分析。这就有时效性的问题。
如果以年、月、天为单位的级别的数据处理,进行统计分析,个性化推荐,这样的数据一般称之为批数据。如果以小时、分钟、秒这样的单位进行处理,这样的数据一般称之为流数据。比如对网站的实时监控、日志的处理等。在这样的场景下,如果还要收集数据存储到数据库中,再取出来统一进行处理,就无法满足高时效性的需求。
流处理和批处理
批处理
Batch Analytics,统一收集数据->存储到数据库->对数据进行批量处理,例如MP、Hive、FlinkDataSet、Spark Batch等,生成离线报表
流处理
Streaming Analytics,就是对数据流进行处理,例如Storm、Flink Stream、Spark Streaming实时处理分析数据,应用场景如实时大屏、实时报表等。
批处理和流处理的对比
- 数据的时效性不同:流处理实时、低延迟,批处理非实时、高延迟
- 数据特征不同:流处理的数据一般是动态的、没有边界,而批处理的数据一般是静态的
- 应用场景不同:流处理应用在实时场景,批处理对实时性要求不高
- 运行方式不同:流处理的任务是持续进行,批处理的任务是一次性完成
流批一体API
Flink的DataStream API既支持批处理模式,又支持流处理模式,可以认为批处理是流处理的一种特例。
流批一体的好处:
- 可复用性:作业可以在流、批两种模式之间自由切换,而无需重写代码。
- 维护简单:统一的api,维护简单
流批一体编程模型
Data Source
预定义的Source
基于集合的Source
api
- env.fromElements(可变参数)
- env.fromCollection(各种集合)
- env.generateSequence(开始,结束)
- 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