任务总体逻辑
先是一个实时采集任务,数据从mysql数据库的yhzq_result4表同步到kafka的
topic_dtstack_05 中,然后是一个flink原生任务,对kafka中的数据分组求Top5,并
将各组的Top5写回到mysql的flink_result中。
任务配置情况
- 实时采集任务
- flink原生任务
需要注意的是参数指定的是任务执行时的并行度,必须填写而且要是大于等于1的整数
任务执行过程
1.mysql源表中的数据
2.执行sql语句,触发实时采集
INSERT INTO yhzq_result4 SELECT * FROM `yhzq_result4_copy2`
3.导入到kafka中的数据
4.最后计算出top5导入到数据库中的数据
主类的代码解读
package com.dtstack;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.common.state.ValueState;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.*;
import org.apache.flink.api.java.typeutils.TupleTypeInfo;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.KeyedProcessFunction;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.types.Row;
import org.apache.flink.util.Collector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Properties;
public class my_top5 {
private static org.codehaus.jackson.map.ObjectMapper objectMapper = new org.codehaus.jackson.map.ObjectMapper();
private static final Logger logger = LoggerFactory.getLogger(my_top5.class);
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
StreamTableEnvironment tableEnv = StreamTableEnvironment.getTableEnvironment(env);
//设置并行度,为第一个参数
env.setParallelism(Integer.valueOf(args[0]));
//配置连接kafka的信息,并从最新的地方开始消费,所以我们每次刚起这个任务时是消费不到数据的
//需要在navicat中执行 INSERT INTO yhzq_result4 SELECT * FROM `yhzq_result4_copy2` 向
//mysql中插入数据从而触发实时采集,kafka便会流入新的数据
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "172.16.20.16:9092");
FlinkKafkaConsumer011<String> consumer1 = new FlinkKafkaConsumer011<>("topic_dtstack_05",
new SimpleStringSchema(), properties);
consumer1.setStartFromLatest();
//从kafka数据流中取数据,qiyeJson对象是关键,它通过指定key指定了取kafka中每条json格式数据的哪些值
//然后过滤掉字段为空的脏数据,最后指定15个值类型为String,然后个数为15的元组的数据流
DataStream&l