我有一个cassandra数据库,有大量记录~4百万。我有3台奴隶机和一台司机。我想在spark内存中加载这些数据并进行处理。当我执行以下操作时,它会读取一台从机中的所有数据(6 Gb中的300 mb),并且所有其他从机内存都未使用。我对数据帧进行了重新定位,但是数据仍在一台机器上。因此,由于每个作业都在一台机器上执行,因此处理数据需要花费大量时间。这就是我正在做的事情
val tabledf = _sqlContext.read.format("org.apache.spark.sql.cassandra").options(Map( "table" -> "events", "keyspace" -> "sams")).load
tabledf.registerTempTable("tempdf");
_sqlContext.cacheTable("tempdf");
val rdd = _sqlContext.sql(query);
val partitionedRdd = rdd.repartition(3)
val count = partitionedRdd.count.toInt
当我在partitionedRdd上执行某些操作时,它仅在一台机器上执行,因为所有数据仅存在于一台机器上
UPDATE 我在配置中使用它--conf spark.cassandra.input.split.size_in_mb = 32,仍然将我的所有数据加载到一个执行器中
更新 我正在使用spark版本1.4和spark cassandra connector 1.4版本发布
答案 0 :(得分:0)
如果“Query”只访问单个C *分区键,您将只获得一个任务,因为我们没有办法(还)自动获得并行的单个cassandra分区。如果您正在访问多个C *分区,请尝试进一步缩小mb中的输入split_size。