Flink的简介
  • Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。
  • Flink的主要特点
    事件驱动
    【Flink】Flink的简介和简单的使用_大数据
    基于流的世界观:在 Flink 的世界观中,一切都是由流组成的,离线数据是有界的流;实时数据是一个没有界限的流:这就是所谓的有界流和无界流
    【Flink】Flink的简介和简单的使用_大数据_02
    分层API:➢越顶层越抽象,表达含义越简明,使用越方便,越底层越具体,表达能力越丰富,使用越灵活
创建项目

【Flink】Flink的简介和简单的使用_maven_03
【Flink】Flink的简介和简单的使用_big data_04

  • 修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>FlinkTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.10.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.12</artifactId>
            <version>1.10.1</version>
        </dependency>
    </dependencies>

</project>

跳转顶部


编写代码

批处理

  • 数据展示
hadoop spark scala
flink hadoop scala
flink hadoop
  • 具体代码
package WordCount;

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.DataSource;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;

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

        //从文件中读取数据
        String inputPath = "E:\\IDEA\\IntelliJ IDEA 2019.1\\bm\\FlinkTest\\src\\main\\resources\\WordCount.txt";
        //dataSource其实就是一个dataSet
        DataSource<String> stringDataSource = env.readTextFile(inputPath);

        //对数据集来进行处理
        DataSet<Tuple2<String, Integer>> result = stringDataSource.flatMap(new MyFlatMapper())//按照空格来进行分词
                .groupBy(0)//按照第一个位置来进行分组
                .sum(1);//按照第二个位置的元素来进行聚合

        result.print();
    }

    //自定义类来实现FlatMapFunction接口
    //第一个String是输入的数据类型
    //第二个就是输出的数据类型
    public static class MyFlatMapper implements FlatMapFunction<String, Tuple2<String, Integer>> {

        @Override
        public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
            //按照空格来进行分词
            String[] words = s.split(" ");
            //遍历所有word包装成二元组输出
            for (String word : words) {
                collector.collect(new Tuple2<>(word, 1));
            }
        }
    }
}
  • 结果展示
    【Flink】Flink的简介和简单的使用_大数据_05

跳转顶部


流处理

  • 具体代码
package WordCount;

import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

//流处理
public class WordCountStream {
    public static void main(String[] args) throws Exception {
        //创建流处理的执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(8);//设置线程数

        //使用parameter tool工具从程序启动参数中提取配置
        ParameterTool parameterTool = ParameterTool.fromArgs(args);
        String host = parameterTool.get("host");
        int port = parameterTool.getInt("port");

        //从socket文本流读取数据
        DataStream<String> inputStream = env.socketTextStream(host, port);

        //基于数据流集训转换操作
        SingleOutputStreamOperator<Tuple2<String, Integer>> result = inputStream.flatMap(new WordCountTest01.MyFlatMapper())
                .keyBy(0)//与groupBy相似,按照key的hashCode
                .sum(1).setParallelism(3);

        result.print().setParallelism(1);

        //启动任务,否则不会执行
        env.execute();
    }
}
  • 修改启动项
    【Flink】Flink的简介和简单的使用_大数据_06
    【Flink】Flink的简介和简单的使用_大数据_07
  • 运行测试
    先运行代码,然后在虚拟机中运行如下内容
    【Flink】Flink的简介和简单的使用_maven_08
  • 在窗口输出内容,然后在控制台窗口结果
  • 【Flink】Flink的简介和简单的使用_maven_09

跳转顶部


打包运行

【Flink】Flink的简介和简单的使用_big data_10
【Flink】Flink的简介和简单的使用_flink_11
【Flink】Flink的简介和简单的使用_apache_12
【Flink】Flink的简介和简单的使用_大数据_13
【Flink】Flink的简介和简单的使用_flink_14
【Flink】Flink的简介和简单的使用_big data_15

图形界面画的运行

  • 登录上WEBUI
  • 将jar包提交
    【Flink】Flink的简介和简单的使用_big data_16
  • 填上参数
    【Flink】Flink的简介和简单的使用_big data_17
  • 点击show plan可以看到每步的分区数
    【Flink】Flink的简介和简单的使用_maven_18
  • 点击提交,如果一直是转圈,说明是词到不够,我们可以增加后再次运行
    【Flink】Flink的简介和简单的使用_flink_19
  • 运行成功的样子,这是就可以通过Linux来输入流数据了
    【Flink】Flink的简介和简单的使用_big data_20
  • 发现当我们输入时数据是在变化的
    【Flink】Flink的简介和简单的使用_flink_21
  • 如何查看结果?
    【Flink】Flink的简介和简单的使用_maven_22
    【Flink】Flink的简介和简单的使用_big data_23

跳转顶部


命令行运行

  • 运行命令:bin/flink run -c WordCount.WordCountStream -p 2 /home/data/FlinkTest.jar --host 192.168.0.149 --port 7777

  • 查看所有正在运行的job:bin/flink list
    【Flink】Flink的简介和简单的使用_大数据_24

  • 杀死job:``
    【Flink】Flink的简介和简单的使用_maven_25

  • 查看已经杀死的job:``
    【Flink】Flink的简介和简单的使用_maven_26

跳转顶部