Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在Spark中以小块方式迭代大型Cassandra表_Scala_Cassandra_Apache Spark_Rdd - Fatal编程技术网

Scala 如何在Spark中以小块方式迭代大型Cassandra表

Scala 如何在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

在我的测试环境中,我有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 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等格式)

您可以尝试在计数之前增加分区数,并进行重新分区