簡體   English   中英

Spark失敗了java.lang.OutOfMemoryError:超出了GC開銷限制?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM