![](/img/trans.png)
[英]SPARK SQL java.lang.OutOfMemoryError: GC overhead limit exceeded
[英]Spark fails with java.lang.OutOfMemoryError: GC overhead limit exceeded?
這是我的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配置中的內存。
如果您使用spark-shell
運行它,那么您可以使用driver-memory
來突破內存限制:
spark-shell --driver-memory Xg [other options]
如果執行程序有問題,那么您可以使用--executor-memory XG
調整其內存限制
您可以在指南中找到有關如何准確設置它們的更多信息: 提交執行程序內存, 配置驅動程序內存。
@Edit:因為你從Netbeans運行它,你應該能夠將它們作為JVM參數-Dspark.driver.memory=XG
和-Dspark.executor.memory=XG
。 我認為它是在Run
下的Project Properties
。
你找到了解決問題的方法嗎? 如果你有,請分享: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:這只是一個想法,我還沒有測試過
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.