Spark抛出内存错误

时间:2014-08-20 12:06:04

标签: scala memory-management cassandra apache-spark

我有一个8 GB ram的测试节点,我只将10 MB的数据(来自csv文件)加载到Cassandra(在同一个节点上)。我试图使用spark(在同一节点上运行)处理这些数据。

请注意,对于SPARK_MEM,我分配1 GB的RAM和SPARK_WORKER_MEMORY我正在分配相同的内容。分配任何额外的内存会导致火花抛出“检查是否所有工作人员都已注册并且有足够的内存错误”,这通常表明Spark试图寻找额外的内存(根据SPARK_MEM和SPARK_WORKER_MEMORY属性)并且做得很短。

当我尝试使用spark上下文对象加载和处理Cassandra表中的所有数据时,我在处理过程中遇到错误。所以,我试图使用循环机制一次从一个表读取数据块,处理它们并将它们放在另一个表中。

我的源代码具有以下结构

var data=sc.cassandraTable("keyspacename","tablename").where("value=?",1)
data.map(x=>tranformFunction(x)).saveToCassandra("keyspacename","tablename")

for(i<-2 to 50000){
    data=sc.cassandraTable("keyspacename","tablename").where("value=?",i)
    data.map(x=>tranformFunction(x)).saveToCassandra("keyspacename","tablename")    
}

现在,这有效一段时间,大约200个循环,然后这会引发错误:java.lang.OutOfMemoryError:无法创建新的本机线程。

我有两个问题:

Is this the right way to deal with data?
How can processing just 10 MB of data do this to a cluster?

1 个答案:

答案 0 :(得分:1)

您正在for循环中运行查询。如果&#39;值&#39; column不是键/索引列,Spark会将表加载到内存中,然后对值进行过滤。这肯定会导致OOM。