当前位置: 首页 > 知识库问答 >
问题:

Google Cloud上的Apache Beam作业停滞-CPU过高

籍靖
2023-03-14

我们正在尝试调试运行在Google Cloud上的一个看似部分停顿的Apache Beam作业。我们的工作从PubSub读取消息,以各种方式对其进行转换,并将结果流式传输到几个BigQuery表。部分工作仍然是活动的-我们的几个表正在更新。但其他部分似乎停滞不前,上一次数据库表更新是在许多小时前(2:35AM)。不幸的是,我们在日志中没有看到有用的异常。我们只有少量用户生成的日志消息,每分钟发出一次,这些消息已经停止,最后一条是在2:35AM。大约一个小时后,Beam增加了每个自动缩放管道的工人数量,大概是为了解决部分管道的积压问题。

没有有用的日志,我唯一的线索就是

>

  • 一些工作人员似乎有一个Java进程卡在100%CPU上
  • 查看这些workers上的/var/log/dataflow/windmille/将显示一个在凌晨2:36更新的警告和错误日志,其中包含如下消息:

    W0811 02:35:43.005868    19 work_service_client.cc:958] flowingestion-gcla-081020-08101355-256d-harness-jmb
    5 Unable to update setup work item 5076700766800503996 error: DEADLINE_EXCEEDED: Http(504) Gateway Timeout
    E0811 02:36:12.814573   208 work_service_client.cc:689] flowingestion-gcla-081020-08101355-256d-harness-jmb
    5 Lost lease for work with id 1911643509568450683
    

    而且

        E0811 02:36:12.821274   208 work_service_client.cc:689] flowingestion-gcla-081020-08101355-256d-harness-jmb
        5 Lost lease for work with id 8994368075509118540
        E0811 02:36:12.821322   208 work_service_client.cc:689] flowingestion-gcla-081020-08101355-256d-harness-jmb
        5 Lost lease for work with id 8994368075509118575
    

    有没有人对从这里往哪走有什么建议?

    如果谷歌云团队的任何一个人能看一下,我们的作业ID是2017-08-10_13_55_26-6781083469468673800。

  • 共有1个答案

    施锋
    2023-03-14

    我们发现问题出在我们自己的代码上...

    我们管道中的一个阶段试图从pubsub解压缩它的输入。出了问题,解压缩陷入了CPU绑定的循环中。

    为了确定这一点,我们做了以下工作:

    • 使用Google Compute Engine web界面,我们查看了每个工作人员在过去几个小时内的CPU历史记录。在Apache Beam pipeline启动后运行的那些系统中,有几个在凌晨2点35分(!)左右显示CPU使用量急剧增加(!)
    • 我们使用ssh连接到其中一个实例,运行top,并在100%的CPU上发现了一个Java进程。
    • 我们无法使用jstack获得堆栈跟踪--它报告该进程“似乎不是热点VM”。我们可以向线程转储的pid发出SIGQUIT,但是描述符1连接到管道。因此,我们使用strace-f-s 256-o strace.out附加到pid,发出SIGQUIT,然后从strace.out重构线程转储。

    输出显示了一个有趣的线程(在300多个线程中)在我们自己的代码中运行。这就暴露了问题。

    我很想知道有没有人有更好的方法来做这件事:-)

     类似资料:
    • 我有一个数据流工作,将单个文件分割成x个记录(表)。这些流在bigQuery没有问题。 不过,我发现没有办法在结果出来后执行管道中的另一个阶段。 举个例子 根据上述内容,我希望运行以下内容: 是有无论如何运行管道的另一个部分后,up到bigQuery或这是不可能的?提前感谢。

    • 我已经在kuberenetes中使用散列分片设置了分片的MongoDB集群。我首先创建了配置服务器副本集,然后创建了2个分片副本集。最终创建了mongos来连接分片集群。 我按照下面的链接设置分片MongoDB点击https://docs . MongoDB . com/manual/tutorial/deploy-sharded-cluster-hashed-sharding/ 在创建mongo

    • 我怎样才能停止一个工作在Spring批次?我尝试使用下面的代码来使用这个方法: 我尝试也完成了,失败了,但这个方法不工作,作业继续执行。有解决办法吗?

    • 我们在本地安装了一台新的TFS 2017服务器。我的系统管理员设置了https并生成了自签名证书。使用VisualStudio内置的git工具,一切都可以正常工作。当我尝试从CLI执行任何操作时,会出现以下错误: 我所尝试的: > 经过一些故障排除后,我将本地证书导出为Base-64编码的x.509(.CER)文件,并将其附加到 仔细检查我的git配置以确保http。sslcainfo指向正确的c

    • 我已经在 GCP Kubernetes 上设置了一个 cron 作业。它每天上午10:00运行一次。作业按预期运行,但是,我真的不明白 GCP K8S 控制台上的图表是什么。 如图所示,当cron作业没有运行时,此时大约有1.5个CPU和8G RAM。我希望当前的使用应该为零,因为它没有运行。 谁能看出出了什么问题?还是我看错了图表? 请注意,我在历史中保留了7个作业。每个作业运行了大约15秒并成

    • 问题内容: 好的,我在一个空程序上进行了测试,仅运行一会儿(true){}就使我的CPU占用了50%以上的资源。我正在开发一个游戏,它使用while循环作为主循环,并且CPU始终处于100。 我如何才能让Java重复执行某些操作,而又不消耗超过50%的CPU来执行重复操作呢? 问题答案: 添加睡眠以使线程在一段时间内处于空闲状态: 没有睡眠,while循环将消耗所有可用的计算资源。(例如,理论上,