0

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

但我的问题是这个。

CassandraSQLContext c = new CassandraSQLContext(sc);

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

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

我看到工人为 2 做某事,但为 1 什么也没做。

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

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

有人可以澄清一下吗?

编辑

  1. 按照提供的答案,如果计数调用触发了工作人员的功能,那么在本地创建 RDD 的 executeSQL 有什么用?这是否通过查询创建数据的 Cassandra 数据集?如果是这种情况,来自 Cassandra 的查询会发生两次?

2.. 如果 spark 自动将 Cassandra 的 10 个分区的计算分配给 4 个 worker,谁来汇总结果?大师只是在做分配。那么它也聚合吗?

  1. 如果我不缓存RDD并进行另一个计数操作,会发生什么?将激发尝试使用先前用于特定分区的相同工作人员并附加到该节点中的结果 RDD。我认为它必须查询 Cassandra 才能再次获取此分区数据?你能提供一些澄清吗?

  2. 如果我缓存我的 RDD,会发生什么?RDD存储在worker中,它将用于所有操作?在那种情况下,这与我们将数据集存储在内存中并进行处理有何不同?让我知道这是否也是正确的。

4

1 回答 1

3

延迟评估 RDD 的 Spark 加载和转换(如 CQL 命令)。

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

Spark 内部的工作方式是建立一个转换图。当它需要运行一个动作时,它会将图表分解为单独的子任务,这些子任务可以由各个工作人员运行。

要执行 count() 之类的单个操作,数据只会从 Cassandra 获取一次,并且如果可能,每个执行程序的 RDD 将从每个 Cassandra 节点的本地数据中填充。

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

于 2015-07-22T16:59:22.090 回答