我一直在尝试学习如何使用 Apache Spark,并且在尝试对 Cassandra 列中的所有值求和时遇到问题(使用 datastax spark-cassandra-connector)。我尝试的一切都会导致java.lang.OutOfMemoryError: Java heap space。
这是我提交给火花大师的代码:
object Benchmark {
def main( args: Array[ String ] ) {
val conf = new SparkConf()
.setAppName( "app" )
.set( "spark.cassandra.connection.host", "ec2-blah.compute-1.amazonaws.com" )
.set( "spark.cassandra.auth.username", "myusername" )
.set( "spark.cassandra.auth.password", "mypassword" )
.set( "spark.executor.memory", "4g" )
val sc = new SparkContext( conf )
val tbl = sc.cassandraTable( "mykeyspace", "mytable" )
val res = tbl.map(_.getFloat("sclrdata")).sum()
println( "sum = " + res )
}
}
现在,我的集群中只有一个 Spark 工作节点,而且鉴于表的大小,绝对有可能并非所有这些节点都可以同时放入内存中。但是我不认为这会是一个问题,因为 spark 应该懒惰地评估命令,并且对列中的所有值求和不需要让整个表一次驻留在内存中。
我是这个主题的新手,所以任何关于为什么这不起作用的澄清或关于如何正确地做到这一点的帮助将不胜感激。
谢谢