大数据开发Flink批处理(第四十五篇)

90 阅读2分钟

一、Flink批处理

  1. 先把hello.txt文件上传到hdfs文件中

    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello me
    hello you
    

    hdfs dfs -put /root/hello.txt /

    image-20230114133802458

  2. java批处理代码实现

    package com.strivelearn.flink;
    ​
    import org.apache.flink.api.common.functions.FlatMapFunction;
    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;
    ​
    ​
    /**
     * @author strivelearn
     * @version BatchWordCountJava.java, 2023年01月14日
     */
    public class BatchWordCountJava {
        public static void main(String[] args) throws Exception {
            // 获取执行环境
            ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
            String inputPath = "hdfs://192.168.234.100:9000/hello.txt";
            String outPath = "hdfs://192.168.234.100:9000/out2";
            // 读取文件中的数据
            DataSource<String> text = env.readTextFile(inputPath);
    ​
            AggregateOperator<Tuple2<String, Integer>> wordCount = text.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
                @Override
                public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
                    String[] words = s.split(" ");
                    for (String word : words) {
                        collector.collect(new Tuple2<>(word, 1));
                    }
                }
            }).groupBy(0).sum(1).setParallelism(1);
    ​
            // 将结果数据保存到文件中
            wordCount.writeAsCsv(outPath, "\n", " ");
            env.execute("BatchWordCountJava");
        }
    }
    ​
    

此时我们上面的代码还需要引入hadoop-client

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>3.3.4</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
            <artifactId>slf4j-reload4j</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

image-20230114135755665

执行完毕后,在hdfs可以看到out文件

image-20230114135827250

查看Flink的计算结果内容:

hdfs dfs -cat /out2

1.1、批处理与流处理的区别
  1. Streaming:StreamExecutionEnvironment+DataSteam
  2. Batch:ExecutionEnvironment+DataSet

二、Flink ON YARN安装

  1. Flink ON YARN模式依赖Hadoop 2.4.1及以上版本
  2. Flink ON YARN支持两种使用方式

Flink ON YRAN两种使用方式

第一步:yarn-session.sh创建Flink集群

第二步:flink run 提交任务

flink.apache.org/ 官网

下载archive.apache.org/dist/flink/…

image-20230114150405512

  1. 上传到虚拟机

  2. 解压

    tar -zxvf flink-1.16.0-bin-scala_2.12.tgz

  3. 设置hadoop的环境变量

    vi etc/profile

    export HADOOP_HOME=/root/software/hadoop-3.3.4 export HADOOP_CLASSPATH=${HADOOP_HOME}/bin/hadoop classpath

  4. 生效环境变量配置

    source /etc/profile

  5. 进入flink目录

    bin/yarn-session.sh -jm 1024m -tm 1024m -d

    -jm 是主节点内存

    -tm 是从节点内存

    -d 是后台进行运行

image-20230114170513422

或者在Yarn也可以查看 http://192.168.234.100:8088/cluster

image-20230114170623782

运行测试的case

bin/flink run ./examples/batch/WordCount.jar

image-20230114182750661

启动的时候会找这个配置文件

image-20230114183035861

more /tmp/.yarn-properties-root

image-20230114183116415

image-20230114183144991

与这边的id是一致

image-20230114183318309

永久停止存在的Flink集群

相当于就是把yarn的进程kill掉

yarn application -kill application_1673181686068_0001

三、yarn-session命令分析

用法说明
-D 动态属性
-d, --detached放到后台,独立运行
-j,--jar 指定Flink任务的jar包
-jm,--jobManagerMemory JobManager的内存 [im MB]
-nm,--name在Yarn上为一个自定义的应用设置一个名字
-q,--query显示yarn中可用的资源(内存,cpu核数)
-qu,--queue 指定Yarn队列
-s,--slots 每个TaskMananager使用的slots数量
-tm, --taskManagerMemory 每个TaskManager的内存 [in MB]

四、Flink ON Yarn的第二种方式

flink run -m yarn-cluster 创建flink集群+提交任务

eg:

flink run -m yarn-cluster -yjm 1024 -ytm 1024 ./examples/batch/WordCount.jar

4.1、Flink run命令分析
  1. -c,--class 动态指定jar包入口类
  2. -m,--jobmanager host:port 动态指定jobmanager(主节点)地址
  3. -p,--parallelism 动态指定程序的并行度,可以覆盖配置文件中的默认值

默认查找本机 /tmp/.yarn-properties0-root中的节点信息

bin/flink run ./examples/batch/WordCount.jar

连接指定host和port的jobmanager:

bin/flink run -m bigdata01:1234 ./examples/batch/WordCount.jar

启动一个新的yarn-session

bin/flink run -m yarn-cluster -yn 2 ./examples/batch/WordCount.jar

五、Flink ON YARN的好处

  1. 提高大数据集群机器的利用率
  2. 一套集群,可以执行MR任务,Spark任务,Flink任务等