2015-04-28 79 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