flink使用02-从WordCount开始

相信大家在学习spark的时候接触的第一个案例肯定也是 wordCount, 本文也想通过这样一个简单的例子来讲一下一个简单的 flink 程序是什么样子的, 让大家对 flink 的代码有一个简单的了解.

一个 flink程序主要分为5个部分:

  • 1. 获取执行 Environment
    environment 提供控制 job 执行的方法(例如设置并行度/容错/checkpoint 参数) 并且与外部系统做交互. flink可以做流计算也可以做批计算, 对应的也就有不同的environment , 在使用时根据不同的使用场景选择即可.

  • 2. 获取输入流 Source

    一个流式计算框架自然是少不了数据的输入, 在 streamExecutionEnvironment 的可以看到有很多种创建输入流的方式, 不过在项目中使用最多的还是使用 addSource()方法来添加不同的数据源接入

    数据源接入方法.png
  • 3. 执行计算 Operator

    在spark中,对数据的转换计算是通过 action 算子和 transformation 算子来对 RDD 中的数据来进行操作, 而在flink中, 主要是通过 Operator来对一个流做处理, 通过一个 Operator 可以将一个流转换为另外一个流, flink中内置了很多算子来实现Operator操作.

  • 4. 输入结果 Sink

    在完成数据计算之后,就需要有一个输出的地方, 通常来讲也是通过 addSink() 方法来添加不同的数据输出目标,也可以通过 print() 来直接查看输出或者写入到csv等外部文件.

  • 5. 启动 flink,提交 job

    一个 flink 代码的启动执行, 必须通过 env.executor() 方法.这行代码主要做了以下事情:

    1. 生成StreamGraph
    2. 生成JobGraph.
    3. 生成一系列配置
    4. 将 JobGraph和配置交给 flink 集群去运行
    5. 以本地模式运行的话,可以看到启动过程,如启动能量度,web模块,jobManager,ResourceManager,taskManager等等
    6. 启动任务

以下为简单的 WordCount 代码

public class WordCount {

    public static void main(String[] args) throws Exception {

        // 获取 StreamEnv
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 获取 输入流
        DataStream<String> text = env.fromElements(WordCountData.WORDS);

        // 执行计算Operator
        DataStream<Tuple2<String, Integer>> counts
                = text.flatMap(new SplitFunction())
                .keyBy(0).sum(1);

        // 输出结果
        counts.print();

        // 启动flink程序
        env.execute("WordCount Demo");
    }

    // *************************************************************************
    // 自定义切割Function切分一行输入
    // *************************************************************************
    public static final class SplitFunction implements FlatMapFunction<String, Tuple2<String, Integer>>{

        @Override
        public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
            String[] words = s.toLowerCase().split(" ");
            for (String word : words) {
                if (word.length() > 0){
                    collector.collect(new Tuple2<>(word, 1));
                }
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • System Architecture 分布式系统需要解决:分配和管理在集群的计算资源、处理配合、持久和可访问的数...
    allin8116阅读 4,492评论 0 0
  • 本文为《Flink大数据项目实战》学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习...
    大数据研习社阅读 7,091评论 0 2
  • 介绍 概述 Apache Flink是一个面向数据流处理和批量数据处理的可分布式的开源计算框架,它基于同一个Fli...
    stephen_k阅读 51,423评论 0 22
  • 本文所讨论的计算资源是指用来执行 Task 的资源,是一个逻辑概念。本文会介绍 Flink 计算资源相关的一些核心...
    七海的游风阅读 5,071评论 0 0
  • 她,从淤泥中探出头来时 还很单纯 开一朵禅意的花,以示世人 叶,撑起风雨 与时光对饮 依偎着一点嫣红醉卧红尘 醒来...
    晨阳6926阅读 3,047评论 4 5