当前位置:   article > 正文

FlinkJob内部结构介绍_flink job

flink job

一、FlinkJob内部结构介绍

FlinkJobApache Flink的一个概念,用于描述一个Flink应用程序的逻辑结构。一个FlinkJob通常由多个任务(task)组成,一个任务可以是一个算子(operator)或者是一个数据源(source)或者是一个数据汇(sink)。一个Flink作业可以包含多个任务,它们可以相互依赖和并行执行。

FlinkJob的内部结构可以分为以下几个部分:

  1. 作业图(JobGraph):作业图是一个有向无环图(DAG),它描述了作业中的任务以及它们之间的依赖关系。作业图由任务节点(TaskNode)和边(Edge)组成,每个任务节点代表一个任务,边表示任务之间的数据流。作业图的构建过程通常通过FlinkAPI来完成。
  2. 任务(Task):任务是作业图中的一个节点,代表一个可执行的操作。在Flink中,任务可以是一个算子(operator)、一个数据源(source)或者一个数据汇(sink)。任务可以并行执行,一个任务可以被分配到一个或多个任务插槽(task slot)上执行。
  3. 算子(Operator):算子是Flink中的一个概念,代表一个数据转换操作。Flink提供了丰富的算子,包括MapFilterReduceJoin等。算子可以被组合成一个算子链(operator chain),形成一个复杂的数据处理逻辑。
  4. 数据源(Source):数据源是一个任务,用于从外部系统读取数据并将其转换为DataStreamFlink提供了多种数据源,包括KafkaSocket、文件等。数据源可以并行读取数据,并将数据分发给下游任务进行处理。
  5. 数据汇(Sink):数据汇是一个任务,用于将DataStream中的数据写入外部系统。Flink提供了多种数据汇,包括Kafka、文件、数据库等。数据汇可以并行写入数据,从而提高写入的吞吐量。

二、参数介绍和完整代码案例

下面我们以一个简单的WordCount程序为例,介绍FlinkJob的参数和完整代码案例。WordCount程序用于统计文本中每个单词出现的次数。

1.参数介绍:

  • inputFilePath: 输入文件路径。
  • outputFilePath: 输出文件路径。

2.完整代码案例: 

import org.apache.flink.api.common.functions.FlatMapFunction;

import org.apache.flink.api.java.tuple.Tuple2;

import org.apache.flink.streaming.api.datastream.DataStream;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import org.apache.flink.util.Collector;

public class WordCountJob {

    public static void main(String[] args) throws Exception {

        // 创建执行环境

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 读取输入数据

        DataStream<String> input = env.readTextFile(args[0]);

        // 执行WordCount操作

        DataStream<Tuple2<String, Integer>> wordCounts = input

                .flatMap(new Tokenizer())

                .keyBy(0)

                .sum(1);

        // 输出结果到文件

        wordCounts.writeAsText(args[1]);

        // 执行作业

        env.execute("WordCountJob");

    }

    public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> {

        @Override

        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {

            // 将输入字符串按空格分割为单词

            String[] words = value.toLowerCase().split("\\s+");

            // 发射每个单词的计数为1

            for (String word : words) {

                if (word.length() > 0) {

                    out.collect(new Tuple2<>(word, 1));

                }

            }

        }

    }

}

三、总结

以上代码实现了一个简单的WordCount程序。首先,我们创建了一个StreamExecutionEnvironment对象,用于设置执行环境。然后,通过env.readTextFile方法读取输入文件,并将其转换为DataStream。接下来,我们定义了一个Tokenizer类,用于将输入字符串按空格分割为单词,并发射每个单词的计数为1。然后,我们对DataStream进行flatMap操作,将每个单词转换为一个Tuple2对象,并通过keyBy方法对单词进行分组。最后,我们通过sum方法对每个单词的计数进行累加,并将结果写入输出文件。最后,我们调用env.execute方法执行作业。

通过以上代码,我们可以看到FlinkJob的内部结构,包括作业图、任务、算子、数据源和数据汇等组成部分。通过设置好这些组件,我们可以构建出一个完整的Flink作业,并在Flink集群上执行。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号