簡體   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