当前位置:   article > 正文

【Flink】构建一个简单的flink应用_c# flink

c# flink

本篇文章,主要通过Flink来实现“Hello Word”、批处理的“Word Count”以及流处理的“Word Count”来体验一下Flink.

1. 版本说明

本系列文章所使用的flikn版本为最新的1.12.0(截至2021年1月)

  • Flink:1.12.0

  • Java:1.8

  • Maven:3.6.3

2. 一个最简单的Flink程序:Hello Word

在学习任何一门语言或者框架的时候,我们总是以“Hello Word”开始。

//Java
System.out.println("Hello,World!");
//C
printf("Hello,World!");
//Python
print("Hello,World!")
//C#
Console.WriteLine("Hello,World!");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

所以,在学习Flink时,我们也从输出“Hello Word”开始,来打开Flink的大门。

2.1 最小化依赖

首先我们需要引入Flink相关的依赖,只需要引入flin-clinets即可,它本身已经包含了flink-java和flink-core了。

    <properties>
        <flink.version>1.12.0</flink.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
    </dependencies>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.2 使用Flink输出“Hello Word”

以下代码实现了输出一个List数据源中的元素“Hello Word”:

/**
 * 最简单的Flink程序: Hello Word
 *
 * @author wxg
 */
public class HelloWord {
    public static void main(String[] args) throws Exception {
        //获取Flink执行环境
        ExecutionEnvironment environment = ExecutionEnvironment.getExecutionEnvironment();
        //从集合中获取数据源
        DataSource<String> dataSource = environment.fromCollection(Collections.singletonList("Hello Word"));
        //输出到控制台
        dataSource.print();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在Idea中启动它,不出意外的话,会输出以下结果:

Hello Word
  • 1

当然这段程序并没有具体的处理逻辑和功能,它只是把数据源的内容原样输出,但它确实是在Flink环境中执行的。

3. Flink批处理Word Count程序

word count可以说是大数据界的hello word,所以本次依然以最简单的word count例子来分别构建一个基于批处理和流处理的简单的flink应用。

3.1 最小化依赖

和上面一样,仍然只需要flink-clients依赖即可。

    <properties>
        <flink.version>1.12.0</flink.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
    </dependencies>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3.2 编写Flink处理逻辑

依赖导入完成后,我们就可以愉快的来编写Flink程序了。

在没使用Flink前,比如使用MR的时候,我们要做单词计数的功能,通常有以下几步(可参照文末的附录6.1):

  • 定义输入输出数据格式

  • 编写Map函数,将一行行的字符串按照分隔符进行拆分,然后输出格式类似为{word:1}的一个List

  • 编写Reduce函数,将Map阶段的输出按照word(Reduce Key)进行进行聚合统计

  • 输出结果

实际上flink也大致是这样的一个流程,只不过,代码更简洁。

以下是Flink实现的一个简单的统计文本文件中的单词出现次数的代码:

/**
 * 批处理的word count
 *
 * @author wxg
 */
public class BatchWordCount {
    public static void main(String[] args) throws Exception {
        //获取Flink批处理执行环境
        ExecutionEnvironment environment = ExecutionEnvironment.getExecutionEnvironment();

        //从文件中获取数据源
        final String fileName = "E:\\temp\\study-flink\\word-count.txt";
        DataSource<String> dataSource = environment.readTextFile(fileName);
        //单词计数
        dataSource
                //将一行句子按照空格拆分,输入一个字符串,输出一个2元组,key为一个单词,value为1
                .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
                    public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
                        //对读取到的每一行数据按照空格分割
                        String[] split = s.split(" ");
                        //将每个单词放入collector中作为输出,格式类似于{word:1}
                        for (String word : split) {
                            collector.collect(new Tuple2<String, Integer>(word, 1));
                        }
                    }
                })
                //聚合算子,按照第一个字段(即word字段)进行分组
                .groupBy(0)
                //聚合算子,对每一个分租内的数据按照第二个字段进行求和
                .sum(1)
                //打印结果到控制台
                .print();

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/395812
推荐阅读
相关标签