Flink组件

Flink 组件

Master :

  1. AppMaster(AM), AM包含以下三个组件:

    1. Dispatcher: Dispatcher负责接收用户提供的作业,并且负责为这个新提交的作业拉起一个新的 JobManager 组件.
    2. JobManage: 每个job都有一个属于自己的JM.
    3. ResourceMange: 一个集群只有一个RM,负责资源的管理.

SlotManager(属于ResourceManage的子组件): 它维护了当前集群中所有 TaskExecutor上的 Slot 的信息与状态, 如该 Slot 在哪个 TaskExecutor 中,该 Slot 当前是否空闲等。

Slave:

  1. TaskManage(TM): 包含以下组件

    1. TaskExecutor: 实际任务的执行者,它可能有多个槽位,每个槽位执行一个具体的子任务
    2. Slot: 目前 Flink 中 TaskExecutor 的资源是通过 Slot 来描述的,一个 Slot 一般可以执行一个具体的 Task,但在一些情况下也可以执行多个相关联的 Task。

Client:

        当用户提交一个Flink程序时,会首先创建一个Client,该Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群中处理,所以Client需要从用户提交的Flink程序配置中获取JobManager的地址,并建立到JobManager的连接,将Flink Job提交给JobManager。Client会将用户提交的Flink程序组装一个JobGraph, 并且是以JobGraph的形式提交的。一个JobGraph是一个Flink Dataflow,它由多个JobVertex组成的DAG。其中,一个JobGraph包含 了一个Flink程序的如下信息:JobID、Job名称、配置信息、一组JobVertex等。

TaskExecutor 是实际任务的执行者,它可能有多个槽位,每个槽位执行一个具体的子任务。每个 TaskExecutor 会将自己的槽位注册到 SlotManager 上,并汇报自己的状态,是忙碌状态,还是处于一个闲置的状态

SlotManager 既是 Slot 的管理者,也负责给正在运行的任务提供符合需求的槽位。还记录了当前积压的槽位申请。当槽位不够的时候向Flink的ResourceManager申请容器。

Pending slots 积压的 Slot 申请及计数器

Flink 的 ResourceManager 则负责了与 Yarn 的 ResourceManager 进行交互,进行一系列例如申请容器,启动容器,处理容器的退出等等操作。因为采用的是异步申请的方式,所以还需要记录当前积压的容器申请,防止接收过多容器。

Pending container request 积压容器的计数器

AMRMClient 是异步申请的执行者,CallbackHandler 则在接收到容器和容器退出的时候通知 Flink 的 ResourceManager。

Yarn 的 ResourceManager 则像是一个资源的分发器,负责接收容器请求,并为 Client 准备好容器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一个简单的 Apache Flink 程序的样例代码: ``` import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class FlinkExample { public static void main(String[] args) throws Exception { // 创建执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 创建数据流 DataStream<String> dataStream = env.fromElements("Hello", "Flink", "Streaming"); // 数据流的转换操作 DataStream<String> result = dataStream .map(word -> word.toUpperCase()) .filter(word -> word.length() > 4) .print(); // 执行程序 env.execute("Flink Example"); } } ``` 这是一个简单的 Flink 程序,利用了 `map` 和 `filter` 操作对数据流进行转换,最终使用 `print` 操作将结果打印到控制台。 ### 回答2: 下面是一个简单的Flink组件的样例代码,该代码展示了如何使用Flink实现一个WordCount的功能: ```java 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 WordCount { public static void main(String[] args) throws Exception { // 设置执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 创建数据流 DataStream<String> text = env.socketTextStream("localhost", 9999); // 对数据流进行转换操作 DataStream<Tuple2<String, Integer>> counts = text .flatMap(new Tokenizer()) .keyBy(0) .sum(1); // 打印结果 counts.print(); // 执行任务 env.execute("WordCount"); } 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("\\W+"); // 发出每个单词的计数为1 for (String word : words) { if (word.length() > 0) { out.collect(new Tuple2<>(word, 1)); } } } } } ``` 上述代码中,首先通过`StreamExecutionEnvironment.getExecutionEnvironment()`方法获取Flink的执行环境。然后调用`socketTextStream("localhost", 9999)`方法创建一个输入的数据流,该数据流来自本地主机的9999端口。接着,使用`flatMap()`方法对数据流进行转换操作,把每一行文本拆分为单词并计数为1。接下来,使用`keyBy(0)`方法根据单词进行分组,并使用`sum(1)`方法对相同单词的计数进行求和。最后,通过`print()`方法打印结果,并调用`env.execute("WordCount")`方法执行任务。 ### 回答3: 好的,下面是一个简单的 Flink 组件的样例代码: ```java import org.apache.flink.api.common.functions.FilterFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class FlinkComponentExample { public static void main(String[] args) throws Exception { // 创建一个执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 从 socket 获取输入数据流 DataStream<String> dataStream = env.socketTextStream("localhost", 9999); // 将输入数据流解析为 Tuple2 对象 DataStream<Tuple2<String, Integer>> tupleStream = dataStream .flatMap((String line, Collector<Tuple2<String, Integer>> out) -> { String[] words = line.split(" "); for (String word : words) { if (word.length() > 0) { out.collect(new Tuple2<>(word, 1)); } } }) .returns(Types.TUPLE(Types.STRING, Types.INT)); // 对 Tuple2 数据流进行过滤,只保留长度大于等于 5 的单词 DataStream<Tuple2<String, Integer>> filteredStream = tupleStream .filter((FilterFunction<Tuple2<String, Integer>>) value -> value.f0.length() >= 5); // 输出过滤后的结果 filteredStream.print(); // 执行任务 env.execute("Flink Component Example"); } } ``` 这个样例代码实现了一个简单的 Flink 组件,实现了读取输入数据流、解析数据、过滤数据并输出过滤结果的功能。代码中使用了 Flink 的 DataStream API,通过创建执行环境、从 socket 获取输入数据流、对数据流进行转换和过滤等操作来实现所需功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值