![](/img/trans.png)
[英]Spark fails with java.lang.OutOfMemoryError: GC overhead limit exceeded?
[英]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.