![](/img/trans.png)
[英]Spark fails with java.lang.OutOfMemoryError: GC overhead limit exceeded?
[英]Cannot .collect() in Apache Spark Java, OutOfMemoryError: GC overhead limit exceeded
我是Spark的新手(在MacOS上运行),并且我一直在尝试测试PC中的一些.parquet文件,它们的大小约为120mb,尝试在将master设置为local[*]
在local[*]
运行它们。
基本上,我目前拥有的业务流程如下:
dataset
.where(...)
.toJavaRDD()
.sortBy(...) // Tried .collect() here. Current 'debug' point.
.groupBy(...) // Tried .collect() here.
.flatMapValues(...)
.mapToPair(...) // Tried .collect() here.
.reduceByKey(...); // Tried .collect() here.
我想问的第一件事, 如何检查实木复合地板文件架构? 我已经读到了Hive可以实现的功能,但还没有找到任何东西。 如果您有任何对我有用的资源,将不胜感激。
其次,由于我并不真正知道我必须在groupBy()中访问的所有镶木地板列名称,因此,我只是试图在第一个sortBy()中收集所有内容,然后查看结果如何(例如一些小测试)。以便开始使用Spark以及一切工作原理)。 但是正如问题所说,我总是会得到给定的错误。 我做错了什么吗? 我毕竟不应该收集()吗?
我尝试在某些时候进行打印,但就我所知,它似乎进入了一些日志,我真的不知道它们是否存储在计算机中或如何访问它们,以便可以看到输出?
说到Spark配置,这是最基本的配置。
final SparkConf sparkConf = new SparkConf()
.setMaster("local[*]")
.setAppName("test_app_name");
final JavaSparkContext jsc = new JavaSparkContext(sparkConf);
// Get the singleton instance of SparkSession
SparkSession sparkSession = SparkSession.builder()
.config(jsc.getConf())
.getOrCreate();
Dataset<Row> dataset = sparkSession.read()
.parquet(inputPath);
如果您的数据很大,那么在spark中执行收集操作就不好了。 收集实际上将所有数据带到驱动程序。 这将导致驱动程序中的内存超出范围。 除非您完全确定要收集的数据很小。
要查看数据集/数据框架构,您需要执行
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.