我正在编写一个spark / scala ETL作业,它执行一些数据操作,从mongo db和redshift读取数据,加入,映射然后保存到s3。使用数据帧和数据集使用spark api(select,UDF)完成所有转换。 数据不是很大,总行数约为1M,而且它主要是select语句和udf。 由于某种原因,这项工作需要大约一个小时才能运行(EMR,每个工人1个主机和11个核心16cpu,每个工人32GB ram)
我已将dynamicLocation设置为true,并且我确实看到所有工作人员都接受任务,但是当我将数据写入s3(最终且唯一的操作)时,程序会写入200个文件并且它们的大小会增加,第一个是MB和最后一次大约30MB,最终文件是100MB。由于文件的数量是RDD的分区数和任务数,这让我觉得可能任务没有处理相同大小的数据,因此并行性不能正常工作。
可能是这种情况吗?
由于 尼尔