flink实时消费kafka topic数据处理
1:代码demo
//PROPS为kafka的配置文件
int parallelism =3;
/*1:flink运行环境初始化*/
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(parallelism);
FlinkKafkaConsumer<String> stringFlinkKafkaConsumer = new FlinkKafkaConsumer<>(topic, new CustomKafkaDeserializationSchema(), PROPS);
SingleOutputStreamOperator<String> sourceStream = env.addSource(consumer).disableChaining().name("输入数据");
//已经读取到数据了,开始数据处理
SingleOutputStreamOperator<String> jsonObjOne = sourceStream.map((MapFunction<String, String>) s -> {
return s;
})
try {
env.execute(ck);
} catch (Exception e) {
throw new RuntimeException(e);
}
PROPS配置信息,主要配置如下,放在properties配置文件中进行读取即可。
#建立与kafka集群连接的host/port组
bootstrap.servers=**
#用来唯一标识consumer进程所在组的字符串,如果设置同样的group id,表示这些processes都是属于同一个consumer group
group.id=1
#键的序列化方式
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
#值的序列化方式
value.deserializer=org.apache.kafka.common.serialization.ByteArrayDeserializer
#偏移量的方式
auto.offset.reset=earliest
CustomKafkaDeserializationSchema 对数据进行解析。
@Slf4j
public class CustomKafkaDeserializationSchema implements KafkaDeserializationSchema<String> {
private int count = 0;
@Override
public boolean isEndOfStream(String s) {
return false;
}
@Override
public String deserialize(ConsumerRecord<byte[], byte[]> consumerRecord) {
//可以对读取到的数据进行序列化处理,比如增减字段等公共功能
String topic = consumerRecord.topic();
String value = new String(consumerRecord.value(), StandardCharsets.UTF_8);
long offset = consumerRecord.offset();
int partition = consumerRecord.partition();
JSONObject jsonObject = JSONObject.parseObject(value);
jsonObject.put("offset", offset);
jsonObject.put("partition", partition);
//其他处理也可以
return JSONObject.toJSONString(jsonObject);
}
@Override
public TypeInformation<String> getProducedType() {
return TypeInformation.of(String.class);
}
}