这是我的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配置中的内存。
答案 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:这只是一个想法,我还没有测试过它