【问题标题】:How to combine streaming data with large history data set in Dataflow/Beam如何在 Dataflow/Beam 中将流数据与大型历史数据集相结合
【发布时间】:2016-04-29 00:21:59
【问题描述】:

我正在调查通过 Google Dataflow/Apache Beam 处理来自网络用户会话的日志,并且需要将用户的日志(流式传输)与上个月的用户会话历史记录结合起来。

我研究了以下方法:

  1. 使用 30 天的固定窗口:最有可能大的窗口适合内存,我不需要更新用户的历史记录,参考一下即可
  2. 使用 CoGroupByKey 连接两个数据集,但两个数据集必须具有相同的窗口大小 (https://cloud.google.com/dataflow/model/group-by-key#join),在我的情况下不是这样(24 小时 vs 30 天)
  3. 使用 Side Input 检索用户在 processElement(ProcessContext processContext) 中给定 element 的会话历史记录

我的理解是通过.withSideInputs(pCollectionView) 加载的数据需要适合内存。我知道我可以将单个用户的所有会话历史记录到内存中,但不能将 所有 会话历史记录。

我的问题是,是否有办法从仅与当前用户会话相关的侧面输入加载/流式传输数据?

我正在想象一个 parDo 函数,它通过指定用户的 ID 从侧面输入加载用户的历史会话。但是只有当前用户的历史会话才能放入内存;通过侧面输入加载所有历史会话会太大。

一些伪代码来说明:

public static class MetricFn extends DoFn<LogLine, String> {

    final PCollectionView<Map<String, Iterable<LogLine>>> pHistoryView;

    public MetricFn(PCollectionView<Map<String, Iterable<LogLine>>> historyView) {
        this.pHistoryView = historyView;
    }

    @Override
    public void processElement(ProcessContext processContext) throws Exception {
        Map<String, Iterable<LogLine>> historyLogData = processContext.sideInput(pHistoryView);

        final LogLine currentLogLine = processContext.element();
        final Iterable<LogLine> userHistory = historyLogData.get(currentLogLine.getUserId());
        final String outputMetric = calculateMetricWithUserHistory(currentLogLine, userHistory);
        processContext.output(outputMetric);
    }
}

【问题讨论】:

    标签: java apache-flink google-cloud-dataflow apache-beam


    【解决方案1】:

    目前没有一种方法可以访问流式传输中的每个键侧输入,但正如您所描述的那样,它肯定会很有用,而且我们正在考虑实施。

    一种可能的解决方法是使用侧面输入来分发指向实际会话历史记录的指针。生成 24 小时会话历史记录的代码可以将它们上传到 GCS/BigQuery/etc,然后将位置作为辅助输入发送到加入代码。

    【讨论】:

    • 感谢 Daniel 的澄清...是否可以选择(在 Dataflow 中)使用用户 ID 作为键通过 Bigtable 动态加载用户的历史记录,或者这很可能会破坏性能(作为历史记录是否需要为每个用户会话查询/加载)?
    • 只要您在每个会话(而不是每个事件)加载历史记录,它可能会工作得相当好。由于历史数据是恒定的,您还可以添加静态缓存。一旦你完成了 GroupByKey/Combine 与你的用户作为键,每个用户通常最终会被同一个进程处理,所以缓存应该工作得很好。
    猜你喜欢
    • 2021-09-14
    • 2020-03-22
    • 2011-09-29
    • 2018-12-08
    • 2021-09-04
    • 2020-09-28
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    相关资源
    最近更新 更多