Flink个人随笔

1、Flink参数配置

  • jobmanger.rpc.address:jobmanger的地址
  • jobmanger.rpc.port:jobmanger的端口
  • jobmanager.heap.mb:jobmanager的堆内存大小。不建议配的太大,1-2G足够。
  • taskmanager.heap.mb:taskmanager的堆内存大小。大小视任务量而定。需要存储任务的中间值,网络缓存,用户数据等。
  • taskmanager.numberOfTaskSlots:slot数量。
    • 在yarn模式使用的时候会受到yarn.scheduler.maximum-allocation-vcores值的影响。
    • 此处指定的slot数量如果超过yarn的maximum-allocation-vcores,flink启动会报错。
    • 在yarn模式,flink启动的task manager个数可以参照如下计算公式:num_of_manager = ceil(parallelism / slot)  即并行度除以slot个数,结果向上取整。

slot 与 cpu的关系
每个Flink TaskManager在集群中提供处理槽。 插槽的数量通常与每个TaskManager的可用CPU内核数成比例。一般情况下你的slot数是你每个TM的cpu的核数。
经验上讲Slot的数量与CPU-core的数量一致为好。但考虑到超线程,可以让slotNumber=2*cpuCore.
例如我们这里有6个slot,所以给3 或者 6个core比较好
slot 与并行度
严格来说 我们设置task的并行度不能超过slot的数量,比如我们这里slot数量是6,那么最大的并行度也就是6
.

  • parallelsm.default:任务默认并行度,如果任务未指定并行度,将采用此设置。
  • web.port: Flink web ui的端口号。
  • jobmanager.archive.fs.dir: 将已完成的任务归档存储的目录。
  • history.web.port: 基于web的history server的端口号。
  • historyserver.archive.fs.dir:history server的归档目录。该配置必须包含jobmanager.archive.fs.dir配置的目录,以便history server能够读取到已完成的任务信息
  • historyserver.archive.fs.refresh-interval: 刷新存档作业目录时间间隔
  • state.backend: 存储和检查点的后台存储。可选值为rocksdb、filesystem、hdfs。
  • state.backend.fs.checkpointdir:检查点数据文件和元数据的默认目录。
  • state.checkpoints.dir:保存检查点的目录
  • state.savepoints.dir:save point的目录
  • state.checkpoints.num-retained:保留最近检查点的数量
  • state.backend.incremental:增量存储
  • akka.ask.timeout:jobmanager和task manager通信连接的超时时间。如果网络拥挤经常出现超时错误,可以增大该配置
  • akka.watch.heartbeat.interval:心跳发送间隔,用来检测task manager的状态
  • akka.watch.heartbeat.pause:如果超过该时间仍未收到task manager的心跳,该task manager会被认为已挂掉
  • taskmanager.network.memory.max:网络缓存区最大内存大小
  • taskmanager.network.memory.min:网络缓存区最小内存大小
  • taskmanager.network.memory.fraction:网络缓冲区使用的内存占用总JVM内存的比例。如果配置了taskmanager.network.memory.max和taskmanager.network.memory.min的配置会被覆盖
  • fs.hdfs.hadoopconf:hadoop配置文件路径(已被废弃,建议使用HADOOP_CONF_DIR环境变量)
  • yarn.application-attempts:job失败尝试次数,指jobmanager的重启尝试次数。该指不应该超过yarn-site.xml中的yarn.resourcemanager.am.max-attempts的值

2、Flink HA(Job Manager)的配置

  • high-availability:zookeeper

使用zookeeper负责HA实现

  • high-availability.zookeeper.path.root:/flink

flink信息在zookeeper存储节点的名称

  • high-availability.zookeeper.quorum:hadoop100:2181,hadoop101:2181,hadoop103:2181

zk集群节点的地址和端口

  • high-availability.storageDir: hdfs://nameservice/flink/ha/

job manager元数据在文件系统存储的位置,zk仅保存了指向该目录的指针

3、Flink metrics监控相关配置

  • metrics.reporters: prom
  • metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter
  • metrics.reporter.prom.port: 9250-9260

4、Kafka相关调优配置

linger.ms/batch.size:这两个配置项配合使用,可以在吞吐量和延迟中得到最佳的平衡点。

batch.size是kafka producer发送数据的批量大小,当数据量达到batch size的时候,会将这批数据发送出去,避免了数据一条一条的发送,频繁建立和断开网络连接。但是如果数据量比较小,导致迟迟不能达到batch.size,为了保证延迟不会过大,kafka不能无限等待数据量达到batch.size的时候才发送。为了解决这个问题,引入了linger.ms配置项。当数据在缓存中的时间超过linger.ms时,无论缓存中数据是否达到批量大小,都会被强制发送出去

kafka topic分区数和Flink并行度的关系

Flink Kafka source的并行度需要和kafka topic的分区数一致。最大化利用kafka多分区topic的并行读取能力

5、Yarn相关调优配置

  • yarn.scheduler.maximum-allocation-vcores
  • yarn.scheduler.minimum-allocation-vcores

Flink单个Task Manager的slot数量必须结余这两个值之间

Flink的Job Manager和Task Manager内存不得超过container最大分配内存大小

  • yarn.nodemanager.resource.cpu-vcores

yarn的虚拟cpu内核数,设置为物理机CPU核心数的2-3倍。设置的太少会导致CPU资源无法被充分利用,跑任务的时候CPU占用率不高。

处理函数是DataStream API的底层逻辑,提供了一个定时服务TimerService,可以用它访问流中的事件event、时间戳timestamp,水位线watermark,注册定时事件。

ProcessFunction解析

ProcessFunction类中:
1. processElement(输入类型,上下文,输入类型Collector)
	上下文中能获取到:时间戳、侧输出流、"timerService"
	timerService中能获取到:currentProcessingTime处理时间、currentWatermark事件时间、registerProcessingTimeTimer注册定时器、删除定时器。
	
2. onTimer()
	注册了定时器后,到点时会触发这个回调,这是定时到了后的处理方法。
	但是,只有基于KeyedStream才能定义定时器。

定时器只能在KeyedStream 上注册- 

stream.keyBy(data->data.user)
	.process(new KeyedProcessFunction<String, Event, String>(){
		@Override
		public void processElement(Event value, Context ctx, Collector<String> out) throws Exception(){
			Long currTs = ctx.timerService().currentProcessingTime();
			out.collect(ctx.getCurrentKey() + " 数据到达,到达时间:" + new Timestamp(currTs));
			// 注册一个10s后的定时器
			ctx.timerService().registerProcessingTimeTimer(currTs + 10 * 1000L);
		}
		
		@Override
		public void onTimer(long timestamp, OnTimerContext ctx, Collector<String> out) throws Exception() {
			out.collect(ctx.getCurrentKey() + " 定时器触发,触发时间:"+new Timestamp(timestamp));
		}
	
	})
1.flink 算子链的必要条件?
两个算子并行度相同。
两个算是1对1,比如map不能对应group by


2.窗口函数中的增量聚合函数和全窗口函数的区别?
增量聚合函数:是指在窗口内每个数据到来时都会进行计算,并且在计算时只需要考虑新到来的数据和已经计算出的部分结果。占用内存小。

全窗口函数:指在窗口所有数据到达后才会进行计算,并且需要将窗口内的所有数据都存储在内存中进行计算。占用内存大。

3.窗口触发时机?窗口怎么划分?

时间进展=》窗口的最大时间戳(end-1ms)
窗口划分:start = 向下取整,取窗口长度的整数倍。  end =start +窗口长度
窗口左闭右开

4.窗口的生命周期?
什么时候创建:事件驱动型。属于本窗口的第一条数据来的时候。
什么时候销毁:窗口的最大时间戳(end-1ms)+允许迟到的时间(默认为0)

flink的内存模型

Flink的状态编程: Flink状态编程

 Flink的ProcessFunction:  Flink处理函数ProcessFunction

Flink的TableApi和SQL: Table API 和 SQL 

Flink的容错机制: Flink容错机制 

Flink的多流转换: Flink多流转换 

Flink的时间和窗口: Flink中的时间和窗口 

Flink的DataStreamAPI : DataStream API

Flink的运行架构:运行时架构 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值