如何为长时间运行的数据分析任务设计一个基于spark的系统?

olhwl3o2  于 2021-06-01  发布在  Hadoop
关注(0)|答案(0)|浏览(201)

我有一个系统,在parquet的几个表中存储了250m行(和100多列)的数据。系统的设计使得分析员可以用sparksql编写查询和转换,并且这些查询将被批量执行。系统应该扩展到处理1000个这样的查询/转换。
独立地,每个查询在spark上都运行得非常好。前几个查询在几秒钟内完成,但是随着系统运行,查询开始花费更长的时间。查询开始需要60-90秒,最终,整个系统因内存不足而崩溃。
spark是设计用来处理这种类型的工作负载的吗?如果是的话,在设计系统时我们可以做些什么?
我曾尝试在hdfs上使用 unpersist 每次查询后释放RDD。然而,这似乎并没有回收任何内存。在运行的spark系统上,我们能做些什么来回收内存吗?
我已经试过了 count() 在每次查询之后——强制spark执行计划,但是同样地,内存不会被回收。有没有办法确定spark查询的范围,确保执行它并写入结果,然后回收查询期间使用的所有资源?
有没有办法监控内存使用情况?我看过 sparkContext.getExecutorStorageStatus 以及 sparkContext.getExecutorMemoryStatus . 它们都显示了足够的可用内存(25gb)。但是,使用 top 看看神经节图,我能看出它是 hadoop 使用最多内存的进程(很快增长到50gb以上),所以spark上下文中的这两个访问器可能不显示内存?
对于如何为长期运行的spark作业构建一个系统,有什么建议吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题