导航

一.IDEA本地调试运行

二.使用linux命令提交任务运行

三 使用web页面提交任务

四 spark on yarn 提交任务

 

---------------------------------------------------------------------------------------------------------------------------------------------------------

 

一.IDEA本地调试运行

1.首先安装nc用于制造实时数据

下载地址 https://eternallybored.org/misc/netcat/

flink17 查询结果集 遍历 flink 统计_jar

 360会提示这个文件有病毒,会自动隔离这个文件,恢复文件后才能通过端口发送实时数据,恢复后解压文件

flink17 查询结果集 遍历 flink 统计_apache_02

 

2.启动nc

没有配置环境可以直接指定nc.exe直接启动nc发送数据

flink17 查询结果集 遍历 flink 统计_apache_03

配置过环境变量使用直接使用nc启动

flink17 查询结果集 遍历 flink 统计_jar_04

3. 编写flink代码

pom坐标

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

java代码

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.ReduceFunction;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.datastream.WindowedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.util.Collector;


/**
 * Flink 单次统计
 */
public class SocketWindowWordCount {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //获取端口9999的数据 需要先启动nc (执行命令 nc -l -p 9999),否则显示连接拒绝
        DataStream<String> text = env.socketTextStream("localhost", 9999, "\n");
        //对接收到的数据进行切割,并记录次数为1
        //使用FlatMapFunction必须显示指定泛型类型,使用(FlatMapFunction<String, Tuple2>) (value, out) ->{}这一种语法会报错
        SingleOutputStreamOperator<Tuple2<String, Long>> flatMap = text.flatMap(new FlatMapFunction<String, Tuple2<String, Long>>() {
            @Override
            public void flatMap(String value, Collector<Tuple2<String, Long>> out) throws Exception {
                for (String word : value.split(",")) {
                    out.collect(new Tuple2<>(word, 1L));//单次记录
                }
            }
        });
        // 对KV对象的word成员变量进行分区计算
        KeyedStream<Tuple2<String, Long>, String> word = flatMap.keyBy(new KeySelector<Tuple2<String, Long>, String>() {
            @Override
            public String getKey(Tuple2<String, Long> tp2) throws Exception {
                return tp2.f0;
            }
        });
        //时间窗口长度为5秒,窗口移动为1秒进行计算
        WindowedStream<Tuple2<String, Long>, String, TimeWindow> windowedStream = word.timeWindow(Time.seconds(5), Time.seconds(1));
        // 统计具有相同的key
        SingleOutputStreamOperator<Tuple2<String, Long>> windowCounts = windowedStream.reduce(new ReduceFunction<Tuple2<String, Long>>() {
            @Override
            public Tuple2<String, Long> reduce(Tuple2<String, Long> tp2_1, Tuple2<String, Long> tp2_2) throws Exception {
                return new Tuple2<>(tp2_1.f0, tp2_1.f1 + tp2_2.f1);
            }
        });
        //调试打印到控制台
        windowCounts.addSink(new PrintSinkFunction<>());//添加addSink,打印到控制台
        env.execute("Socket Window WordCount"); //开始执行
    }
}

4.启动java的main方法后进入dos界面通过nc发送数据

flink17 查询结果集 遍历 flink 统计_flink_05

控制台中实时显示通过过过nc发送的数据

二.使用linux命令提交任务运行

1. 官网安装flink (官网地址 https://flink.apache.org/zh/    中文官网)

下载地址 https://mirror.bit.edu.cn/apache/flink/flink-1.11.1/flink-1.11.1-bin-scala_2.12.tgz

 flink分为scala_2.11和scala_2.12两种类型不兼容,可以根据之前项目选择的scala版本下载保持scala版本一致

2.下载完成后解压配置环境变量

flink17 查询结果集 遍历 flink 统计_apache_06

# flink
export FLINK_HOME=/home/flink/flink-1.11.1
export PATH=$PATH:$FLINK_HOME/bin

更新环境变量

source /etc/profile

3.启动flink集群

start-cluster.sh

4.检查flink角色状态

[root@yc3 flink-1.11.1]# jps
22724 Jps
10501 TaskManagerRunner
10204 StandaloneSessionClusterEntrypoint

访问默认的任务管理页面 127.0.0.1:8081

5.测试flink的计算功能

开启nc任务

nc -l -p 9999

启动flink的单词统计计算任务

flink run ../examples/streaming/SocketWindowWordCount.jar   --hostname 127.0.0.1 --port 9999

查看页面的任务状态

flink17 查询结果集 遍历 flink 统计_jar_07

 实时查看日志

tail -f <flink_home>/log/flink-root-taskexecutor-0-localhost.out

flink17 查询结果集 遍历 flink 统计_jar_08

通过nc发送数据

flink17 查询结果集 遍历 flink 统计_flink_09

查看打印结果

flink17 查询结果集 遍历 flink 统计_flink_10

功能正常

 

6.测试使用自定义java代码提交执行任务

使用一步骤中的代码打包上传服务器, 提交任务  -c 后面跟运行的main全类名

flink run  -c  SocketWindowWordCount ./test.jar

参数解析

-c 指定main方法的全类名
-p 指定并行度
-m 指定jobmanager的地址 默认localhost:8081

启动后使用nc发送数据,查看日志文件

flink17 查询结果集 遍历 flink 统计_apache_11

日志文件

flink17 查询结果集 遍历 flink 统计_flink17 查询结果集 遍历_12

linux 提交任务完成

 

三 使用web页面提交任务

1.进入管理任务页面上传jar程序

flink17 查询结果集 遍历 flink 统计_flink17 查询结果集 遍历_13

2.编写参数并运行任务

flink17 查询结果集 遍历 flink 统计_flink17 查询结果集 遍历_14

参数解释

flink17 查询结果集 遍历 flink 统计_flink_15

3.使用nc工具发送数据并查看日志文件

 

flink17 查询结果集 遍历 flink 统计_apache_16

一切正常

flink17 查询结果集 遍历 flink 统计_jar_17

 

 

四 spark on yarn 提交任务

使用spark on yarn 提交任务 需要依赖flink启动脚本和yarn集群,不需要启动flink集群

1.添加依赖配置

flink17 查询结果集 遍历 flink 统计_flink_18

 将hadoop和yarn配置环境变量,并配置HADOOP_CONF_DIR与HADOOP_CLASSPATH

#FLINK
export FLINK_HOME=/home/tools/flink/flink-1.11.2
export PATH=$FLINK_HOME/bin:$PATH

#HADOOP
export HADOOP_HOME=/home/tools/hadoop/hadoop-2.7.3
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_CLASSPATH=`$HADOOP_HOME/bin/hadoop classpath`

2.刷新环境变量

flink17 查询结果集 遍历 flink 统计_apache_19

3.提交任务 (yarn已经启动成功后再提交flink任务)

flink run \
    -m yarn-cluster \
    -ynm myapp \
    -d -c com.Stream ./myapp.jar

flink17 查询结果集 遍历 flink 统计_flink_20

4.查看yarn任务管理(All Applications)控制台 默认端口8088

flink17 查询结果集 遍历 flink 统计_apache_21

5.跳转UI界面

flink17 查询结果集 遍历 flink 统计_apache_22

6.启动参数解释

  • -m 运行模式,这里使用yarn-cluster,即yarn集群模式。
  • -ys slot个数。
  • -ynm Yarn application的名字。
  • -yjm job manager 的堆内存大小。
  • -ytm task manager 的堆内存大小。
  • -d detach模式。可以运行任务后无需再控制台保持连接。
  • -c 指定jar包中class全名。

7.启动方式二 使用yarn session的方式

  yarn session方式需要单独启动一个任务去yarn集群中申请一块资源空间,这块空间一直存在,后续所有任务都需要提交到刚才申请的空间中

flink17 查询结果集 遍历 flink 统计_jar_23


  1) 启动 yarn session

yarn-session.sh -n 2 -jm 1024 -tm 1024 -d -s 2

 

参数解释

-n 2 表示指定两个容器 
-jm 1024 表示jobmanager 1024M内存 
-tm 1024表示taskmanager 1024M内存 
-d --detached  任务后台运行 
-s  指定每一个taskmanager分配多少个slots(处理进程)。建议设置为每个机器的CPU核数
-nm, YARN上为一个自定义的应用设置一个名字
-q, 显示yarn中可用的资源 (内存, cpu核数)
-qu, 指定YARN队列.
-z,针对HA模式在zookeeper上创建NameSpace

flink17 查询结果集 遍历 flink 统计_flink17 查询结果集 遍历_24

 application中出现了 任务Flink session cluster ,后续所有需要计算的任务都会提交当Flink session cluster的资源容器内部

flink17 查询结果集 遍历 flink 统计_flink_25

 2) 提交任务

 

flink run examples/batch/WordCount.jar

 

flink17 查询结果集 遍历 flink 统计_apache_26

flink集群ui界面中出现了新任务

flink17 查询结果集 遍历 flink 统计_apache_27