You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by Jimmy Zhang <13...@163.com> on 2020/07/11 08:49:42 UTC

回复:滑动窗口数据存储多份问题

嗯嗯,之前没有选择回复全部,不好意思。
我看源码关于RocksDB这块确实是需要序列化的,所以肯定是多份保存,如果状态后端是heap呢,也是一样的吗?从我测试内存来看,感觉也是多份,只是heapliststate那个类给了我一些困惑😦


在2020年07月11日 16:23,Congxian Qiu 写道:
Hi


每个窗口都是一个单独的 state,至于你认为的不同 state 仅保持引用是不对的。这个你可以使用 RocksDBStateBackend 来考虑,RocksDBStateBackend 中会把 state 序列化成 bytes,然后写到 RocksDB 中,就是每个 State 中都会有一份。


PS:回复邮件的时候可以选择「全部回复」这样就能够加上 "user-zh@flink.apache.org"),这样我们的邮件所有人都能看到了


Best,
Congxian




张浩 <zh...@163.com> 于2020年7月7日周二 上午10:34写道:

Hi,我通过看源码发现每条数据到达时,是分配给了所有的窗口,但是我理解这单条数据是不是只是传递给了每个窗口,其实在内存中只有一份,窗口状态保持对它的引用,触发一次窗口就删掉对这些数据的引用?
很高兴与您探讨!




| |
张浩
|
|
邮箱:zhanghao_waxm@163.com
|

签名由 网易邮箱大师 定制

在2020年07月06日 20:56,Congxian Qiu 写道:
Hi


我理解,如果只存取一份的话,state 的管理会变得麻烦一些(所有需要这份数据的窗口都需要去某个地方取, state 什么时候清理逻辑也会变得麻烦一些)


Best,
Congxian




张浩 <zh...@163.com> 于2020年7月6日周一 下午1:57写道:

你好,我的思考是便于在状态信息中清除或者提取每一个窗口的数据信息。
不知道,我这样理解的对吗?
另外,为什么我们不能只存储一份数据呢?
非常感谢与您交流!




| |
张浩
|
|
邮箱:zhanghao_waxm@163.com
|

签名由 网易邮箱大师 定制

在2020年07月06日 13:46,Congxian Qiu 写道:
Hi
现在的实现是这样的,每条数据会在每个窗口中存一份

Best,
Congxian


张浩 <13...@163.com> 于2020年7月6日周一 下午12:49写道:

> Hi,all!
> 由于第一次咨询,我不确定上一份邮件大家是否收到。
> 想咨询下大家,为什么使用 datastream api 的话,滑动窗口对于每条数据都会在 state 中存 size / slide
> 份?
>
>
> | |
> 张浩
> |
> |
> 13669299054@163.com
> |
> 签名由网易邮箱大师定制

回复:滑动窗口数据存储多份问题

Posted by Jimmy Zhang <zh...@163.com>.
Hi!
好的,非常感谢!
很期待你接下来的回复。


|
Best,
Jimmy
|

Signature is customized by Netease Mail Master

在2020年07月13日 19:58,Congxian Qiu 写道:
Hi

从 HeapListState#add 这里看是的,我跟了一个 WindowOperator 到最终 HeapListState
的逻辑,这里确实是只有一份数据,没有拷贝。这个东西的实现可能是因为性能好,我尝试确认下这个原因,多谢你的提问。

Best,
Congxian


Jimmy Zhang <13...@163.com> 于2020年7月12日周日 上午8:13写道:

> Hi,all!
>
> 从WindowOperator.java的processElement方法跟进去,使用windowState.add(element.getValue());添加数据,这里面找到add方法的HeapListState类的实现,
>
>
> @Override
>  public void add(V value) {
>   Preconditions.checkNotNull(value, "You cannot add null to a ListState.");
>   final N namespace = currentNamespace;
>   final StateTable<K, N, List<V>> map = stateTable;
>   List<V> list = map.get(namespace);
>   if (list == null) {
>    list = new ArrayList<>();
>    map.put(namespace, list);
>   }
>   list.add(value);
>  }
> 就是这个方法,让我产生了 “此value只真实存在一份”的困惑!
> |
> Best,
> Jimmy
> |
> 签名由网易邮箱大师定制
> 在2020年7月11日 21:02,Congxian Qiu<qc...@gmail.com> 写道:
> Hi
> 你说的 HeapListState 的困惑具体是什么呢?
>
> Best,
> Congxian
>
>
> Jimmy Zhang <13...@163.com> 于2020年7月11日周六 下午4:50写道:
>
> 嗯嗯,之前没有选择回复全部,不好意思。
>
>
> 我看源码关于RocksDB这块确实是需要序列化的,所以肯定是多份保存,如果状态后端是heap呢,也是一样的吗?从我测试内存来看,感觉也是多份,只是heapliststate那个类给了我一些困惑😦
>
>
> 在2020年07月11日 16:23,Congxian Qiu 写道:
> Hi
>
>
> 每个窗口都是一个单独的 state,至于你认为的不同 state 仅保持引用是不对的。这个你可以使用 RocksDBStateBackend
> 来考虑,RocksDBStateBackend 中会把 state 序列化成 bytes,然后写到 RocksDB 中,就是每个 State
> 中都会有一份。
>
>
> PS:回复邮件的时候可以选择「全部回复」这样就能够加上 "user-zh@flink.apache.org"),这样我们的邮件所有人都能看到了
>
>
> Best,
> Congxian
>
>
>
>
> 张浩 <zh...@163.com> 于2020年7月7日周二 上午10:34写道:
>
>
>
> Hi,我通过看源码发现每条数据到达时,是分配给了所有的窗口,但是我理解这单条数据是不是只是传递给了每个窗口,其实在内存中只有一份,窗口状态保持对它的引用,触发一次窗口就删掉对这些数据的引用?
> 很高兴与您探讨!
>
>
>
>
> | |
> 张浩
> |
> |
> 邮箱:zhanghao_waxm@163.com
> |
>
> 签名由 网易邮箱大师 定制
>
> 在2020年07月06日 20:56,Congxian Qiu 写道:
> Hi
>
>
> 我理解,如果只存取一份的话,state 的管理会变得麻烦一些(所有需要这份数据的窗口都需要去某个地方取, state
> 什么时候清理逻辑也会变得麻烦一些)
>
>
> Best,
> Congxian
>
>
>
>
> 张浩 <zh...@163.com> 于2020年7月6日周一 下午1:57写道:
>
> 你好,我的思考是便于在状态信息中清除或者提取每一个窗口的数据信息。
> 不知道,我这样理解的对吗?
> 另外,为什么我们不能只存储一份数据呢?
> 非常感谢与您交流!
>
>
>
>
> | |
> 张浩
> |
> |
> 邮箱:zhanghao_waxm@163.com
> |
>
> 签名由 网易邮箱大师 定制
>
> 在2020年07月06日 13:46,Congxian Qiu 写道:
> Hi
> 现在的实现是这样的,每条数据会在每个窗口中存一份
>
> Best,
> Congxian
>
>
> 张浩 <13...@163.com> 于2020年7月6日周一 下午12:49写道:
>
> Hi,all!
> 由于第一次咨询,我不确定上一份邮件大家是否收到。
> 想咨询下大家,为什么使用 datastream api 的话,滑动窗口对于每条数据都会在 state 中存 size / slide
> 份?
>
>
> | |
> 张浩
> |
> |
> 13669299054@163.com
> |
> 签名由网易邮箱大师定制
>
>

Re: 滑动窗口数据存储多份问题

Posted by Congxian Qiu <qc...@gmail.com>.
Hi

从 HeapListState#add 这里看是的,我跟了一个 WindowOperator 到最终 HeapListState
的逻辑,这里确实是只有一份数据,没有拷贝。这个东西的实现可能是因为性能好,我尝试确认下这个原因,多谢你的提问。

Best,
Congxian


Jimmy Zhang <13...@163.com> 于2020年7月12日周日 上午8:13写道:

> Hi,all!
>
> 从WindowOperator.java的processElement方法跟进去,使用windowState.add(element.getValue());添加数据,这里面找到add方法的HeapListState类的实现,
>
>
> @Override
>  public void add(V value) {
>   Preconditions.checkNotNull(value, "You cannot add null to a ListState.");
>   final N namespace = currentNamespace;
>   final StateTable<K, N, List<V>> map = stateTable;
>   List<V> list = map.get(namespace);
>   if (list == null) {
>    list = new ArrayList<>();
>    map.put(namespace, list);
>   }
>   list.add(value);
>  }
> 就是这个方法,让我产生了 “此value只真实存在一份”的困惑!
> |
> Best,
> Jimmy
> |
> 签名由网易邮箱大师定制
> 在2020年7月11日 21:02,Congxian Qiu<qc...@gmail.com> 写道:
> Hi
> 你说的 HeapListState 的困惑具体是什么呢?
>
> Best,
> Congxian
>
>
> Jimmy Zhang <13...@163.com> 于2020年7月11日周六 下午4:50写道:
>
> 嗯嗯,之前没有选择回复全部,不好意思。
>
>
> 我看源码关于RocksDB这块确实是需要序列化的,所以肯定是多份保存,如果状态后端是heap呢,也是一样的吗?从我测试内存来看,感觉也是多份,只是heapliststate那个类给了我一些困惑😦
>
>
> 在2020年07月11日 16:23,Congxian Qiu 写道:
> Hi
>
>
> 每个窗口都是一个单独的 state,至于你认为的不同 state 仅保持引用是不对的。这个你可以使用 RocksDBStateBackend
> 来考虑,RocksDBStateBackend 中会把 state 序列化成 bytes,然后写到 RocksDB 中,就是每个 State
> 中都会有一份。
>
>
> PS:回复邮件的时候可以选择「全部回复」这样就能够加上 "user-zh@flink.apache.org"),这样我们的邮件所有人都能看到了
>
>
> Best,
> Congxian
>
>
>
>
> 张浩 <zh...@163.com> 于2020年7月7日周二 上午10:34写道:
>
>
>
> Hi,我通过看源码发现每条数据到达时,是分配给了所有的窗口,但是我理解这单条数据是不是只是传递给了每个窗口,其实在内存中只有一份,窗口状态保持对它的引用,触发一次窗口就删掉对这些数据的引用?
> 很高兴与您探讨!
>
>
>
>
> | |
> 张浩
> |
> |
> 邮箱:zhanghao_waxm@163.com
> |
>
> 签名由 网易邮箱大师 定制
>
> 在2020年07月06日 20:56,Congxian Qiu 写道:
> Hi
>
>
> 我理解,如果只存取一份的话,state 的管理会变得麻烦一些(所有需要这份数据的窗口都需要去某个地方取, state
> 什么时候清理逻辑也会变得麻烦一些)
>
>
> Best,
> Congxian
>
>
>
>
> 张浩 <zh...@163.com> 于2020年7月6日周一 下午1:57写道:
>
> 你好,我的思考是便于在状态信息中清除或者提取每一个窗口的数据信息。
> 不知道,我这样理解的对吗?
> 另外,为什么我们不能只存储一份数据呢?
> 非常感谢与您交流!
>
>
>
>
> | |
> 张浩
> |
> |
> 邮箱:zhanghao_waxm@163.com
> |
>
> 签名由 网易邮箱大师 定制
>
> 在2020年07月06日 13:46,Congxian Qiu 写道:
> Hi
> 现在的实现是这样的,每条数据会在每个窗口中存一份
>
> Best,
> Congxian
>
>
> 张浩 <13...@163.com> 于2020年7月6日周一 下午12:49写道:
>
> Hi,all!
> 由于第一次咨询,我不确定上一份邮件大家是否收到。
> 想咨询下大家,为什么使用 datastream api 的话,滑动窗口对于每条数据都会在 state 中存 size / slide
> 份?
>
>
> | |
> 张浩
> |
> |
> 13669299054@163.com
> |
> 签名由网易邮箱大师定制
>
>

回复: 滑动窗口数据存储多份问题

Posted by Jimmy Zhang <13...@163.com>.
Hi,all!
从WindowOperator.java的processElement方法跟进去,使用windowState.add(element.getValue());添加数据,这里面找到add方法的HeapListState类的实现,


@Override
 public void add(V value) {
  Preconditions.checkNotNull(value, "You cannot add null to a ListState.");
  final N namespace = currentNamespace;
  final StateTable<K, N, List<V>> map = stateTable;
  List<V> list = map.get(namespace);
  if (list == null) {
   list = new ArrayList<>();
   map.put(namespace, list);
  }
  list.add(value);
 }
就是这个方法,让我产生了 “此value只真实存在一份”的困惑!
|
Best,
Jimmy
|
签名由网易邮箱大师定制
在2020年7月11日 21:02,Congxian Qiu<qc...@gmail.com> 写道:
Hi
你说的 HeapListState 的困惑具体是什么呢?

Best,
Congxian


Jimmy Zhang <13...@163.com> 于2020年7月11日周六 下午4:50写道:

嗯嗯,之前没有选择回复全部,不好意思。

我看源码关于RocksDB这块确实是需要序列化的,所以肯定是多份保存,如果状态后端是heap呢,也是一样的吗?从我测试内存来看,感觉也是多份,只是heapliststate那个类给了我一些困惑😦


在2020年07月11日 16:23,Congxian Qiu 写道:
Hi


每个窗口都是一个单独的 state,至于你认为的不同 state 仅保持引用是不对的。这个你可以使用 RocksDBStateBackend
来考虑,RocksDBStateBackend 中会把 state 序列化成 bytes,然后写到 RocksDB 中,就是每个 State
中都会有一份。


PS:回复邮件的时候可以选择「全部回复」这样就能够加上 "user-zh@flink.apache.org"),这样我们的邮件所有人都能看到了


Best,
Congxian




张浩 <zh...@163.com> 于2020年7月7日周二 上午10:34写道:


Hi,我通过看源码发现每条数据到达时,是分配给了所有的窗口,但是我理解这单条数据是不是只是传递给了每个窗口,其实在内存中只有一份,窗口状态保持对它的引用,触发一次窗口就删掉对这些数据的引用?
很高兴与您探讨!




| |
张浩
|
|
邮箱:zhanghao_waxm@163.com
|

签名由 网易邮箱大师 定制

在2020年07月06日 20:56,Congxian Qiu 写道:
Hi


我理解,如果只存取一份的话,state 的管理会变得麻烦一些(所有需要这份数据的窗口都需要去某个地方取, state
什么时候清理逻辑也会变得麻烦一些)


Best,
Congxian




张浩 <zh...@163.com> 于2020年7月6日周一 下午1:57写道:

你好,我的思考是便于在状态信息中清除或者提取每一个窗口的数据信息。
不知道,我这样理解的对吗?
另外,为什么我们不能只存储一份数据呢?
非常感谢与您交流!




| |
张浩
|
|
邮箱:zhanghao_waxm@163.com
|

签名由 网易邮箱大师 定制

在2020年07月06日 13:46,Congxian Qiu 写道:
Hi
现在的实现是这样的,每条数据会在每个窗口中存一份

Best,
Congxian


张浩 <13...@163.com> 于2020年7月6日周一 下午12:49写道:

Hi,all!
由于第一次咨询,我不确定上一份邮件大家是否收到。
想咨询下大家,为什么使用 datastream api 的话,滑动窗口对于每条数据都会在 state 中存 size / slide
份?


| |
张浩
|
|
13669299054@163.com
|
签名由网易邮箱大师定制


Re: 滑动窗口数据存储多份问题

Posted by Congxian Qiu <qc...@gmail.com>.
Hi
   你说的 HeapListState 的困惑具体是什么呢?

Best,
Congxian


Jimmy Zhang <13...@163.com> 于2020年7月11日周六 下午4:50写道:

> 嗯嗯,之前没有选择回复全部,不好意思。
>
> 我看源码关于RocksDB这块确实是需要序列化的,所以肯定是多份保存,如果状态后端是heap呢,也是一样的吗?从我测试内存来看,感觉也是多份,只是heapliststate那个类给了我一些困惑😦
>
>
> 在2020年07月11日 16:23,Congxian Qiu 写道:
> Hi
>
>
> 每个窗口都是一个单独的 state,至于你认为的不同 state 仅保持引用是不对的。这个你可以使用 RocksDBStateBackend
> 来考虑,RocksDBStateBackend 中会把 state 序列化成 bytes,然后写到 RocksDB 中,就是每个 State
> 中都会有一份。
>
>
> PS:回复邮件的时候可以选择「全部回复」这样就能够加上 "user-zh@flink.apache.org"),这样我们的邮件所有人都能看到了
>
>
> Best,
> Congxian
>
>
>
>
> 张浩 <zh...@163.com> 于2020年7月7日周二 上午10:34写道:
>
>
> Hi,我通过看源码发现每条数据到达时,是分配给了所有的窗口,但是我理解这单条数据是不是只是传递给了每个窗口,其实在内存中只有一份,窗口状态保持对它的引用,触发一次窗口就删掉对这些数据的引用?
> 很高兴与您探讨!
>
>
>
>
> | |
> 张浩
> |
> |
> 邮箱:zhanghao_waxm@163.com
> |
>
> 签名由 网易邮箱大师 定制
>
> 在2020年07月06日 20:56,Congxian Qiu 写道:
> Hi
>
>
> 我理解,如果只存取一份的话,state 的管理会变得麻烦一些(所有需要这份数据的窗口都需要去某个地方取, state
> 什么时候清理逻辑也会变得麻烦一些)
>
>
> Best,
> Congxian
>
>
>
>
> 张浩 <zh...@163.com> 于2020年7月6日周一 下午1:57写道:
>
> 你好,我的思考是便于在状态信息中清除或者提取每一个窗口的数据信息。
> 不知道,我这样理解的对吗?
> 另外,为什么我们不能只存储一份数据呢?
> 非常感谢与您交流!
>
>
>
>
> | |
> 张浩
> |
> |
> 邮箱:zhanghao_waxm@163.com
> |
>
> 签名由 网易邮箱大师 定制
>
> 在2020年07月06日 13:46,Congxian Qiu 写道:
> Hi
> 现在的实现是这样的,每条数据会在每个窗口中存一份
>
> Best,
> Congxian
>
>
> 张浩 <13...@163.com> 于2020年7月6日周一 下午12:49写道:
>
> > Hi,all!
> > 由于第一次咨询,我不确定上一份邮件大家是否收到。
> > 想咨询下大家,为什么使用 datastream api 的话,滑动窗口对于每条数据都会在 state 中存 size / slide
> > 份?
> >
> >
> > | |
> > 张浩
> > |
> > |
> > 13669299054@163.com
> > |
> > 签名由网易邮箱大师定制
>