Apache Spark 挂起数据库中的任务

m4pnthwp  于 2023-06-24  发布在  Apache
关注(0)|答案(1)|浏览(147)

我正在将pandas UDF应用于数据块中的分组数据框。当我这样做的时候,一些任务会永远挂起,而其余的任务会很快完成。
我首先对数据集进行重新分区,以便每个组都在一个分区中:

group_factors = ['a','b','c'] #masked for anonymity

model_df = (
    df
    .repartition(
        num_cores, #partition into max number of cores on this compute
        group_factors #partition by group so a group is always in same partition
        )
    )

然后我对数据集进行分组并应用udf:

results = (
model_df #use repartitioned data
    .groupBy(group_factors) #build groups
    .applyInPandas(udf_tune, schema=result_schema) #apply in parallel
    )

#write results table to store parameters
results.write.mode('overwrite').saveAsTable(table_name)

然后Spark将其划分为与分区数量相等的任务。除了两个任务外,它可以成功运行所有任务。这两个任务不会抛出错误,而是挂起直到作业的超时阈值。
Spark UI for compute cluster
奇怪的是,这些小组/任务似乎没有任何违规行为。记录大小与其他58个已完成任务相似。代码不会抛出任何错误,所以我们没有错误输入或格式的数据。此外,此命令实际上成功完成的时间约为20%。但大多数时候,我们会被一两个挂起的任务抓住,导致工作失败。
stderr只是指出任务挂起:
stderr for hanging task
stdout记录了一个分配错误(尽管所有已完成的任务在其stdout文件中都包含相同的分配失败):
stdout for hanging task
对于如何避免挂起任务的问题有什么建议吗?
当我减少数据大小时(例如,将model_df拆分为4个较小的子集,对每个子集进行分组和应用,并追加结果),我不会遇到这个问题。

m0rkklqb

m0rkklqb1#

在将pandas UDF应用于分组的DataFrame时,您在Databricks中遇到的挂起任务问题可能由于各种原因而发生。以下是一些建议,可帮助您排除故障并解决此问题:
1.* * 增加超时时间**:默认情况下,pandas UDF执行的超时设置为30分钟。您可以尝试通过在applyInPandas函数中设置timeout参数来增加超时值。例如:.applyInPandas(udf_tune, schema=result_schema, timeout=600)
1.* * 检查资源利用率**:验证群集是否有足够的可用资源(CPU、内存)来处理工作负载。确保集群配置和示例类型适合您的数据大小和处理要求。您可以使用Databricks Cluster UI监视资源利用率。
1.* * 审核数据不对称**:检查组内是否存在任何显著的数据偏斜或不平衡。偏度会导致任务分布不均匀,并影响特定任务的执行时间。您可以使用Databricks DataFrame API或SQL函数分析组内数据的分布。
1.* * 启用动态分配**:为您的Spark集群启用动态分配。动态分配允许Spark根据工作负载调整执行器的数量,这有助于资源分配和任务分配。您可以通过在群集配置中将spark.dynamicAllocation.enabled配置设置为true来启用它。
1.* * 优化pandas自定义项**:确保您的pandas UDF被高效地编写。检查UDF中的代码,看看是否存在任何性能瓶颈或可以优化的区域。确保尽可能使用向量化操作来充分利用pandas的全部功能。
1.* * 检查自定义项错误**:虽然您提到代码不会抛出任何错误,但请仔细检查UDF代码,以查找可能导致代码挂起或无限期运行的任何潜在问题。检查逻辑并确保它正确地处理了所有可能的场景。
1.* * 分区和重分区**:尝试使用不同的分区策略,看看它是否能提高性能。您可以尝试使用不同数量的分区或使用不同的分区列重新分区数据。有时,不同的分区方案可以帮助负载平衡并减少挂起任务的机会。
1.* * 联系Databricks支持**:如果问题仍然存在,并且上述建议都没有帮助,建议联系Databricks支持以获得进一步的帮助。他们可以分析您的设置的具体细节,并提供针对您的用例定制的指导。
请记住监视Spark UI、Databricks Cluster UI,并检查日志中是否有可能有助于确定挂起任务的根本原因的其他信息或错误消息。
请注意,解决Spark等分布式系统中的性能问题可能非常复杂,并且取决于数据和工作负载的特定特征。可能需要进行实验和调优,以找到适合您的用例的最佳配置。

相关问题