在之前的《Flink DataStream API》一文中,我们列举了一些Flink自带且常用的transformation算子,例如map、flatMap等。在Flink的编程体系中,我们获取到数据源之后,需要经过一系列的处理即transformation操作,再将最终结果输出到目的Sink(ES、mysql或者hdfs),使数据落地。因此,除了正确的继承重写RichSourceFunction<>和RichSinkFunction<>之外,最终要的就是实时处理这部分,下面的图介绍了Flink代码执行流程以及各模块的组成部分。
在Storm中,我们常常用Bolt的层级关系来表示各个数据的流向关系,组成一个拓扑。在Flink中,Transformation算子就是将一个或多个DataStream转换为新的DataStream,可以将多个转换组合成复杂的数据流拓扑。如下图所示,DataStream会由不同的Transformation操作,转换、过滤、聚合成其他不同的流,从而完成我们的业务要求。
那么以《Flink从kafka中读数据存入Mysql Sink》一文中的业务场景作为基础,在Flink读取Kafka的数据之后,进行不同的算子操作来分别详细介绍一下各个Transformation算子的用法。Flink消费的数据格式依然是JSON格式:{"city":"合肥","loginTime":"2019-04-17 19:04:32","os":"Mac OS","phoneName":"vivo"}
1、map
map:输入一个元素,输出一个元素,可以用来做一些清洗工作。
/**
* create by xiax.xpu on @Date 2019/4/11 20:47
*/
public class FlinkSubmitter {
public static void main(String[] args) throws Exception{
//获取运行时环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//checkpoint配置
//为了能够使用支持容错的kafka Consumer,开启checkpoint机制,支持容错,保存某个状态信息
env.enableCheckpointing(5000);
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
env.getCheckpointConfig().setCheckpointTimeout(60000);
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
//kafka配置文件
Properties props = new Properties();
props.put("bootstrap.servers", "192.168.83.129:9092");
props.setProperty("group.id","con1");
props.put("zookeeper.connect","192.168.83.129:2181");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); //key 反序列化
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); //value 反序列化
System.out.println("ready to print");
FlinkKafkaConsumer011<String> consumer = new FlinkKafkaConsumer011<>(
"kafka_flink_mysql",
new SimpleStringSchema(),
props);
consumer.setStartFromGroupOffsets();//默认消费策略