Flink 开发环境
通常来讲,任何一门大数据框架在实际生产环境中都是以集群的形式运行,而我们调试代码大多数会在本地搭建一个模板工程,Flink 也不例外。

Flink 一个以 Java 及 Scala 作为开发语言的开源大数据项目,通常我们推荐使用 Java 来作为开发语言,Maven 作为编译和包管理工具进行项目构建和编译。对于大多数开发者而言,JDK、Maven 和 Git 这三个开发工具是必不可少的。

关于 JDK、Maven 和 Git 的安装建议如下表所示:

工程创建
一般来说,我们在通过 IDE 创建工程,可以自己新建工程,添加 Maven 依赖,或者直接用 mvn 命令创建应用:

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

这里需要的主要的是,自动生成的项目 pom.xml 文件中对于 Flink 的依赖注释掉 scope:

<dependency>
   <groupId>org.apache.flink</groupId>
   <artifactId>flink-java</artifactId>
   <version>${flink.version}</version>
   <!--<scope>provided</scope>-->
</dependency>
<dependency>
   <groupId>org.apache.flink</groupId>
   <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
   <version>${flink.version}</version>
   <!--<scope>provided</scope>-->
</dependency>

DataSet WordCount (批处理)
WordCount 程序是大数据处理框架的入门程序,俗称“单词计数”。用来统计一段文字每个单词的出现次数,该程序主要分为两个部分:一部分是将文字拆分成单词;另一部分是单词进行分组计数并打印输出结果。

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

      // 创建Flink运行的上下文环境
      final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();       // 创建DataSet,这里我们的输入是一行一行的文本
      DataSet<String> text = env.fromElements(
            "Flink Spark Storm",
            "Flink Flink Flink",
            "Spark Spark Spark",
            "Storm Storm Storm"
      );
      // 通过Flink内置的转换函数进行计算
      DataSet<Tuple2<String, Integer>> counts =
            text.flatMap(new LineSplitter())
                  .groupBy(0)
                  .sum(1);
      //结果打印
      counts.printToErr();    }    public static final class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> {       @Override
      public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
         // 将文本分割
         String[] tokens = value.toLowerCase().split("\\W+");          for (String token : tokens) {
            if (token.length() > 0) {
               out.collect(new Tuple2<String, Integer>(token, 1));
            }
         }
      }
    }

实现的整个过程中分为以下几个步骤。

首先,我们需要创建 Flink 的上下文运行环境:

复制ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
然后,使用 fromElements 函数创建一个 DataSet 对象,该对象中包含了我们的输入,使用 FlatMap、GroupBy、SUM 函数进行转换。

最后,直接在控制台打印输出。

我们可以直接右键运行一下 main 方法,在控制台会出现我们打印的计算结果:

 

DataStream WordCount (流处理)
为了模仿一个流式计算环境,我们选择监听一个本地的 Socket 端口,并且使用 Flink 中的滚动窗口,每 5 秒打印一次计算结果。代码如下:

public class StreamingJob {

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

        // 创建Flink的流式计算环境
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();         // 监听本地9000端口
        DataStream<String> text = env.socketTextStream("127.0.0.1", 9000, "\n");         // 将接收的数据进行拆分,分组,窗口计算并且进行聚合输出
        DataStream<WordWithCount> windowCounts = text
                .flatMap(new FlatMapFunction<String, WordWithCount>() {
                    @Override
                    public void flatMap(String value, Collector<WordWithCount> out) {
                        for (String word : value.split("\\s")) {
                            out.collect(new WordWithCount(word, 1L));
                        }
                    }
                })
                .keyBy("word")
                .timeWindow(Time.seconds(5), Time.seconds(1))
                .reduce(new ReduceFunction<WordWithCount>() {
                    @Override
                    public WordWithCount reduce(WordWithCount a, WordWithCount b) {
                        return new WordWithCount(a.word, a.count + b.count);
                    }
                });         // 打印结果
        windowCounts.print().setParallelism(1);         env.execute("Socket Window WordCount");
    }     // Data type for words with count
    public static class WordWithCount {         public String word;
        public long count;         public WordWithCount() {}         public WordWithCount(String word, long count) {
            this.word = word;
            this.count = count;
        }         @Override
        public String toString() {
            return word + " : " + count;
        }
    }
}

整个流式计算的过程分为以下几步。

首先创建一个流式计算环境:

复制StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
然后进行监听本地 9000 端口,将接收的数据进行拆分、分组、窗口计算并且进行聚合输出。代码中使用了 Flink 的窗口函数,我们在后面的课程中将详细讲解。

我们在本地使用 netcat 命令启动一个端口:

nc -lk 9000
然后直接运行我们的 main 方法:

在 nc 中输入:

$ nc -lk 9000
Flink Flink Flink 
Flink Spark Storm

可以在控制台看到:

Flink : 4
Spark : 1
Storm : 1

Flink学习(三) 批流版本的wordcount JAVA版本的更多相关文章

  1. Flink 是如何统一批流引擎的

    关注公众号:大数据技术派,回复"资料",领取1000G资料. 本文首发于我的个人博客:Flink 是如何统一批流引擎的 2015 年,Flink 的作者就写了 Apache Fli ...

  2. Java版本

    Java版本 Java版本分为J2SE(Java 2 Standard Edition,Java标准版).J2ME(Java 2 Micro Edition,Java微型版本)和J2EE(Java 2 ...

  3. 阿里重磅开源全球首个批流一体机器学习平台Alink,Blink功能已全部贡献至Flink

    11月28日,Flink Forward Asia 2019 在北京国家会议中心召开,阿里在会上发布Flink 1.10版本功能前瞻,同时宣布基于Flink的机器学习算法平台Alink正式开源,这也是 ...

  4. Flink Application Development DataStream API Execution Mode (Batch/Streaming)- Flink应用程序开发DataStream API执行模式(批/流)

    目录 什么时候可以/应该使用BATCH执行模式? 配置BATCH执行模式 执行行为 任务调度和网络随机shuffle 流执行模式 批处理执行模式 状态后端/状态 处理顺序 Event Time/水印( ...

  5. Flink学习笔记-新一代Flink计算引擎

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

  6. flink学习笔记-各种Time

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

  7. 入门大数据---Flink学习总括

    第一节 初识 Flink 在数据激增的时代,催生出了一批计算框架.最早期比较流行的有MapReduce,然后有Spark,直到现在越来越多的公司采用Flink处理.Flink相对前两个框架真正做到了高 ...

  8. 最佳实践:Pulsar 为批流处理提供融合存储

    非常荣幸有机会和大家分享一下 Apache Pulsar 怎样为批流处理提供融合的存储.希望今天的分享对做大数据处理的同学能有帮助和启发. 这次分享,主要分为四个部分: 介绍与其他消息系统相比, Ap ...

  9. flink学习笔记-快速生成Flink项目

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

  10. Flink学习(一)

    Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处理作为 ...

随机推荐

  1. 腾讯云 TStor 私有云存储获统信+海光/兆芯官方认证

    腾讯云 TStor 是一款分布式存储产品,致力于解决私有云.混合云下的各类存储需求.产品紧跟国内信创生态,持续加强自主可控能力.目前,TStor 已经支持国内主流国产操作系统和硬件,如中标麒麟操作系统 ...

  2. Vue2 面试题 (2023-09-22更新)

    基础 Vue2.0 兼容 ie 哪个版本? 不支持 ie8,部分兼容 ie9,完全兼容 ie10 因为 vue 的响应式原理是基于 es5 的 Object.defineProperty 这个方法不支 ...

  3. 在 .net core 与 .net framework 应用之间共享库

    如果你对 .net core 做了任何重要的提交,你就需要为 .net framework 共享同样的库,因为,.net core 是一个新兴的系统生态系统,仍然缺失很多部分. 在混合系统中,你有两个 ...

  4. Supermap Objects API开发中禁用默认的选择集显示风格,启用自定义的显示风格的代码

    //#region 使用自定义风格设置选中状态 Selection selection = new Selection();//从该记录集获取选择集 selection.FromRecordset(r ...

  5. WW中文地名标注:输出*.wwp和*.wpl文件

    链接1:WW中文地名标注工具----3月4日更新增加OZI航点航迹读入 链接2:中文地标库终结者---------WW中的地名/地标中文化(含40万条中文地名)3月4日更新 链接3:地图浏览器

  6. react学习之antd

    antd 为 Web 应用提供了丰富的基础 UI 组件,我们还将持续探索企业级应用的最佳 UI 实践.它最初是基于 React 的组件库,但随着技术的发展,现在也提供了基于 Vue.js 的版本--A ...

  7. 使用C#构建一个论文总结AI Agent

    前言 我觉得将日常生活中一些简单重复的任务交给AI Agent,是学习构建AI Agent应用一个很不错的开始.本次分享我以日常生活中一个总结论文的简单任务出发进行说明,希望对大家了解AI Agent ...

  8. 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'

    Navicat导出的MySQL8.0脚本在低版本MySQL导入执行报错 utf8mb4_0900_ai_ci 替换 utf8_general_ci utf8mb4 替换 utf8 完成以上两点替换再次 ...

  9. CDS标准视图:催款冻结 I_DunningBlockingReasonCode

    视图名称:催款冻结 I_DunningBlockingReasonCode 视图类型:基础视图 视图代码: 点击查看代码 @EndUserText.label: 'Dunning Blocking R ...

  10. RocksDB-键值存储

    存储和访问数百PB的数据是一个非常大的挑战,开源的RocksDB就是FaceBook开放的一种嵌入式.持久化存储.KV型且非常适用于fast storage的存储引擎.   传统的数据访问都是RPC, ...