开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情
在上一篇文章中flink入门须知大致了解了下flink,然后我就急于求成的想让他跑起来,这里记录了flink一个简单的处理实例,仅供初学者参考。
flink程序流程
1.获取执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
这里还有一种
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();但这种环境随着版本升级被淘汰了。后者与前者是数据处理模式的差别,但是我们是有别的方法设置处理模式的。
2.设置数据处理模式
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
指定为自动模式:AUTOMATIC 此设置后,flink将会自动识别数据源类型。有界数据流,则会采用批方式进行数据处理;无界束流,则会采用流方式进行数据处理。 一般来说用这个就没问题,但也是有必要知道还有两种其他处理模式的。
- 1.强制指定为批数据处理模式:BATCH
env.setRuntimeMode(RuntimeExecutionMode.BATCH);
- 2.强制指定为流数据处理模式:STREAMING
env.setRuntimeMode(RuntimeExecutionMode.STREAMING);
注意:在flink中,有界与无界数据流都可以强指定为流式运行环境,但是,如果明知一个数据来源为流式数据,就必须设置环境为AUTOMATIC 或STREAMING,不可以指定为BATCH否则程序会报错!
3.加载/创建数据源
flink可以从多种场景读取加载数据,例如 各类DB 如Mysql、SQL SERVER、MongoDB、各类MQ 如Kafka、RabbitMQ、以及很多常用数据存储场景如redis、文件(本地文件/HDFS)、scoket…
1.从集合中读取数据:有界数据
DataStream<String> elementsSource = env.fromElements("a1,a2,a3,a4", "b1,b2,b3", "c1,c2", "d1");
2.从scoket中读取数据:无界数据
DataStreamSource<String> elementsSource= env.socketTextStream("10.50.40.131", 9999);
4.数据处理:可使用各类算子处理数据
flink官方StreamAPI文档:
ci.apache.org/projects/fl…
DataStream<String> flatMap = elementsSource.flatMap(new FlatMapFunction<String, String>() {
@Override
public void flatMap(String element, Collector<String> out) throws Exception {
String[] wordArr = element.split(",");
for (String word : wordArr) {
System.out.println("flatmap\t" + word);
out.collect(word);
}
}
});
5.数据处输出
source.print();
6.执行程序
env.execute("flink-batch-demo");
完整代码
import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.ExecutionEnvironment;
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;
import org.apache.flink.util.Collector;
public class batch_demo {
public static void test() throws Exception {
System.out.println("flink-batch-demo \t Start!");
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment().setParallelism(1);
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
//从集合中读取数据:有界数据
DataStream<String> elementsSource = env.fromElements("a1,a2,a3,a4", "b1,b2,b3", "c1,c2", "d1");
//从scoket中读取数据:无界数据
// DataStreamSource<String> elementsSource= env.socketTextStream("10.50.40.131", 9999);
DataStream<String> flatMap = elementsSource.flatMap(new FlatMapFunction<String, String>() {
@Override
public void flatMap(String element, Collector<String> out) throws Exception {
String[] wordArr = element.split(",");
for (String word : wordArr) {
System.out.println("flatmap\t" + word);
out.collect(word);
}
}
});
SingleOutputStreamOperator<String> source = flatMap.map(new MapFunction<String, String>() {
@Override
public String map(String value) throws Exception {
System.out.println("map\t" + value);
return value.toUpperCase();
}
});
source.print();
env.execute("flink-batch-demo");
}
}