2015-04-28 137 views
0

我需要關於如何計算需要多少堆空間(內存)來操作xmb(假設x意味着600 mb)在火花獨立羣集中需要多少信息。Apache Spark 1.2.1獨立羣集給出java堆空間錯誤

場景:

我有14GB存儲和8個內核獨立集羣。我想在600 MB的數據上運行(從文件中讀取數據並將其寫入Cassandra)。

對於這個任務,我有SparkConfig爲:

.SET( 「spark.cassandra.output.throughput_mb_per_sec」, 「800」)

.SET( 「spark.storage.memoryFraction」,「0.3 「)

- - 執行程序內存= 5g - 總執行程序核心6 - 提交任務時的驅動程序內存6g。

儘管存在上述配置,但在向Cassandra寫入數據時出現java堆空間錯誤。

下面是Java代碼:

public static void main(String[] args) throws Exception { 
    String fileName = args[0]; 

    Long now = new Date().getTime(); 

    SparkConf conf = new SparkConf(true) 
      .setAppName("JavaSparkSQL_" +now) 
      .set("spark.cassandra.connection.host", "192.168.1.65") 
      .set("spark.cassandra.connection.native.port", "9042") 
      .set("spark.cassandra.connection.rpc.port", "9160") 
      .set("spark.cassandra.output.throughput_mb_per_sec","800") 
      .set("spark.storage.memoryFraction", "0.3"); 

    JavaSparkContext ctx = new JavaSparkContext(conf); 


    JavaRDD<String> input =ctx.textFile  
("hdfs://abc.xyz.net:9000/figmd/resources/" + fileName, 12); 
    JavaRDD<PlanOfCare> result = input.mapPartitions(new 
ParseJson()).filter(new PickInputData()); 

    System.out.print("Count --> "+result.count()); 
    System.out.println(StringUtils.join(result.collect(), ",")); 


javaFunctions(result).writerBuilder("ks","pt_planofcarelarge", 
mapToRow(PlanOfCare.class)).saveToCassandra(); 

} 

什麼樣的配置,我該做的我錯過了什麼? 在此先感謝。

+0

和哪裏出錯? – eliasah

+0

感謝您的回覆。將數據寫入Cassandra時出現堆空間錯誤。 –

+1

你需要分享一些代碼。也許你正在對你的rdd進行收集,導致堆空間錯誤,或者你可能會做的其他許多事情之一來炸燬你的堆!你的問題不能像這樣解決。 – eliasah

回答

1

JavaRDD collect方法返回一個包含此RDD中所有元素的數組。

因此,在你的情況下,它將創建一個數組,其中包含340000個元素,這將導致Java Heap Error,您可能需要取一小部分數據樣本或collect它,或者您可能希望將其直接保存到磁盤。

有關JavaRDD的更多信息,您始終可以參考official documentation