【解决办法】在Spark中RDD的每个分区partition数据都会被一个Task处理,一个Task通常由Executor的一个线程来处理,同一时刻多个Task由多个线程处理,因此RDD的分区数量决定了启动的Task任务数。
数据的分区数可通过spark.default.parallelism并行度参数来控制,分区数决定任务数。对于空间要素FeatureRDD、DSFFeatureRDD推荐的一个分区partition数据记录数在20000至50000区间。计算公式:分区数据记录数 = 数据集记录总数 / 分区数。
一个线程处理一个Task,Task所处理的分区partition数据记录数大小决定了需要的Executor内存。
Task计算处理的结果推荐用JDBC多线程写入PostGIS数据源,同时建议对Task结果重分区,推荐分区记录数30000左右(约30MB,即一次提交写入PG库的数据量)。可通过--numPartitions来控制,计算公式:numPartitions=预估结果记录数 / 30000。
推荐一个Task对应硬件资源为 1C + 2GB。 CPU资源越多,分析计算跑得越快。