回复: State里面用guava Cache

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

回复: State里面用guava Cache

Yichao Yang
Hi,
每次cache的长度都是一有没有可能并发比较大,每一个1都是不同的算子输出的。


你的场景我们实践中的方法是按照用户id keyby之后再做localcache,并且如果用户id是long类型的话,localcache可以使用roaringbitmap,效率会比单纯的cache效率更好,占用内存更小。


并且频繁update state在资源有限的情况下是会有性能瓶颈的,这种场景下建议开窗口,窗口结束时update一次state即可。


Best,
Yichao Yang


------------------ 原始邮件 ------------------
发件人: user-zh-return-5056-1048262223=qq.com <[hidden email]&gt;
发送时间: 2020年7月8日 18:09
收件人: user-zh <[hidden email]&gt;
主题: 回复: State里面用guava Cache



比如数据里来了一个id我需要去判断这个id是新的还是已经存在的,由于历史数据量比较大,所以放全部state里面不太好。
把最近活跃的id放到ValueState[Cache]里面,可以在内存里关联到绝大部分的id,避免频繁访问外部存储。
如果不使用state保存的的话,重启作业后cache会重置,这段时间通过外部存储去关联id会很慢
&amp;nbsp;谢谢


------------------&amp;nbsp;原始邮件&amp;nbsp;------------------
发件人:&amp;nbsp;"Congxian Qiu"<[hidden email]&amp;gt;;
发送时间:&amp;nbsp;2020年7月8日(星期三) 下午5:52
收件人:&amp;nbsp;"user-zh"<[hidden email]&amp;gt;;

主题:&amp;nbsp;Re: State里面用guava Cache



我尝试理解一下你的需求:
你希望从外部存储同步一些信息,由于访问外部存储效率不高,所以希望加一个 cache,然后 cache
中的数据希望在一定时间后过期,过期后重新去外部存储同步一次信息。

但是还有一些信息不太明白,那这里你打算在什么地方使用 state 呢?state 存放什么数据呢?或者说,你自己维护这个状态之后,为什么还有使用
state 呢?

不管怎么说使用 Flink 之后,还是建议尽量使用 state,而不是使用外存,flink 提供的 state 方便做一些容错处理。

Best,
Congxian


op <[hidden email]&amp;gt; 于2020年7月8日周三 下午4:07写道:

&amp;gt;
&amp;gt; 您好,是这样的,我想再程序里面关联一些用户id,使用cache缓存一些热数据,设置每个id写入多久后自动清理掉,关联的时候首先访问缓存,访问不到再去访问外部存储;
&amp;gt; 业务中的key会一直出现,也就是说ttl可能不会生效,这样没办法使用state ttl对吧?
&amp;gt;
&amp;gt;
&amp;gt;
&amp;gt;
&amp;gt; ------------------&amp;amp;nbsp;原始邮件&amp;amp;nbsp;------------------
&amp;gt; 发件人:&amp;amp;nbsp;"Congxian Qiu"<[hidden email]&amp;amp;gt;;
&amp;gt; 发送时间:&amp;amp;nbsp;2020年7月8日(星期三) 下午3:56
&amp;gt; 收件人:&amp;amp;nbsp;"user-zh"<[hidden email]&amp;amp;gt;;
&amp;gt;
&amp;gt; 主题:&amp;amp;nbsp;Re: State里面用guava Cache
&amp;gt;
&amp;gt;
&amp;gt;
&amp;gt; TTL state[1] 满足你的需求吗? 如果不满足的话,能否描述下你的需求呢?
&amp;gt;
&amp;gt; [1]
&amp;gt;
&amp;gt; https://ci.apache.org/projects/flink/flink-docs-master/zh/dev/stream/state/state.html#%E7%8A%B6%E6%80%81%E6%9C%89%E6%95%88%E6%9C%9F-ttl
&amp;gt; Best,
&amp;gt; Congxian
&amp;gt;
&amp;gt;
&amp;gt; op <[hidden email]&amp;amp;gt; 于2020年7月8日周三 下午3:53写道:
&amp;gt;
&amp;gt; &amp;amp;gt; 您好,我主要是觉得Cache的自动过期比较好用
&amp;gt; &amp;amp;gt;
&amp;gt; &amp;amp;gt;
&amp;gt; &amp;amp;gt; ------------------&amp;amp;amp;nbsp;原始邮件&amp;amp;amp;nbsp;------------------
&amp;gt; &amp;amp;gt; 发件人:&amp;amp;amp;nbsp;"Congxian Qiu"<[hidden email]&amp;amp;amp;gt;;
&amp;gt; &amp;amp;gt; 发送时间:&amp;amp;amp;nbsp;2020年7月8日(星期三) 下午3:50
&amp;gt; &amp;amp;gt; 收件人:&amp;amp;amp;nbsp;"user-zh"<[hidden email]&amp;amp;amp;gt;;
&amp;gt; &amp;amp;gt;
&amp;gt; &amp;amp;gt; 主题:&amp;amp;amp;nbsp;Re: State里面用guava Cache
&amp;gt; &amp;amp;gt;
&amp;gt; &amp;amp;gt;
&amp;gt; &amp;amp;gt;
&amp;gt; &amp;amp;gt; 你好,为什么需要在 State 里面再用 cache 呢?单纯的 State 不能满足需求吗?需求是什么呢?
&amp;gt; &amp;amp;gt; 另外,除了 ValueState,其他的 ListState/MapState 能否满足你的需求呢?
&amp;gt; &amp;amp;gt;
&amp;gt; &amp;amp;gt; Best,
&amp;gt; &amp;amp;gt; Congxian
&amp;gt; &amp;amp;gt;
&amp;gt; &amp;amp;gt;
&amp;gt; &amp;amp;gt; op <[hidden email]&amp;amp;amp;gt; 于2020年7月8日周三 上午10:31写道:
&amp;gt; &amp;amp;gt;
&amp;gt; &amp;amp;gt; &amp;amp;amp;gt; 大家好,我想使用一个 ValueState[Cache]的状态,但是发现这个状态的value 没办法更新,
&amp;gt; &amp;amp;gt; &amp;amp;amp;gt;
&amp;gt; &amp;amp;gt; &amp;amp;amp;gt;
&amp;gt; &amp;amp;gt; &amp;amp;amp;gt;
&amp;gt; 比如我在map里面每次往cache里面put一个字符串,然后update这个state,输出cache的长度,为什么每次输出长度都是1
op
Reply | Threaded
Open this post in threaded view
|

回复: State里面用guava Cache

op
谢谢,
&nbsp; 这是我在本地把并行度都设置成1测试的,先不管了。。。
&nbsp; 这个roaringbitmap也是保存到state中吗?我后面试试
&nbsp; 开窗口这个可以,十分感谢




------------------&nbsp;原始邮件&nbsp;------------------
发件人:&nbsp;"Yichao Yang"<[hidden email]&gt;;
发送时间:&nbsp;2020年7月8日(星期三) 晚上6:45
收件人:&nbsp;"user-zh"<[hidden email]&gt;;

主题:&nbsp;回复: State里面用guava Cache



Hi,
每次cache的长度都是一有没有可能并发比较大,每一个1都是不同的算子输出的。


你的场景我们实践中的方法是按照用户id keyby之后再做localcache,并且如果用户id是long类型的话,localcache可以使用roaringbitmap,效率会比单纯的cache效率更好,占用内存更小。


并且频繁update state在资源有限的情况下是会有性能瓶颈的,这种场景下建议开窗口,窗口结束时update一次state即可。


Best,
Yichao Yang


------------------ 原始邮件 ------------------
发件人: user-zh-return-5056-1048262223=qq.com <[hidden email]&amp;gt;
发送时间: 2020年7月8日 18:09
收件人: user-zh <[hidden email]&amp;gt;
主题: 回复: State里面用guava Cache



比如数据里来了一个id我需要去判断这个id是新的还是已经存在的,由于历史数据量比较大,所以放全部state里面不太好。
把最近活跃的id放到ValueState[Cache]里面,可以在内存里关联到绝大部分的id,避免频繁访问外部存储。
如果不使用state保存的的话,重启作业后cache会重置,这段时间通过外部存储去关联id会很慢
&amp;amp;nbsp;谢谢


------------------&amp;amp;nbsp;原始邮件&amp;amp;nbsp;------------------
发件人:&amp;amp;nbsp;"Congxian Qiu"<[hidden email]&amp;amp;gt;;
发送时间:&amp;amp;nbsp;2020年7月8日(星期三) 下午5:52
收件人:&amp;amp;nbsp;"user-zh"<[hidden email]&amp;amp;gt;;

主题:&amp;amp;nbsp;Re: State里面用guava Cache



我尝试理解一下你的需求:
你希望从外部存储同步一些信息,由于访问外部存储效率不高,所以希望加一个 cache,然后 cache
中的数据希望在一定时间后过期,过期后重新去外部存储同步一次信息。

但是还有一些信息不太明白,那这里你打算在什么地方使用 state 呢?state 存放什么数据呢?或者说,你自己维护这个状态之后,为什么还有使用
state 呢?

不管怎么说使用 Flink 之后,还是建议尽量使用 state,而不是使用外存,flink 提供的 state 方便做一些容错处理。

Best,
Congxian


op <[hidden email]&amp;amp;gt; 于2020年7月8日周三 下午4:07写道:

&amp;amp;gt;
&amp;amp;gt; 您好,是这样的,我想再程序里面关联一些用户id,使用cache缓存一些热数据,设置每个id写入多久后自动清理掉,关联的时候首先访问缓存,访问不到再去访问外部存储;
&amp;amp;gt; 业务中的key会一直出现,也就是说ttl可能不会生效,这样没办法使用state ttl对吧?
&amp;amp;gt;
&amp;amp;gt;
&amp;amp;gt;
&amp;amp;gt;
&amp;amp;gt; ------------------&amp;amp;amp;nbsp;原始邮件&amp;amp;amp;nbsp;------------------
&amp;amp;gt; 发件人:&amp;amp;amp;nbsp;"Congxian Qiu"<[hidden email]&amp;amp;amp;gt;;
&amp;amp;gt; 发送时间:&amp;amp;amp;nbsp;2020年7月8日(星期三) 下午3:56
&amp;amp;gt; 收件人:&amp;amp;amp;nbsp;"user-zh"<[hidden email]&amp;amp;amp;gt;;
&amp;amp;gt;
&amp;amp;gt; 主题:&amp;amp;amp;nbsp;Re: State里面用guava Cache
&amp;amp;gt;
&amp;amp;gt;
&amp;amp;gt;
&amp;amp;gt; TTL state[1] 满足你的需求吗? 如果不满足的话,能否描述下你的需求呢?
&amp;amp;gt;
&amp;amp;gt; [1]
&amp;amp;gt;
&amp;amp;gt; https://ci.apache.org/projects/flink/flink-docs-master/zh/dev/stream/state/state.html#%E7%8A%B6%E6%80%81%E6%9C%89%E6%95%88%E6%9C%9F-ttl
&amp;amp;gt; Best,
&amp;amp;gt; Congxian
&amp;amp;gt;
&amp;amp;gt;
&amp;amp;gt; op <[hidden email]&amp;amp;amp;gt; 于2020年7月8日周三 下午3:53写道:
&amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt; 您好,我主要是觉得Cache的自动过期比较好用
&amp;amp;gt; &amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt; ------------------&amp;amp;amp;amp;nbsp;原始邮件&amp;amp;amp;amp;nbsp;------------------
&amp;amp;gt; &amp;amp;amp;gt; 发件人:&amp;amp;amp;amp;nbsp;"Congxian Qiu"<[hidden email]&amp;amp;amp;amp;gt;;
&amp;amp;gt; &amp;amp;amp;gt; 发送时间:&amp;amp;amp;amp;nbsp;2020年7月8日(星期三) 下午3:50
&amp;amp;gt; &amp;amp;amp;gt; 收件人:&amp;amp;amp;amp;nbsp;"user-zh"<[hidden email]&amp;amp;amp;amp;gt;;
&amp;amp;gt; &amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt; 主题:&amp;amp;amp;amp;nbsp;Re: State里面用guava Cache
&amp;amp;gt; &amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt; 你好,为什么需要在 State 里面再用 cache 呢?单纯的 State 不能满足需求吗?需求是什么呢?
&amp;amp;gt; &amp;amp;amp;gt; 另外,除了 ValueState,其他的 ListState/MapState 能否满足你的需求呢?
&amp;amp;gt; &amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt; Best,
&amp;amp;gt; &amp;amp;amp;gt; Congxian
&amp;amp;gt; &amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt; op <[hidden email]&amp;amp;amp;amp;gt; 于2020年7月8日周三 上午10:31写道:
&amp;amp;gt; &amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt; &amp;amp;amp;amp;gt; 大家好,我想使用一个 ValueState[Cache]的状态,但是发现这个状态的value 没办法更新,
&amp;amp;gt; &amp;amp;amp;gt; &amp;amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt; &amp;amp;amp;amp;gt;
&amp;amp;gt; &amp;amp;amp;gt; &amp;amp;amp;amp;gt;
&amp;amp;gt; 比如我在map里面每次往cache里面put一个字符串,然后update这个state,输出cache的长度,为什么每次输出长度都是1
Reply | Threaded
Open this post in threaded view
|

Re: State里面用guava Cache

Congxian Qiu
State 也可以理解为一个 cache,如果打算自己维护 cache(比如使用 guava cache)的话,那么就可以不使用
State,当然如果你还希望做状态容错的话,也可以使用类似 YiChao 的方法,积攒一批数据然后一起更新 State

Best,
Congxian


op <[hidden email]> 于2020年7月8日周三 下午6:50写道:

> 谢谢,
> &nbsp; 这是我在本地把并行度都设置成1测试的,先不管了。。。
> &nbsp; 这个roaringbitmap也是保存到state中吗?我后面试试
> &nbsp; 开窗口这个可以,十分感谢
>
>
>
>
> ------------------&nbsp;原始邮件&nbsp;------------------
> 发件人:&nbsp;"Yichao Yang"<[hidden email]&gt;;
> 发送时间:&nbsp;2020年7月8日(星期三) 晚上6:45
> 收件人:&nbsp;"user-zh"<[hidden email]&gt;;
>
> 主题:&nbsp;回复: State里面用guava Cache
>
>
>
> Hi,
> 每次cache的长度都是一有没有可能并发比较大,每一个1都是不同的算子输出的。
>
>
> 你的场景我们实践中的方法是按照用户id
> keyby之后再做localcache,并且如果用户id是long类型的话,localcache可以使用roaringbitmap,效率会比单纯的cache效率更好,占用内存更小。
>
>
> 并且频繁update state在资源有限的情况下是会有性能瓶颈的,这种场景下建议开窗口,窗口结束时update一次state即可。
>
>
> Best,
> Yichao Yang
>
>
> ------------------ 原始邮件 ------------------
> 发件人: user-zh-return-5056-1048262223=qq.com <[hidden email]&amp;gt;
> 发送时间: 2020年7月8日 18:09
> 收件人: user-zh <[hidden email]&amp;gt;
> 主题: 回复: State里面用guava Cache
>
>
>
> 比如数据里来了一个id我需要去判断这个id是新的还是已经存在的,由于历史数据量比较大,所以放全部state里面不太好。
> 把最近活跃的id放到ValueState[Cache]里面,可以在内存里关联到绝大部分的id,避免频繁访问外部存储。
> 如果不使用state保存的的话,重启作业后cache会重置,这段时间通过外部存储去关联id会很慢
> &amp;amp;nbsp;谢谢
>
>
> ------------------&amp;amp;nbsp;原始邮件&amp;amp;nbsp;------------------
> 发件人:&amp;amp;nbsp;"Congxian Qiu"<[hidden email]&amp;amp;gt;;
> 发送时间:&amp;amp;nbsp;2020年7月8日(星期三) 下午5:52
> 收件人:&amp;amp;nbsp;"user-zh"<[hidden email]&amp;amp;gt;;
>
> 主题:&amp;amp;nbsp;Re: State里面用guava Cache
>
>
>
> 我尝试理解一下你的需求:
> 你希望从外部存储同步一些信息,由于访问外部存储效率不高,所以希望加一个 cache,然后 cache
> 中的数据希望在一定时间后过期,过期后重新去外部存储同步一次信息。
>
> 但是还有一些信息不太明白,那这里你打算在什么地方使用 state 呢?state 存放什么数据呢?或者说,你自己维护这个状态之后,为什么还有使用
> state 呢?
>
> 不管怎么说使用 Flink 之后,还是建议尽量使用 state,而不是使用外存,flink 提供的 state 方便做一些容错处理。
>
> Best,
> Congxian
>
>
> op <[hidden email]&amp;amp;gt; 于2020年7月8日周三 下午4:07写道:
>
> &amp;amp;gt;
> &amp;amp;gt;
> 您好,是这样的,我想再程序里面关联一些用户id,使用cache缓存一些热数据,设置每个id写入多久后自动清理掉,关联的时候首先访问缓存,访问不到再去访问外部存储;
> &amp;amp;gt; 业务中的key会一直出现,也就是说ttl可能不会生效,这样没办法使用state ttl对吧?
> &amp;amp;gt;
> &amp;amp;gt;
> &amp;amp;gt;
> &amp;amp;gt;
> &amp;amp;gt;
> ------------------&amp;amp;amp;nbsp;原始邮件&amp;amp;amp;nbsp;------------------
> &amp;amp;gt; 发件人:&amp;amp;amp;nbsp;"Congxian Qiu"<[hidden email]
> &amp;amp;amp;gt;;
> &amp;amp;gt; 发送时间:&amp;amp;amp;nbsp;2020年7月8日(星期三) 下午3:56
> &amp;amp;gt; 收件人:&amp;amp;amp;nbsp;"user-zh"<[hidden email]
> &amp;amp;amp;gt;;
> &amp;amp;gt;
> &amp;amp;gt; 主题:&amp;amp;amp;nbsp;Re: State里面用guava Cache
> &amp;amp;gt;
> &amp;amp;gt;
> &amp;amp;gt;
> &amp;amp;gt; TTL state[1] 满足你的需求吗? 如果不满足的话,能否描述下你的需求呢?
> &amp;amp;gt;
> &amp;amp;gt; [1]
> &amp;amp;gt;
> &amp;amp;gt;
> https://ci.apache.org/projects/flink/flink-docs-master/zh/dev/stream/state/state.html#%E7%8A%B6%E6%80%81%E6%9C%89%E6%95%88%E6%9C%9F-ttl
> &amp;amp;gt
> <https://ci.apache.org/projects/flink/flink-docs-master/zh/dev/stream/state/state.html#%E7%8A%B6%E6%80%81%E6%9C%89%E6%95%88%E6%9C%9F-ttl&amp;amp;gt>;
> Best,
> &amp;amp;gt; Congxian
> &amp;amp;gt;
> &amp;amp;gt;
> &amp;amp;gt; op <[hidden email]&amp;amp;amp;gt; 于2020年7月8日周三 下午3:53写道:
> &amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt; 您好,我主要是觉得Cache的自动过期比较好用
> &amp;amp;gt; &amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt;
> ------------------&amp;amp;amp;amp;nbsp;原始邮件&amp;amp;amp;amp;nbsp;------------------
> &amp;amp;gt; &amp;amp;amp;gt; 发件人:&amp;amp;amp;amp;nbsp;"Congxian Qiu"<
> [hidden email]&amp;amp;amp;amp;gt;;
> &amp;amp;gt; &amp;amp;amp;gt; 发送时间:&amp;amp;amp;amp;nbsp;2020年7月8日(星期三)
> 下午3:50
> &amp;amp;gt; &amp;amp;amp;gt; 收件人:&amp;amp;amp;amp;nbsp;"user-zh"<
> [hidden email]&amp;amp;amp;amp;gt;;
> &amp;amp;gt; &amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt; 主题:&amp;amp;amp;amp;nbsp;Re: State里面用guava
> Cache
> &amp;amp;gt; &amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt; 你好,为什么需要在 State 里面再用 cache 呢?单纯的 State
> 不能满足需求吗?需求是什么呢?
> &amp;amp;gt; &amp;amp;amp;gt; 另外,除了 ValueState,其他的 ListState/MapState
> 能否满足你的需求呢?
> &amp;amp;gt; &amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt; Best,
> &amp;amp;gt; &amp;amp;amp;gt; Congxian
> &amp;amp;gt; &amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt; op <[hidden email]&amp;amp;amp;amp;gt;
> 于2020年7月8日周三 上午10:31写道:
> &amp;amp;gt; &amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt; &amp;amp;amp;amp;gt; 大家好,我想使用一个
> ValueState[Cache]的状态,但是发现这个状态的value 没办法更新,
> &amp;amp;gt; &amp;amp;amp;gt; &amp;amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt; &amp;amp;amp;amp;gt;
> &amp;amp;gt; &amp;amp;amp;gt; &amp;amp;amp;amp;gt;
> &amp;amp;gt;
> 比如我在map里面每次往cache里面put一个字符串,然后update这个state,输出cache的长度,为什么每次输出长度都是1