文章目录

  • Flink高手之路3-Flink的入门案例
  • 一、Flink的API
  • 二、Flink的编程模型
  • 三、Flink的编程步骤
  • 四、Flink的入门案例之一:批处理DataSet的处理
  • 1.创建一个maven项目
  • 2. 改pom文件,引入Flink的依赖
  • 3.创建相关的包和类,并测试环境是否搭建成功
  • 4.编写代码
  • (1)主要步骤
  • (2)准备环境
  • (3)准备数据
  • (4)处理数据
  • (5)执行
  • (6)完整代码
  • 5.运行项目,查看结果
  • 五、Flink的入门案例之二:流处理DataStream
  • 1.创建一个类,并编写代码
  • 2.执行,查看结果
  • 六、在hadoop集群上运行
  • 1.启动zookeeper集群
  • 2.启动hdfs集群
  • 3.启动yarn集群
  • 4.启动Flink集群
  • 5.打jar包
  • 6.把打好的jar包上传服务器
  • 7.以per-job模式提交任务
  • 8.获取主类完整名称
  • 9.指定主类重新提交
  • 10.在yarn的web ui上查看执行过程
  • 11.查看执行结果
  • 12.获取流处理程序的完整类名,再次以流处理程序提交集群执行
  • 13.修改流处理类的代码
  • 14.添加对Hadoop的支持
  • 15.在本地进行测试,查看结果
  • 16.重新打包,上传服务器
  • 17.重新提交任务,并查看结果



Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_hadoop

Flink高手之路3-Flink的入门案例

一、Flink的API

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_02

二、Flink的编程模型

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_03

Flink的应用程序的结构跟MapReduce程序一样,主要包括三部分:

  • Data Source:数据的来源
  • Transformations:数据的处理
  • Data Sink:数据的目的地

三、Flink的编程步骤

查看官网案例:https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/dev/dataset/overview/

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_04

通过官网案例,主要步骤:

  • 准备环境:env
  • 准备数据:source
  • 处理数据:transformations
  • 输出结果:sink
  • 触发执行

四、Flink的入门案例之一:批处理DataSet的处理

1.创建一个maven项目

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_05

2. 改pom文件,引入Flink的依赖

<dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>1.12.7</version>
        </dependency>
    </dependencies>

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_06

3.创建相关的包和类,并测试环境是否搭建成功

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_07

4.编写代码

(1)主要步骤

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_08

(2)准备环境

单例模式创建环境

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_09

(3)准备数据

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_10

(4)处理数据

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_11

导入的类文件

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_12

(5)执行

对于DataSet的数据结果如果使用print,就不需要execute执行

(6)完整代码
package cn.edu.hgu.bigdata20.flink;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.operators.Order;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.UnsortedGrouping;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;

/**
 * description:使用Flink的批处理进行单词计数
 * author:wangchuanqi
 * date:2023/03/24
 */
public class WordCount {
    public static void main(String[] args) throws Exception {
        // 1.准备环境:env
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();// 单例模式
        // 2.准备数据:source
        DataSet<String> text = env.fromElements(
                "Who's there?",
                "I think I hear them. Stand, ho! Who's there?");
        // 3.处理数据:transformations,使用匿名函数类
        // 3.1 将每一行数据切分成一个个的单词组成一个集合
        DataSet<String> wordDS = text.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public void flatMap(String s, Collector<String> collector) throws Exception {
                // 参数s代表一行行的文本数据,将其切割为一个个的单词
                String[] words = s.split(" ");
                // 将切割的每一个单词收集起来成为一个集合
                for (String word : words) {
                    collector.collect(word);
                }
            }
        });
        // 3.2 使集合中的每一个单词记为1,组成一个二元组
        DataSet<Tuple2<String, Integer>> wordAndOnesDS = wordDS.map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String s) throws Exception {
                // 此处的s就是传过来的一个个单词,他跟1组成一个二元组
                return Tuple2.of(s, 1);
            }
        });
        // 3.3 对新的集合按照key,也就是单词进行分组
        UnsortedGrouping<Tuple2<String, Integer>> groupDS = wordAndOnesDS.groupBy(0);
        // 3.4 对数据进行聚合
        DataSet<Tuple2<String, Integer>> aggResult = groupDS.sum(1);//此处的1表示二元组的第二个元素
        // 3.5 对结果进行排序
        DataSet<Tuple2<String, Integer>> result = aggResult.sortPartition(1, Order.DESCENDING).setParallelism(1);
        // 4.输出结果:sink
        result.print();
        // 5.触发执行
        // 对于DataSet如果有print,可以省略execute
    }
}

5.运行项目,查看结果

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_13

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_14

五、Flink的入门案例之二:流处理DataStream

1.创建一个类,并编写代码

package cn.edu.hgu.bigdata20.flink;

import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * description:使用Flink的流处理进行单词计数
 * author:wangchuanqi
 * date:2023/03/24
 */
public class WordCountDataStream {
    public static void main(String[] args) throws Exception {
        // 1.准备环境:env
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);

        // 2.准备数据:source
        DataStream<String> text = env.fromElements(
                "Who's there?",
                "I think I hear them. Stand, ho! Who's there?");

        // 3.处理数据:transformations,使用匿名函数类
        // 3.1 将每一行数据切分成一个个的单词组成一个集合
        DataStream<String> wordDS = text.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public void flatMap(String s, Collector<String> collector) throws Exception {
                // 参数s代表一行行的文本数据,将其切割为一个个的单词
                String[] words = s.split(" ");
                // 将切割的每一个单词收集起来成为一个集合
                for (String word : words) {
                    collector.collect(word);
                }
            }
        });
        // 3.2 使集合中的每一个单词记为1,组成一个二元组
        DataStream<Tuple2<String, Integer>> wordAndOnesDS = wordDS.map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String s) throws Exception {
                // 此处的s就是传过来的一个个单词,他跟1组成一个二元组
                return Tuple2.of(s, 1);
            }
        });
        // 3.3 对新的集合按照key,也就是单词进行分组
        KeyedStream<Tuple2<String, Integer>, String> groupDS = wordAndOnesDS.keyBy(t -> t.f0);//lambda形式,fo表示二元组的第一个元素
        // 3.4 对数据进行聚合
        DataStream<Tuple2<String, Integer>> aggResult = groupDS.sum(1);//此处的1表示二元组的第二个元素
        // 3.5 对结果进行排序
        //DataSet<Tuple2<String, Integer>> result = aggResult.sortPartition(1, Order.DESCENDING).setParallelism(1);
        // 4.输出结果:sink
        aggResult.print();
        // 5.触发执行
        // 对于DataSet如果有print,可以省略execute
        env.execute();
    }
}

2.执行,查看结果

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_15

六、在hadoop集群上运行

1.启动zookeeper集群

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_16

2.启动hdfs集群

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_hadoop_17

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_18

3.启动yarn集群

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_19

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_数据_20

4.启动Flink集群

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_21

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_22

5.打jar包

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_23

6.把打好的jar包上传服务器

找到 jar 包所在目录:

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_hadoop_24

上传 jar 包:

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_25

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_数据_26

7.以per-job模式提交任务

flink run -m yarn-cluster -yjm 1024 -ytm 1024 Flink-DataSet-Demo-1.0-SNAPSHOT.jar

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_27

8.获取主类完整名称

cn.edu.hgu.bigdata20.flink.WordCount

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_28

9.指定主类重新提交

flink run -m yarn-cluster -yjm 1024  -ytm  1024 -c cn.edu.hgu.bigdata20.flink.WordCount Flink-DataSet-Demo-1.0-SNAPSHOT.jar

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_数据_29

10.在yarn的web ui上查看执行过程

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_数据_30

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_hadoop_31

11.查看执行结果

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_hadoop_32

12.获取流处理程序的完整类名,再次以流处理程序提交集群执行

cn.edu.hgu.bigdata20.flink.WordCountDataStream

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_33

提交任务

flink run -m yarn-cluster -yjm 1024  -ytm  1024 -c cn.edu.hgu.bigdata20.flink.WordCountDataStream Flink-DataSet-Demo-1.0-SNAPSHOT.jar

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_34

yarn的web ui查看

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_hadoop_35

查看结果

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_36

13.修改流处理类的代码

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_37

package cn.edu.hgu.bigdata20.flink;

import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * description:使用Flink的流处理进行单词计数
 * author:wangchuanqi
 * date:2023/03/24
 */
public class WordCountDataStream {
    public static void main(String[] args) throws Exception {
        // 1.准备环境:env
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);

        // 2.准备数据:source
        DataStream<String> text = env.fromElements(
                "Who's there?",
                "I think I hear them. Stand, ho! Who's there?");

        // 3.处理数据:transformations,使用匿名函数类
        // 3.1 将每一行数据切分成一个个的单词组成一个集合
        DataStream<String> wordDS = text.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public void flatMap(String s, Collector<String> collector) throws Exception {
                // 参数s代表一行行的文本数据,将其切割为一个个的单词
                String[] words = s.split(" ");
                // 将切割的每一个单词收集起来成为一个集合
                for (String word : words) {
                    collector.collect(word);
                }
            }
        });
        // 3.2 使集合中的每一个单词记为1,组成一个二元组
        DataStream<Tuple2<String, Integer>> wordAndOnesDS = wordDS.map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String s) throws Exception {
                // 此处的s就是传过来的一个个单词,他跟1组成一个二元组
                return Tuple2.of(s, 1);
            }
        });
        // 3.3 对新的集合按照key,也就是单词进行分组
        KeyedStream<Tuple2<String, Integer>, String> groupDS = wordAndOnesDS.keyBy(t -> t.f0);//lambda形式,fo表示二元组的第一个元素
        // 3.4 对数据进行聚合
        DataStream<Tuple2<String, Integer>> aggResult = groupDS.sum(1);//此处的1表示二元组的第二个元素
        // 3.5 对结果进行排序
        //DataSet<Tuple2<String, Integer>> result = aggResult.sortPartition(1, Order.DESCENDING).setParallelism(1);
        // 4.输出结果:sink
        aggResult.print();
        //把结果储存到hdfs上
        System.setProperty("HADOOP_USER_NAME", "root");
        aggResult.writeAsText("hdfs://hadoop001:9000/output/wordcount");
        // 5.触发执行
        // 对于DataSet如果有print,可以省略execute
        env.execute();
    }
}

14.添加对Hadoop的支持

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_38

15.在本地进行测试,查看结果

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_39

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_flink_40

16.重新打包,上传服务器

重新打包:

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_41

上传服务器:

注意:这里建议先关闭 IDEA,然后重新打开jar包所在目录,

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_42

删除本地测试产生的的输出文件夹:

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_hadoop_43

17.重新提交任务,并查看结果

flink run -m yarn-cluster -yjm 1024  -ytm  1024 -c cn.edu.hgu.bigdata20.flink.WordCountDataStream Flink-DataSet-Demo-1.0-SNAPSHOT.jar

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_44

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_45

web ui查看

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_apache_46

查看结果

Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示 flink使用案例_大数据_47