1. 你对增量checkpoint的理解以及taskmanager和RocksDB之间的关系理解不太对。RocksDBKeyedStateBackend使用RocksDB存储state数据,可以理解成其是taskmanager的一部分,实际上是单机的概念。增量checkpoint的时候,RocksDB会在同步阶段将其所有数据刷写到磁盘上,Flink框架选择之前没有上传的sst文件,异步上传到HDFS。如果没有开启local recovery,那么新启动的taskmanager会从hdfs上下载全量的数据文件进行恢复。 2. 作业cancel了,task都会cancel,RocksDBKeyedStateBackend自然也会退出。
祝好 唐云 ________________________________ From: lvwenyuan <lvwenyuan...@163.com> Sent: Tuesday, August 6, 2019 14:53 To: user-zh@flink.apache.org <user-zh@flink.apache.org> Subject: Re:Re: Re: Flink RocksDBStateBackend 问题 唐老师您好: 我这里指的是checkpoint时存储数据的file system,这里我用的是HDFS。 按照老师的说法,我可不可以这样理解(在Flink on yarn 以及 使用 RocksDBStateBackend 的场景下): 1.做增量checkpoint的时候,taskmanager默认异步的将数据写入rocksdb和hdfs中(数据是相同的)。 当taskmanager异常退出时,会启动另一个taskmanager去做task,那么新起的taskmanager是否会去hdfs上同步数据。 那么这个rocksdb的意义是在哪里?数据反正HDFS上都有,而且HDFS本身也多副本。 2.在做savepoint的时候,一般会将数据保存在HDFS上,那么这个是,我的命令是 flink cancel -s 。做完savepoint就退出,那么这个时候rocksdb还需要去写数据吗?因为做完savepoint,整个任务就结束了。 望解答,谢谢老师! 在 2019-08-06 13:44:18,"Yun Tang" <myas...@live.com> 写道: >@lvwenyuan<mailto:lvwenyuan...@163.com> >首先需要明确的一点是,你这里的“FileSystem”指的究竟是checkpoint时存储数据的file >system,还是FsStateBackend,建议下次提问前可以把需要咨询的内容表述清楚一些。 > > * 如果指的是存储checkpoint数据的远程file system,在incremental > checkpoint场景下,这些数据与RocksDB的创建checkpoint时刷写到本地的sst文件和meta文件是二进制相同的,只是文件名会重命名。如果是savepoint或者全量checkpoint场景下,这些数据是RocksDB中逐个有效entry的序列化内容。 > * > 如果指的是FsStateBackend,对于Flink而言存储的数据内容在逻辑上肯定都是一样的,否则就不符合语义了。但是二者在数据存储格式上是有区别的。FsStateBackend所创建的HeapKeyedStateBackend的数据内容都是存储在Java > heap内的,基本数据格式是StateTable[1]和其中存储数据的StateMap[2]。而RocksDB存储的数据主要是RocksDB > native内存中的writer buffer(memtable),block > cache,index&filter[3]和已经刷写到磁盘上默认采用snappy压缩的不可变sst文件构成。 > >[1] >https://github.com/apache/flink/blob/master/flink-runtime/src/main/java/org/apache/flink/runtime/state/heap/StateTable.java >[2] >https://github.com/apache/flink/blob/master/flink-runtime/src/main/java/org/apache/flink/runtime/state/heap/StateMap.java >[3] https://github.com/facebook/rocksdb/wiki/Memory-usage-in-RocksDB > > >祝好 >唐云 > >________________________________ >From: 戴嘉诚 <a773807...@gmail.com> >Sent: Tuesday, August 6, 2019 12:01 >To: user-zh@flink.apache.org <user-zh@flink.apache.org> >Subject: 答复: Re: Flink RocksDBStateBackend 问题 > > > 不是,文档上有说,filesystem是会把正在运行的数据存储在tm的内存中,然后触发checkpoint后,才会写入文件系统上,而rocksdb是直接把运行中的数据写到了rocksdb上,看样子是不占用运行中的tm的内存。 > > https://ci.apache.org/projects/flink/flink-docs-release-1.8/ops/state/state_backends.html#the-fsstatebackend > >`The FsStateBackend holds in-flight data in the TaskManager’s memory. Upon >checkpointing, it writes state snapshots into files in the configured file >system and directory. Minimal metadata is stored in the JobManager’s memory >(or, in high-availability mode, in the metadata checkpoint).` > >发件人: athlon...@gmail.com >发送时间: 2019年8月6日 11:53 >收件人: user-zh >主题: Re: Re: Flink RocksDBStateBackend 问题 > >你说的是memsystem的状态数据存在jm内存中的filesystem是存到文件系统上的 > > > >athlon...@gmail.com >发件人: 戴嘉诚 >发送时间: 2019-08-06 11:42 >收件人: user-zh >主题: Re: Flink RocksDBStateBackend 问题 >FileSystem 我记得是存储的大小是不能超过tm的内存还是jm的内存,而rocksdb上存储的数据是可以无限的,不过相对来说, >FileSystem的吞吐就会比rocksdb会高 >lvwenyuan <lvwenyuan...@163.com> 于2019年8月6日周二 上午11:39写道: >> 请教各位: >> RocksDBStateBackend >> 中,rocksdb上存储的内如和FileSystem上存储的数据内容是一样的?如果不一样,那么分别是什么呢?感谢回答 >> >> >> >> >