Apache spark 使用Spark处理集群无法容纳的数据集

Apache spark 使用Spark处理集群无法容纳的数据集,apache-spark,apache-spark-sql,large-data,parquet,Apache Spark,Apache Spark Sql,Large Data,Parquet,我在Spark 2.3集群上,有5个节点,每个节点都有12Gb的可用内存,我正在尝试处理大约130Gb的拼花数据集,我在上面创建了一个分区的外部配置单元表 假设我想知道数据集中的记录数。我最初的猜测是Spark将逐个分区读取数据,聚合当前分区以获得记录数,将结果传递给驱动程序,然后删除该分区以读取下一个分区。然而,要么它不是这样工作的,Spark尝试先读取内存中的所有内容,要么我把它编错了 myhivetable中类似sqlselect count*的愚蠢方法不起作用:作业失败,并出现java堆

我在Spark 2.3集群上,有5个节点,每个节点都有12Gb的可用内存,我正在尝试处理大约130Gb的拼花数据集,我在上面创建了一个分区的外部配置单元表

假设我想知道数据集中的记录数。我最初的猜测是Spark将逐个分区读取数据,聚合当前分区以获得记录数,将结果传递给驱动程序,然后删除该分区以读取下一个分区。然而,要么它不是这样工作的,Spark尝试先读取内存中的所有内容,要么我把它编错了

myhivetable中类似sqlselect count*的愚蠢方法不起作用:作业失败,并出现java堆空间错误。myhivetable.count中的sqlselect*也不存在,我想它们都编译到了相同的执行计划中


我可能会忘记配置单元表,使用文件系统API获取包含该表的文件列表,并逐个文件对记录进行计数,将计数汇总到结果中,如fileList.foldLeft{recCount,file=>file.readparquet.count+recCount}-但是,此方法可能无法扩展到其他可能的用例,b我仍然认为应该有一种更优雅的方法来使用Spark工具集。我看不到吗?

您不需要使用群集内存来容纳所有数据。这是拼花地板数据,因此解压缩需要一些内存。尝试增加执行器内存,使其成为计数查询,这样驱动程序内存就不会成为问题。如果在此之后仍然失败,请共享堆栈跟踪。

假设每个节点有8个内核,您可以尝试在spark submit或spark shell中使用以下参数:

总内存-5*12GB=60GB 总芯数-5*8=40

如果这不起作用,您可以更改号码并重试吗?请发布错误日志、Spark UI屏幕截图


我不确定使用SELECT COUNT1 FROM table而不是SELECT COUNT*FROM table是否有任何区别

你能发布包括stacktracethanks在内的详细错误吗!起初我没有意识到我的spark工作资源严重不足
--driver-cores 1
--driver-memory 2G
--num-executors 9
--executor-cores 4
--executor-memory 6G