将数据加载到elasticsearch中的Spark应用程序一直挂起

问题描述 投票:0回答:1

我们的 Spark 应用程序将数据从 s3 加载到 Elasticsearch 时遇到了一些问题。几周以来,这些作业在 Kubernetes 中不再正确关闭。

我们的工作描述:首先,spark 作业将执行一些 Spark 操作,一切顺利,之后它将在关闭之前向 Elastic 读取和写入数据,然后出现错误。我们已经注意到,当我们收到响应时,与 Elastic 的通信正在工作,但之后当尝试继续处理 Java 进程时,它一直挂起。

成功的作业将包含以下调试日志:

DEBUG RestClient: request [HEAD https://xxx:443/my-index] returned [HTTP/1.1 200 OK]
DEBUG JavaClient: Http Response Response{requestLine=HEAD / my-index HTTP/1.1, host=https://xxx:443, response=HTTP/1.1 200 OK}
res1: Boolean = true

虽然我们失败的工作一直悬在

DEBUG RestClient: request [HEAD https://xxx:443/my-index] returned [HTTP/1.1 200 OK]
并且无法继续
DEBUG JavaClient: Http Response Response{requestLine=HEAD / my-index HTTP/1.1, host=https://xxx:443, response=HTTP/1.1 200 OK}

我们一直在 Spark-shell 中进行大量测试,我们在挂起的执行器中打开该 shell,我们注意到添加

--conf "spark.driver.extraJavaOptions=-Dscala.concurrent.context.maxThreads=16"
使我们能够执行一些成功的 HEAD 请求,并返回 200 和 404 响应并关闭正确关闭。然而它似乎不稳定,当将它添加到 Spark-Submit 时它也不起作用。此外,虽然它可以工作,但假设对 HEAD 请求进行了 75% 的测试,但我还没有看到它对 PUT /my-index?master_timeout=10000ms&timeout=10000ms 请求有效,该请求在索引创建后始终保持挂起状态。

除了spark-shell调试之外,我还有以下信息要分享: 健康执行器的资源使用情况: 工作顺利 与不健康的工作相比(都是相似的工作): 悬挂作业

CPU 使用率下降,而不是执行最后的代码,然后一直挂起。 因此,我尝试使用资源(增加和减少 cpu 和内存),尝试为每个驱动程序使用 1 个执行程序而不是 2 个,我尝试使用以下设置

spark.executor.heartbeatInterval=10s
spark.network.timeout=100s
spark.dynamicAllocation.executorIdleTimeout: 10s

我们重新启动了集群,但这些潜在的解决方案都对我们不起作用。

这些作业过去曾在我们的系统上使用相同的 Spark、Java、Elastic 和 Kubernetes 版本运行,所以我不确定为什么会突然发生这种情况。 该问题从8月13日开始。 我们目前正在使用以下版本:spark 3.3.1、elastic 8.15.0 和 Kubernetes 1.24.17

有人以前见过这个/有一些想法能够解决我们的问题吗?

谢谢! 艾琳

apache-spark http elasticsearch kubernetes
1个回答
0
投票

我们解决了这个问题:在项目的当前版本中,我们仍然在启用的 build.gradle 文件中启用了

relocate 'org.apache.http', 'xxx'
,该文件应该在项目的先前版本中删除。删除重定位后,问题就解决了。根本原因分析仍在进行中。

© www.soinside.com 2019 - 2024. All rights reserved.