什么时候从Cassandra

时间:2015-07-22 14:23:36

标签: cassandra apache-spark cassandra-2.0 spark-cassandra-connector

我有一个应用程序可以将作业触发到spark master。但是,当我检查执行作业的IP地址时,它显示我的应用程序IP而不是火花工人IP。所以,根据我的理解,对RDD的调用会产生一个工作的spark工作者。

但我的问题是这个。

CassandraSQLContext c = new CassandraSQLContext(sc);

QueryExecution q=c.executeSql(cqlCommand); //-----1

q.toRDD().count(); //----2

我看到工人为2做了一些事,但没有为1做什么。

这是否意味着从Cassandra中获取并在1中完成RDD创建都是在应用程序中完成的?

如果是这样,2确实会触发两名工人的工作。在那种情况下,它是从Cassandra再次获取并处理计数吗?

有人可以澄清一下吗?

修改

  1. 根据提供的答案,如果计数调用触发工作程序运行,那么executeSQL在本地创建RDD有什么用?这是通过查询创建数据的Cassandra数据集吗?如果是这样的话,从Cassandra查询会发生两次?
  2. 2 ..如果spark自动在4名工人中分配10个Cassandra分区的计算,谁会汇总结果?师父正在做分发。它也聚合在一起吗?

    1. 如果我不缓存RDD并进行另一次计数操作,会发生什么? spark会尝试使用之前用于特定分区的同一个worker并附加到该节点中的结果RDD。我认为它必须查询Cassandra再次获取此分区数据?你能说清楚吗?

    2. 如果我缓存我的RDD,会发生什么? RDD存储在worker中,它将用于所有操作吗?在这种情况下,这与我们将数据集存储在内存中并处理它有何不同?请告诉我是否有关于此的权利。

1 个答案:

答案 0 :(得分:3)

像CQL命令一样,RDD的Spark加载和转换被懒惰地评估。

动作触发要运行的所有前体转换,因此在您的示例中,count()是一个动作。

Spark内部工作的方式是构建转换图。当需要运行某个操作时,它会将图形分解为可由各个工作人员运行的单独子任务。

要执行像count()这样的单个操作,数据将仅从Cassandra中提取一次,如果可能,每个执行程序的RDD将从每个Cassandra节点本地的数据中填充。

如果对从q创建的RDD执行其他操作,它仍可以缓存在内存中并将被重用。如果您打算重新使用RDD,可以进行API调用以明确请求将RDD缓存在内存中。