繁体   English   中英

在Apache Spark Java中无法.collect(),OutOfMemoryError:超出了GC开销限制

[英]Cannot .collect() in Apache Spark Java, OutOfMemoryError: GC overhead limit exceeded

我是Spark的新手(在MacOS上运行),并且我一直在尝试测试PC中的一些.parquet文件,它们的大小约为120mb,尝试在将master设置为local[*]local[*]运行它们。

基本上,我目前拥有的业务流程如下:

        dataset
            .where(...)
            .toJavaRDD()
            .sortBy(...) // Tried .collect() here. Current 'debug' point.
            .groupBy(...) // Tried .collect() here.
            .flatMapValues(...)
            .mapToPair(...) // Tried .collect() here.
            .reduceByKey(...); // Tried .collect() here.

我想问的第一件事, 如何检查实木复合地板文件架构? 我已经读到了Hive可以实现的功能,但还没有找到任何东西。 如果您有任何对我有用的资源,将不胜感激。

其次,由于我并不真正知道我必须在groupBy()中访问的所有镶木地板列名称,因此,我只是试图在第一个sortBy()中收集所有内容,然后查看结果如何(例如一些小测试)。以便开始使用Spark以及一切工作原理)。 但是正如问题所说,我总是会得到给定的错误。 我做错了什么吗? 我毕竟不应该收集()吗?

我尝试在某些时候进行打印,但就我所知,它似乎进入了一些日志,我真的不知道它们是否存储在计算机中或如何访问它们,以便可以看到输出?

说到Spark配置,这是最基本的配置。

    final SparkConf sparkConf = new SparkConf()
        .setMaster("local[*]")
        .setAppName("test_app_name");

    final JavaSparkContext jsc = new JavaSparkContext(sparkConf);

    // Get the singleton instance of SparkSession
    SparkSession sparkSession = SparkSession.builder()
            .config(jsc.getConf())
            .getOrCreate();

    Dataset<Row> dataset = sparkSession.read()
            .parquet(inputPath);

如果您的数据很大,那么在spark中执行收集操作就不好了。 收集实际上将所有数据带到驱动程序。 这将导致驱动程序中的内存超出范围。 除非您完全确定要收集的数据很小。

要查看数据集/数据框架构,您需要执行

 dataset.printSchema

要打印数据集的几行,可以使用以下命令

 dataset.show(10) // number of rows you want to see

要么

 dataset.take(10).foreach(println) // takes 10 rows and print

如果要查看随机行进行采样,可以使用

 df.select("name").sample(.2, true).show(10)

要么

 df.select("name").sample(.2, true).take(10).foreach(println)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM