1、流处理和批处理介绍
1.流处理系统
流处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,然后立刻通过网络传输到下一个节点,由下一个节点继续处理。
2.批处理系统
批处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,并不会立刻通过网络传输到下一个节点,当缓存写满,就持久化到本地硬盘上,当所有数据都被处理完成后,才开始将处理后的数据通过网络传输到下一个节点。
3.flink的流处理和批处理
Flink的执行引擎采用了一种十分灵活的方式,同时支持了这两种数据传输模型:
• Flink以固定的缓存块为单位进行网络数据传输,用户可以通过设置缓存块超时值指定缓存块的传输时机。如果缓存块的超时值为0,则Flink的数据传输方式类似上文所提到流处理系统的标准模型,此时系统可以获得最低的处理延迟。
• 如果缓存块的超时值为无限大,则Flink的数据传输方式类似上文所提到批处理系统的标准模型,此时系统可以获得最高的吞吐量。
• 同时缓存块的超时值也可以设置为0到无限大之间的任意值。缓存块的超时阈值越小,则Flink流处理执行引擎的数据处理延迟越低,但吞吐量也会降低,反之亦然。通过调整缓存块的超时阈值,用户可根据需求灵活地权衡系统延迟和吞吐量 。
2、代码示例
批处理:
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;
/**
* 批处理
*/
public class WordCount {
public static void main(String[] args) throws Exception {
String filePath = "E:\\bigData\\hadoop\\hdfs\\src\\main\\resources\\file";
//创建执行环境
ExecutionEnvironment environment = ExecutionEnvironment.getExecutionEnvironment();
//读取文件
DataSource<String> inSource = environment.readTextFile(filePath);
//对数据集进行处理,按空格分词展开,转换成(word,1)二元组进行统计
DataSet<Tuple2<String,Integer>> resultSet = inSource.flatMap(new MyFlatMapper())
.groupBy(0) //按照第一个位置的word分组
.sum(1); //将第二个位置上的数据进行求和
resultSet.print();
}
//自定义类,实现FlatMapFunction接口
public static class MyFlatMapper implements FlatMapFunction<String, Tuple2<String, Integer>>{
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
//按空格分词
String[] words = value.split(" ");
//遍历所有word,包成二元组输出
for (String word: words) {
out.collect(new Tuple2<>(word,1));
}
}
}
}
流处理:
package Flink;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
/**
* @author : shujuelin
* @date : 9:55 2020/12/12
*/
public class StreamWordCount {
public static void main(String[] args) throws Exception {
String filePath = "E:\\bigData\\hadoop\\hdfs\\src\\main\\resources\\file";
//创建流处理环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
/*//读取文件
DataStreamSource<String> streamSource = env.readTextFile(filePath);*/
//采用nc 实际中不能再代码里显示主机ip和端口号。用parameter tool从程序启类中提取参数
ParameterTool tool = ParameterTool.fromArgs(args);
String host = tool.get("host");
int port = tool.getInt("port");
//socket文本流读取数据
DataStreamSource<String> streamSource = env.socketTextStream(host, port);
//基于数据流进行计算
DataStream<Tuple2<String, Integer>> resultStream = streamSource.flatMap(new WordCount.MyFlatMapper())
.keyBy(0)
.sum(1);
resultStream.print();
//执行任务
env.execute();
}
}
4.flink的流处理和批处理代码的区别
流处理Streaming
• StreamExecutionEnvironment
• DataStreaming
批处理Batch
• ExecutionEnvironment
• DataSet