1

我正在设置一个 Apache Spark 长时间运行的流式传输作业,以使用 InputDStream 执行(非并行)流式传输。

我想要实现的是,当队列中的批处理花费太长时间(基于用户定义的超时)时,我希望能够跳过该批处理并完全放弃它 - 并继续执行其余部分。

我无法在 spark API 或在线找到解决此问题的方法——我研究了使用 StreamingContext awaitTerminationOrTimeout,但这会在超时时杀死整个 StreamingContext,而我要做的只是跳过/杀死当前批次。

我也考虑过使用 mapWithState,但这似乎不适用于这个用例。最后,我正在考虑设置一个 StreamingListener 并在批处理开始时启动一个计时器,然后在达到某个超时阈值时让批处理停止/跳过/杀死,但似乎仍然没有办法杀死批处理。

谢谢!

4

1 回答 1

0

我看过一些来自 yelp 的文档,但我自己没有做过。

使用UpdateStateByKey(update_func)mapWithState(stateSpec),

  1. 首次看到事件并初始化状态时附加超时
  2. 如果状态过期则丢弃状态

    def update_function(new_events, current_state):
        if current_state is None:
            current_state = init_state()
            attach_expire_datetime(new_events)
            ......
        if is_expired(current_state):
            return None //current_state drops?
        if new_events:
            apply_business_logic(new_events, current_state)
    

这看起来像结构化流水印也会在事件超时时丢弃事件,如果这可能适用于您的作业/阶段超时丢弃。

于 2017-12-17T02:17:59.510 回答