我有一个应用程序可以将作业触发到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再次获取并处理计数吗?
有人可以澄清一下吗?
修改
2 ..如果spark自动在4名工人中分配10个Cassandra分区的计算,谁会汇总结果?师父正在做分发。它也聚合在一起吗?
如果我不缓存RDD并进行另一次计数操作,会发生什么? spark会尝试使用之前用于特定分区的同一个worker并附加到该节点中的结果RDD。我认为它必须查询Cassandra再次获取此分区数据?你能说清楚吗?
如果我缓存我的RDD,会发生什么? RDD存储在worker中,它将用于所有操作吗?在这种情况下,这与我们将数据集存储在内存中并处理它有何不同?请告诉我是否有关于此的权利。
答案 0 :(得分:3)
像CQL命令一样,RDD的Spark加载和转换被懒惰地评估。
动作触发要运行的所有前体转换,因此在您的示例中,count()是一个动作。
Spark内部工作的方式是构建转换图。当需要运行某个操作时,它会将图形分解为可由各个工作人员运行的单独子任务。
要执行像count()这样的单个操作,数据将仅从Cassandra中提取一次,如果可能,每个执行程序的RDD将从每个Cassandra节点本地的数据中填充。
如果对从q创建的RDD执行其他操作,它仍可以缓存在内存中并将被重用。如果您打算重新使用RDD,可以进行API调用以明确请求将RDD缓存在内存中。