【问题标题】:Spark fails with java.lang.OutOfMemoryError: GC overhead limit exceeded?Spark 因 java.lang.OutOfMemoryError 失败:超出 GC 开销限制?
【发布时间】:2015-10-30 10:37:34
【问题描述】:

这是我使用 Apache spark sql 从 Hive 查询数据的 java 代码。

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 配置中增加内存。

【问题讨论】:

    标签: java hadoop apache-spark-sql


    【解决方案1】:

    如果您使用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。

    【讨论】:

    • 但我将它作为 Java 应用程序运行。在那种情况下如何做到这一点
    • @wazza 你不是在构建一个 jar 并将其提交给 spark 吗?
    • 不,我是直接在 netbeans 中运行上面的代码
    • @wazza 你可以尝试从我的编辑中添加参数
    • 我遇到了同样的异常。该表包含 100 万行,是否有任何其他方法可以在没有此内存问题的情况下进行查询
    【解决方案2】:

    您找到解决问题的方法了吗? 如果你有,请分享它们: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:这只是一个想法,我还没有测试过

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 2015-02-12
      • 1970-01-01
      • 2021-02-04
      • 2017-12-27
      • 2020-09-08
      • 2020-07-24
      • 1970-01-01
      相关资源
      最近更新 更多