Google cloud dataflow 如何调试我的数据流作业被卡住的原因?

Google cloud dataflow 如何调试我的数据流作业被卡住的原因?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我有一个数据流工作没有进展,或者进展非常缓慢,我不知道为什么。我如何开始调查作业为何缓慢/停滞?您应该检查的第一个资源是数据流文档。检查以下各项应该很有用: 如果这些资源没有帮助,我将试着总结一下您的工作可能被卡住的一些原因,以及如何调试它。我将根据系统的哪个部分导致故障来区分这些问题。你的工作可能是: 作业在启动时卡住 作业可能会在数据流服务接收时卡住,或者启动新的数据流工作程序。这方面的一些风险因素包括: 您是否添加了自定义setup.py文件 您是否有任何依赖项需要在worke

我有一个数据流工作没有进展,或者进展非常缓慢,我不知道为什么。我如何开始调查作业为何缓慢/停滞?

您应该检查的第一个资源是数据流文档。检查以下各项应该很有用:

如果这些资源没有帮助,我将试着总结一下您的工作可能被卡住的一些原因,以及如何调试它。我将根据系统的哪个部分导致故障来区分这些问题。你的工作可能是:


作业在启动时卡住 作业可能会在数据流服务接收时卡住,或者启动新的数据流工作程序。这方面的一些风险因素包括:

  • 您是否添加了自定义
    setup.py
    文件
  • 您是否有任何依赖项需要在worker启动时进行特殊设置
  • 您正在操作工作容器吗
要调试这类问题我通常打开StackDriver日志,并查找
工作者启动
日志(参见下图)。这些日志是由worker在启动带有代码和依赖项的docker容器时编写的。如果您在这里看到任何问题,则表明您的
setup.py
、作业提交、分段工件等存在问题

您可以做的另一件事是保持相同的设置,并运行一个非常小的管道,将所有内容分阶段进行:

with beam.Pipeline(...) as p:
  (p 
   | beam.Create(['test element']) 
   | beam.Map(lambda x: logging.info(x)))
如果在StackDriver中看不到日志,则可以继续调试安装程序如果您确实在StackDriver中看到日志,则您的作业可能会卡在其他地方


作业似乎卡在用户代码中 可能发生的其他情况是,您的作业在用户代码中执行的某些操作被卡住或速度慢。这方面的一些风险因素包括:

  • 您的作业是否执行需要您等待的操作?(例如,将数据加载到外部服务,等待承诺/未来)
    • 请注意,Beam的一些内置转换正好做到这一点(例如,Beam IO,如BigQueryIO、FileIO等)
  • 您的工作是将非常大的输入端加载到内存中吗?如果使用
    View.AsList
    进行侧输入,则可能会发生这种情况
  • GroupByKey
    操作之后,您的作业是否加载了非常大的iterables
此类问题的一个症状可能是管道的吞吐量低于预期另一个症状是在日志中看到以下行:

Processing stuck in step <STEP_NAME>/<...>/<...> for at least <TIME> without outputting or completing in state <STATE>
    .... <a stacktrace> ....
处理卡在步骤//中,至少没有在状态下输出或完成
.... 

一些提示:

  • 非常大的输入端可能会带来麻烦,因此,如果管道依赖于访问非常大的输入端,则可能需要重新设计它以避免该瓶颈

  • 可以对外部服务进行异步请求,但我建议您提交/完成
    startBundle
    finishBundle
    调用的工作

  • 如果管道的吞吐量不是您通常期望的,可能是因为您没有足够的并行性。这可以通过
    重新洗牌
    ,或将现有密钥分为子密钥(Beam通常对每个密钥进行处理,因此如果密钥太少,并行度将很低)或使用
    组合器
    而不是
    GroupByKey
    +
    ParDo

  • 吞吐量低的另一个原因可能是您的工作在外部呼叫上等待的时间太长。您可以尝试通过尝试批处理策略或异步IO来解决这个问题

一般来说,没有什么灵丹妙药可以提高管道的吞吐量,您需要进行实验


数据新鲜度或系统滞后正在增加 首先,我建议你退房

对于流媒体而言,水印的推进是推动管道前进的动力,因此,重要的是要注意可能导致水印被抑制并使管道下游停滞的事情。水印可能被卡住的一些原因:

  • 一种可能性是管道遇到无法解决的错误情况当捆绑处理失败时,管道将继续尝试无限期地执行该捆绑,这将阻止水印。
    • 发生这种情况时,您将在数据流控制台中看到错误,在重试捆绑包时,计数将不断增加。见:

  • 将时间戳与数据关联时可能会出现错误。确保时间戳数据的分辨率正确
  • 虽然不太可能,但您可能遇到了数据流中的错误。如果其他提示都没有帮助,请打开支持单

您提到的非常大的侧输入可能会有问题,您是否也可以提到被认为是“非常大”的内容?我有两个边输入,每个边有1GB,但我的工作类型是e2-highmem-16,有128GB的Ram。我认为这不符合非常大的要求,对吗?我在问,因为我的数据流作业也被困在网上,而且没有任何日志记录为什么它们会在一段时间后停止并失败,并出现“工人与服务失去联系”。你是对的,在这种情况下,你的大量输入不应该造成这种问题