首页 > 解决方案 > 当线程卡住时杀死在线程中运行的火花动作

问题描述

我有一个 java 程序,它使用单独线程上的 spark 将配置单元表缓存到内存中。此线程定期触发。但有时,在缓存后(实际缓存发生时)运行操作(计数)时,作业会卡住。

如果卡住了,我想取消/杀死/停止此操作。

我试图弄清楚如何做以下两件事之一:

  1. 如果需要超过 10 分钟,则终止此操作。
  2. 或在下次再次触发线程时杀死它(因为线程定期触发)。

下面是我的代码:

public class MyThread extends Thread {

    public void run(SparkSession spark) {

        Dataset<Row> dataset = spark.sql("select * from db.table");
        dataset.cache();

        // This is where job gets stuck sometimes. I want to kill/cancel this
        long count = dataset.count();

        System.out.println("Count = " + count);

    }
}

标签: javamultithreadingdataframeapache-sparkcaching

解决方案


您的线程因内存而卡住,您正在使用cache()将数据保存到内存的方法(MEMORY_ONLY

1:尝试使用persist(StorageLevel)can根据level指定的缓存策略缓存在内存、磁盘或堆外内存中,

2:如果您正在使用 spark-submit 运行作业,请在提交作业时增加以下参数

--num-executors 
--executor-cores  
--executor-memory 
--driver-memory 

推荐阅读