spark失败,java.lang.outofmemoryerror:超出gc开销限制?

bfrts1fy  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(358)

这是我的java代码,我在其中使用apachesparksql从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配置中增加内存。

qxsslcnc

qxsslcnc1#

如果您正在使用 spark-shell 要运行它,您可以使用 driver-memory 要突破内存限制: spark-shell --driver-memory Xg [other options] 如果执行器有问题,那么您可以使用 --executor-memory XG 您可以在指南中找到有关如何正确设置它们的更多信息:提交执行器内存、配置驱动程序内存。
@编辑:因为您是从netbeans运行它,所以应该能够将它们作为jvm参数传递 -Dspark.driver.memory=XG 以及 -Dspark.executor.memory=XG . 我想是在 Project Properties 低于 Run .

bq9c1y66

bq9c1y662#

你找到解决问题的办法了吗?如果你有:d,请分享
我的想法是:rdd和javardd都有一个方法 toLocalIterator() 一份文件说
迭代器将消耗与此rdd中最大分区相同的内存。
这意味着迭代器将消耗比列表更少的内存。如果rdd被划分为多个分区,您可以这样尝试:

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

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

相关问题