不能在Apache Spark Java中使用.collect(),OutOfMemoryError:超出GC开销限制

时间:2017-09-28 08:35:39

标签: java apache-spark

我对Spark(在MacOS上运行)完全不熟悉并且我一直在尝试测试我的PC中的一些.parquet文件,这些文件大小约为120mb,尝试在本地运行它们,并将master设置为{ {1}}。

基本上我目前拥有的操作流程如下......

local[*]

我想问的第一件事,我如何查看镶木地板文件架构?我已经读过一些可能与Hive有关但没有找到任何东西的东西。如果你有任何对我有用的资源,它将会非常适合。

其次,因为我真的不知道我必须在groupBy()中访问的所有镶木地板列名称等等,我只是想在第一个sortBy()中收集所有东西,看看会发生什么等等(一些)进行小规模测试,以便开始使用Spark以及一切如何工作)。但问题是我总是得到给定的错误。有什么我做错了吗?毕竟不应该.collect()吗?

我尝试在某些方面进行打印,但据我所知,它似乎会进入某些日志,我不知道它们是否存储在本地计算机中,或者我如何访问它们以便我可以看到输出?

当谈到Spark配置时,它是最基本的配置。

        dataset
            .where(...)
            .toJavaRDD()
            .sortBy(...) // Tried .collect() here. Current 'debug' point.
            .groupBy(...) // Tried .collect() here.
            .flatMapValues(...)
            .mapToPair(...) // Tried .collect() here.
            .reduceByKey(...); // Tried .collect() here.

1 个答案:

答案 0 :(得分:0)

如果您的数据很庞大,那么在spark中执行收集操作并不好。 Collect基本上将所有数据带到驱动程序。这将导致驱动程序中的内存outOf绑定。除非您完全确定您收集的数据非常小。

要查看您需要执行的数据集/数据框架构

 dataset.printSchema

要打印数据集的几行,您可以使用以下内容

 dataset.show(10) // number of rows you want to see

或者

 dataset.take(10).foreach(println) // takes 10 rows and print

如果要查看随机行进行采样,可以使用

 df.select("name").sample(.2, true).show(10)

或者

 df.select("name").sample(.2, true).take(10).foreach(println)