flink入门 | 青训营笔记

334 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第16天

1. 环境配置

java8 & flink1.9.3,windows10系统

  • 创建一个本地 Flink 集群

    在安装目录..\flink-1.9.3\bin\下启动cmd,输入 start-cluster.bat,生成2个java窗口, 在localhost:8081打开ui界面

  • 运行测试用例

    在..\flink-1.9.3\bin\输入flink.bat run ../examples/batch/WordCount.jar,运行flink自带的测试样例

    也可以在ui界面上传任务,将../examples/batch/WordCount.jar上传,点击submit

监视各项任务完成情况

  • 可能存在的问题
    • Q1 输入start-cluster.bat不能将生成的java窗口关闭,否则打不开localhost:808
    • Q2 输入start-cluster.bat无法生成java窗口,且打不开localhost:8081时,可以检查一下对应的java版本和flink版本是否匹配,例如:flink1.9.3不支持java17

2. 创建一个flink-java项目

要想运行flink-java,首先我们需要创建一个MAVEN项目。这里我用的是MAVEN3.8.6。参考了晚上许多修改pom的复杂方法均以失败告终后,我决定还是参考flink官网教程,使用控制台创建maven项目。具体方法如下:打开cmd窗口,进入创建的项目所在目录,输入

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

其中1.9.3为flink版本。中途需要手动输入项目的groupId和artifactId,version和package使用默认的值,直接回车便好。出现BUILD SUCCESS即为创建成功。

使用IDEA打开创建好的项目,文件目录如下图所示。

在src\main\resources目录下新建hello.text文件,并输入

hello world
hello world
Life without
The Economist
would be life
without
a
global perspective

在src\main\java目录下新建WordCount.java文件,并输入

package com.guigu.wc;


import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.AggregateOperator;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;

//批处理 word count
public class WordCount {
    public static void main(String[] args) throws Exception{
        // 创建执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        // 从文件中读取数据
        String inputPath = "C:\Users\KAYAK\Desktop\WordCount_3\demo\src\main\resources\hello.txt";
        DataSet<String> inputDataSet = env.readTextFile(inputPath);

        // 对数据进行处理,按空格分词展开,转换成(word,1)二元组进行统计
        DataSet<Tuple2<String,Integer>> wordCountDataSet = inputDataSet.flatMap(new MyFlagMapper()).groupBy(0).sum(1);

        // 打印输出
        wordCountDataSet.print();
    }

    public static class MyFlagMapper implements FlatMapFunction<String,Tuple2<String,Integer>>{
        public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
            // 按照空格分词
            String [] words = s.split(" ");
            for (String word:words){
                collector.collect(new Tuple2<String, Integer>(word,1));
            }
        }
    }

}

运行后得到结果,为各个单词出现的频率。

(a,1)
(world,2)
(Economist,1)
(hello,2)
(life,1)
(be,1)
(without,2)
(The,1)
(would,1)
(perspective,1)
(global,1)
(Life,1)

参考

blog.csdn.net/x976269167/… zhuanlan.zhihu.com/p/374960643 blog.csdn.net/yamaxifeng_… blog.csdn.net/m0_52652844… nightlies.apache.org/flink/flink… zhuanlan.zhihu.com/p/400693396