Flink经典案例HelloWorld

本文介绍了Apache Flink的基础用法,包括使用Maven生成项目骨架,编写Java和Scala代码实现批处理和流处理的HelloWorld示例。批处理示例展示了如何读取文本、数据处理转换及输出。流处理示例则演示了从Socket读取数据,进行实时计算,并按5秒窗口聚合数据。通过实例展示了Flink在数据处理中的基本操作。
扫码关注系列文章

 

​    Flink是由Scala进行开发的,而Scala是基于JVM的一种语言。所以最终也会转换为JAVA字节码文件,所以Flink程序可以由Java、Scala两种语言都可以进行开发。也可以同时开发。比如Java写一部分代码,Scala写另一部分代码。可以参考<Apache Flink利用Maven对Scala与Java进行混编>。

首先运用maven的flink1.13.0项目骨架生成项目

mvn archetype:generate     -DarchetypeGroupId=org.apache.flink   -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=1.13.0

查看生成后项目的pom文件:

Flink之HelloWorld读取text

下面是flink的读取text的示例:

// 1.准备环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 设置运行模式 为批
env.setRuntimeMode(RuntimeExecutionMode.BATCH);
// 2.准备数据源
DataStreamSource<String> elementsSource = env.fromElements("java,scala,php,c++",
        "java,scala,php", "java,scala", "java");
// 3.数据处理转换
KeyedStream<Tuple2<String, Integer>, String> streamResult = 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) {
            out.collect(word);
        }
    }
}).map(new MapFunction<String, Tuple2<String, Integer>>() {
    @Override
    public Tuple2<String, Integer> map(String word) throws Exception {
        return Tuple2.of(word, 1);
    }
}).keyBy(new KeySelector<Tuple2<String, Integer>, String>() {
    @Override
    public String getKey(Tuple2<String, Integer> value) throws Exception {
        return value.f0;
    }
});
SingleOutputStreamOperator<Tuple2<String, Integer>> sum = streamResult.sum(1);
// 4.数据输出
sum.print();
// 5.执行程序
env.execute("flink-hello-world");

运行后,我们看到下面的结果。

下面我们设置为流处理方式,把env.setRuntimeMode(RuntimeExecutionMode.

STREAMING);执行结果如下,流处理每来一条处理一条

2> (php,1)2> (c++,1)2> (php,2)1> (java,1)1> (java,2)1> (scala,1)1> (java,3)1> (scala,2)1> (java,4)1> (scala,3)

 Flink之HelloWorld读取流:

flink之HelloWorld读取流

//获取运行环境
 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
 env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
 //连接socket获取输入的数据
 DataStreamSource<String> text = env.socketTextStream("127.0.0.1", port, "\n");
  //计算数据
DataStream<WordWithCount> windowCount = text.flatMap(new FlatMapFunction<String, WordWithCount>() {
 public void flatMap(String value, Collector<WordWithCount> out) throws Exception {
          String[] splits = value.split("\\s");
          for (String word : splits) {
                    out.collect(new WordWithCount(word, 1L));
                }
            }
 })//打平操作,把每行的单词转为<word,count>类型的数据
                //针对相同的word数据进行分组
                .keyBy("word")
                //指定计算数据的窗口大小
                .timeWindow(Time.seconds(5))
                .sum("count");
//把数据打印到控制台,使用一个并行度
windowCount.print().setParallelism(1);
//注意:因为flink是懒加载的,所以必须调用execute方法,上面的代码才会执行
env.execute("streaming word count");

 

过5秒后再次输入:

过5秒后再次输入:

我们看到数据每5秒计算一次。

好了今天就介绍到这里!
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值