【问题标题】:Using Spark to process dataset larger than the cluster can fit使用 Spark 处理大于集群可以容纳的数据集
【发布时间】:2018-12-05 05:39:05
【问题描述】:

我在由 5 个节点组成的 Spark 2.3 集群上,每个节点都有 12Gb 的可用内存,并且正在尝试使用大约 130Gb 的 Parquet 数据集,在此之上我创建了一个分区的外部 Hive 表。

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

sql("select count(*) from myhivetable") 这样的愚蠢方法不起作用:作业失败并出现 java 堆空间错误。 sql("select * from myhivetable").count() 也没有(我猜它们无论如何都会编译成相同的执行计划)。

我可能会忘记 hive 表,使用文件系统 API 获取包含该表的文件列表并逐个文件进行记录计数,将计数汇总到结果中,例如 fileList.foldLeft{ (recCount, file) => file.read(parquet).count + recCount} -- 但是, a)这种方法可能无法“扩展到”其他可能的用例,b)我仍然猜想应该有一种更优雅的方法来做到这一点,只需使用 Spark 工具集。我没看到吗?

【问题讨论】:

  • 你能发布详细的错误,包括堆栈跟踪

标签: apache-spark apache-spark-sql large-data parquet


【解决方案1】:

假设您每个节点有 8 个核心,您可以尝试将这些参数与 spark-submitspark-shell 一起使用:

Total memory - 5 * 12GB = 60GB Total Cores - 5 * 8 = 40

--driver-cores 1
--driver-memory 2G
--num-executors 9
--executor-cores 4
--executor-memory 6G

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

我不确定使用SELECT COUNT(1) FROM table 代替SELECT COUNT(*) FROM table 是否有任何区别!!

【讨论】:

  • 谢谢!起初我没有意识到我的 Spark 工作资源严重不足
【解决方案2】:

您不需要集群内存来容纳所有数据。这是镶木地板数据,因此解压缩需要一些内存。尝试增加执行程序内存(这是计数查询,因此驱动程序内存不应该成为问题)。如果在此之后仍然失败,请分享堆栈跟踪。

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2017-02-10
    • 2018-08-23
    • 2016-11-04
    相关资源
    最近更新 更多