Flink流批一体计算(7):Flink优化

目录

配置内存

设置并行度

操作场景

具体设置

补充

配置进程参数

操作场景

具体配置

配置netty网络通信

操作场景

具体配置

配置内存

Flink是依赖内存计算,计算过程中内存不够对Flink的执行效率影响很大。可以通过监控GCGarbage Collection),评估内存使用及剩余情况来判断内存是否变成性能瓶颈,并根据情况优化。

监控节点进程的YARNContainer GC日志,如果频繁出现Full GC,需要优化GC

conf/flink-conf.yaml

env.java.opts: -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+AlwaysPreTouch -server
-XX:+HeapDumpOnOutOfMemoryError

调整老年代和新生代的比值。env.java.opts配置项中添加参数:-XX:NewRatio。

如“-XX:NewRatio=2,则表示老年代与新生代的比值为2:1,新生代占整个堆空间的1/3,老年代占2/3。

设置并行度

操作场景

并行度控制任务的数量,影响操作后数据被切分成的块数。调整并行度让任务的数量和每个任务处理的数据与机器的处理能力达到最优。

查看CPU使用情况和内存占用情况,当任务和数据不是平均分布在各节点,而是集中在个别节点时,可以增大并行度使任务和数据更均匀的分布在各个节点。增加任务的并行度,充分利用集群机器的计算能力。

具体设置

任务的并行度可以通过以下四种层次(按优先级从高到低排列)指定,用户可以根据实际的内存、CPU、数据以及应用程序逻辑的情况调整并行度参数。

  • 算子层次

一个算子、数据源和sink的并行度可以通过调用setParallelism()方法来指定,例如

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> text = [...]
DataStream<Tuple2<String, Integer>> wordCounts = text
    .flatMap(new LineSplitter())
    .keyBy(0)
    .timeWindow(Time.seconds(5))
    .sum(1).setParallelism(5);
wordCounts.print();
env.execute("Word Count Example");
  • 执行环境层次

Flink程序运行在执行环境中。执行环境为所有执行的算子、数据源、data sink定义了一个默认的并行度。

执行环境的默认并行度可以通过调用setParallelism()方法指定。例如:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(3);
DataStream<String> text = [...]
DataStream<Tuple2<String, Integer>> wordCounts = [...]
wordCounts.print();
env.execute("Word Count Example");
  • 客户端层次

并行度可以在客户端将job提交到Flink时设定。对于CLI客户端,可以通过“-p”参数指定并行度。例如:

./bin/flink run -p 10 ../examples/*WordCount-java*.jar
  • 系统层次

在系统级可以通过修改Flink客户端conf目录下的“flink-conf.yaml”文件中的“parallelism.default”配置选项来指定所有执行环境的默认并行度。

补充

开发Flink应用程序时,优化DataStream的数据分区或分组操作。

  • 当分区导致数据倾斜时,需要考虑优化分区。
  • 避免非并行度操作,有些对DataStream的操作会导致无法并行,例如WindowAll。
  • keyBy尽量不要使用String。

配置进程参数

操作场景

Flink on YARN模式下,有JobManagerTaskManager两种进程。在任务调度和运行的过程中,JobManagerTaskManager承担了很大的责任。

因而JobManagerTaskManager的参数配置对Flink应用的执行有着很大的影响意义。用户可通过如下操作对Flink集群性能做优化。

具体配置

  • 配置JobManager内存

JobManager负责任务的调度,以及TaskManager、RM之间的消息通信。当任务数变多,任务并行度增大时,JobManager内存都需要相应增大。

您可以根据实际任务数量的多少,为JobManager设置一个合适的内存。

        在使用yarn-session命令时,添加“-jm MEM”参数设置内存。
        在使用yarn-cluster命令时,添加“-yjm MEM”参数设置内存。

  • 配置TaskManager个数

每个TaskManager每个核同时能跑一个task,所以增加了TaskManager的个数相当于增大了任务的并发度。在资源充足的情况下,可以相应增加TaskManager的个数,以提高运行效率。

  • 配置TaskManager Slot数

每个TaskManager多个核同时能跑多个task,相当于增大了任务的并发度。但是由于所有核共用TaskManager的内存,所以要在内存和核数之间做好平衡。

        在使用yarn-session命令时,添加“-s NUM”参数设置SLOT数。
        在使用yarn-cluster命令时,添加“-ys NUM”参数设置SLOT数。

  • 配置TaskManager内存

TaskManager的内存主要用于任务执行、通信等。当一个任务很大的时候,可能需要较多资源,因而内存也可以做相应的增加。

        将在使用yarn-session命令时,添加“-tm MEM”参数设置内存。
        将在使用yarn-cluster命令时,添加“-ytm MEM”参数设置内存。

配置netty网络通信

操作场景

Flink通信主要依赖netty网络,所以在Flink应用执行过程中,netty的设置尤为重要,网络通信的好坏直接决定着数据交换的速度以及任务执行的效率。

具体配置

以下配置均可在客户端的“conf/flink-conf.yaml”配置文件中进行修改适配,默认已经是相对较优解,请谨慎修改,防止性能下降。

  • taskmanager.network.netty.num-arenas:

默认是taskmanager.numberOfTaskSlots,表示netty的域的数量。

  • taskmanager.network.netty.server.numThreads和taskmanager.network.netty.client.numThreads:

默认是taskmanager.numberOfTaskSlots,表示netty的客户端和服务端的线程数目设置。

  • taskmanager.network.netty.client.connectTimeoutsec:

默认是120s,表示taskmanager的客户端连接超时的时间。

  • taskmanager.network.netty.sendReceiveBufferSize:

默认是系统缓冲区大小(cat /proc/sys/net/ipv4/tcp_[rw]mem) ,一般为4MB,表示netty的发送和接收的缓冲区大小。

  • taskmanager.network.netty.transport:

默认为nio方式,表示netty的传输方式,有nio和epoll两种方式。

猜你喜欢

转载自blog.csdn.net/victory0508/article/details/131436357