Scala 如何在Spark中以小块方式迭代大型Cassandra表
在我的测试环境中,我有1个Cassandra节点和3个Spark节点。我想迭代一个很大的表,它有大约200k行,每个行大约占用20-50KBScala 如何在Spark中以小块方式迭代大型Cassandra表,scala,cassandra,apache-spark,rdd,Scala,Cassandra,Apache Spark,Rdd,在我的测试环境中,我有1个Cassandra节点和3个Spark节点。我想迭代一个很大的表,它有大约200k行,每个行大约占用20-50KB CREATE TABLE foo ( uid timeuuid, events blob, PRIMARY KEY ((uid)) ) 下面是在spark cluster上执行的scala代码 val rdd = sc.cassandraTable("test", "foo") // This pulls records in memor
CREATE TABLE foo (
uid timeuuid,
events blob,
PRIMARY KEY ((uid))
)
下面是在spark cluster上执行的scala代码
val rdd = sc.cassandraTable("test", "foo")
// This pulls records in memory, taking ~6.3GB
var count = rdd.select("events").count()
// Fails nearly immediately with
// NoHostAvailableException: All host(s) tried for query failed [...]
var events = rdd.select("events").collect()
卡桑德拉2.0.9,Spark:1.2.1,Spark-Cassandra-connector-1.2.0-alpha2
我试图只运行collect
,而不运行count
——在这种情况下,它只是在NoHostAvailableException
下快速失败
问题:一次迭代大表读取和处理小批量行的正确方法是什么?Cassandra Spark Connector中有两种设置用于调整块大小(将它们放在SparkConf对象中):
- spark.cassandra.input.split.size:每个spark分区的行数(默认值100000)
- spark.cassandra.input.page.row.size:每个获取页面的行数(即网络往返)(默认值1000)
此外,您不应该在示例中使用
collect
操作,因为它将获取驱动程序应用程序内存中的所有行,并可能引发内存不足异常。只有在确信它将生成少量行的情况下,才能使用collect
操作。count
操作不同,它只生成一个整数。因此,我建议您像以前一样从Cassandra加载数据,对其进行处理,并存储结果(以Cassandra、HDFS等格式) 您可以尝试在计数之前增加分区数,并进行重新分区