Spark出现java.lang.OutOfMemoryError: GC overhead limit exceeded错误?

4

这是我的Java代码,我使用Apache Spark SQL从Hive查询数据。

JavaSparkContext ctx = new JavaSparkContext(new SparkConf().setAppName("LoadData").setMaster("MasterUrl"));
HiveContext sqlContext = new HiveContext(ctx.sc());
List<Row> result = sqlContext.sql("Select * from Tablename").collectAsList();

当我运行这段代码时,它会抛出java.lang.OutOfMemoryError: GC overhead limit exceeded。如何解决这个问题或者如何在Spark配置中增加内存。
2个回答

0

你解决问题了吗?如果有,请分享一下 :D

这是我的想法:rdd和javaRDD都有一个方法toLocalIterator(),Spark文档说:

迭代器将消耗与此RDD中最大分区相同的内存。

这意味着如果将rdd分成多个分区,则迭代器将比List消耗更少的内存,你可以尝试这样做:

Iterator<Row> iter = sqlContext.sql("Select * from Tablename").javaRDD().toLocalIterator();
while (iter.hasNext()){
    Row row = iter.next();
    //your code here
}

ps:这只是一个想法,我还未进行过测试。


0

如果您正在使用spark-shell运行它,则可以使用driver-memory来增加内存限制:

spark-shell --driver-memory Xg [other options]

如果执行程序出现问题,则可以使用--executor-memory XG调整其内存限制。

您可以在指南中找到有关如何准确设置它们的更多信息:submission用于执行程序内存,configuration用于驱动程序内存。

@编辑:由于您是从Netbeans运行它,因此您应该能够将它们作为JVM参数传递-Dspark.driver.memory=XG-Dspark.executor.memory=XG。我认为它在Project Properties下的Run中。


但我将其作为Java应用程序运行。在这种情况下,如何做到这一点? - wazza
@wazza 你不是在构建一个jar并将其提交到Spark吗? - Mateusz Dymczyk
不,我直接在NetBeans中运行上述代码。 - wazza
我遇到了相同的异常。这个表包含100万行,有没有其他方法可以查询而不会出现内存问题? - wazza
@wazza你的表有多大?你需要整个对象吗?还是可以仅返回一些字段而不是返回 *?否则,我想你将不得不使用偏移/限制将其分成较小的查询块。 - Mateusz Dymczyk
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接