Spark失败了java.lang.OutOfMemoryError:超出了GC开销限制?

时间:2015-08-07 05:03:25

标签: java hadoop apache-spark-sql

这是我的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开销限制。如何解决此问题或如何增加Spark配置中的内存。

2 个答案:

答案 0 :(得分:0)

如果您使用spark-shell运行它,那么您可以使用driver-memory来限制内存限制:

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

如果执行者遇到问题,您可以使用--executor-memory XG

调整内存限制

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

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

答案 1 :(得分:0)

您找到了解决问题的方法吗? 如果您有:D

请分享

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

  

迭代器将占用与最大分区一样多的内存   这个RDD。

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

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

ps:这只是一个想法,我还没有测试过它