kafka学习_尚学堂|百战卓越班学员学习经验分享:Flink + kafka 使用

9feead780183429ef0c7045104401eb0.png


Flink + kafka 整合使用
1. 在 pom.xml 中添加 Flink Kafka 连接器的依赖,如果添加了不要重复添加
<!-- Flink Kafka 连接器的依赖-->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.11_2.11</artifactId>
<version>1.7.1</version>
</dependency>
2. 从 kafka 中读取数据处理,并将结果打印到控制台
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
Properties props = new Properties();
props.setProperty("bootstrap.servers", "node1:9092,node2:9092,node3:9092");
props.setProperty("group.id", "flink-group");
/**
* 第一个参数是 topic
* 第二个参数是 value 的反序列化格式
* 第三个参数是 kafka 配置
*/
FlinkKafkaConsumer011<String> consumer011 = new FlinkKafkaConsumer011<>("FlinkTopic", new
SimpleStringSchema(), props);
DataStreamSource<String> stringDataStreamSource = env.addSource(consumer011);
SingleOutputStreamOperator<String> flatMap = stringDataStreamSource.flatMap(new
FlatMapFunction<String, String>() {
@Override
public void flatMap(String s, Collector<String> outCollector) throws Exception {
String[] split = s.split(" ");
for (String currentOne : split) {
outCollector.collect(currentOne);
}
}
});
//注意这里的 tuple2 需要使用 org.apache.flink.api.java.tuple.Tuple2 这个包下的 tuple2
SingleOutputStreamOperator<Tuple2<String, Integer>> map = flatMap.map(new
MapFunction<String, Tuple2<String, Integer>>() {
@Override
public Tuple2<String, Integer> map(String word) throws Exception {
return new Tuple2<>(word, 1);
}
});
//keyby 将数据根据 key 进行分区,保证相同的 key 分到一起,默认是按照 hash 分区
KeyedStream<Tuple2<String, Integer>, Tuple> keyByResult = map.keyBy(0);
WindowedStream<Tuple2<String, Integer>, Tuple, TimeWindow> windowResult =
keyByResult.timeWindow(Time.seconds(5));
SingleOutputStreamOperator<Tuple2<String, Integer>> endResult = windowResult.sum(1);
//sink 直接控制台打印
//执行 flink 程序,设置任务名称。console 控制台每行前面的数字代表当前数据是哪个并行线程计
算得到的结果
endResult.print();
//最后要调用 execute 方法启动 flink 程序
env.execute("kafka word count");
3. 将结果写入 kafka
//sink 将结果存入 kafka topic 中,存入 kafka 中的是 String 类型,所有 endResult 需要做进一步的转换
FlinkKafkaProducer011<String> producer = new
FlinkKafkaProducer011<>("node1:9092,node2:9092,node3:9092","FlinkResult",new SimpleStringSchema());
//将 tuple2 格式数据转换成 String 格式
endResult.map(new MapFunction<Tuple2<String,Integer>, String>() {
@Override
public String map(Tuple2<String, Integer> tp2) throws Exception {
return tp2.f0+"-"+tp2.f1;
}
}).addSink(producer);
4. 将结果写入文件
//sink 将结果存入文件,FileSystem.WriteMode.OVERWRITE 文件目录存在就覆盖
endResult.writeAsText("./result/kafkaresult",FileSystem.WriteMode.OVERWRITE);
//
endResult.writeAsText("./result/kafkaresult",FileSystem.WriteMode.NO_OVERWRITE);
更多科技一手咨询,欢迎关注!“我们相信人人都可以成为一个IT大神,现在开始,选择一条阳光大道,助你入门,学习的路上不再迷茫。这里是北京尚学堂,初学者转行到IT行业的聚集地。"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值