1

我有一个 DSE 集群,集群中的每个节点都运行 spark 和 Cassandra。

当我从 Cassandra 加载数据以触发 Rdd 并对 rdd 执行一些操作时,我知道数据将分布到多个节点中。就我而言,我想将每个节点的这些 rdds 直接写入其本地 Cassandra dB 表,无论如何都可以这样做。

如果我进行正常的 rdd 收集,来自 spark 节点的所有数据将被合并并返回到带有驱动程序的节点。我不希望这种情况发生,因为从节点返回驱动节点的数据流可能需要很长时间,我希望数据直接保存到本地节点以避免数据跨火花节点移动。

4

2 回答 2

0

一个警告:我只使用 Cassandra 和 Spark 作为单独的开源项目,我没有 DSE 方面的专业知识。

恐怕数据需要到达网络才能复制,即使每个 spark 节点都与其本地 cassandra 节点通信。

如果没有复制和运行 Spark 作业以确保所有数据都经过哈希处理并预洗牌到相应的 Cassandra 节点,则应该可以使用 127.0.0.1:9042 并避开网络。

于 2020-10-20T15:28:02.240 回答
0

当 Spark 执行器从 Cassandra 读取数据时,它会将请求发送到根据不同因素选择的“最佳节点”:

  • 当 Spark 与 Cassandra 并置时,Spark 会尝试从同一节点拉取数据
  • 当 Spark 在不同的节点上时,它使用令牌感知路由,并从多个节点并行读取数据,因为它由分区范围定义。

当涉及到写入时,您有多个执行器,然后每个执行器打开到每个节点的多个连接,并使用令牌感知路由写入数据,这意味着数据被直接发送到其中一个副本。此外,Spark 正在尝试将属于同一分区的多行批处理到 UNLOGGED BATCH 中,因为它的性能更高。即使 Spark 分区与 Cassandra 分区位于同一位置,写入也可能涉及额外的网络开销,因为 SCC 使用一致性级别 TWO 进行写入。

如果您对数据进行重新分区以匹配 Cassandra 的分区,您可以获得并置数据),但是这种重新分区可能会导致 Spark shuffle,与从执行程序向另一个节点写入数据相比,这种重新分区可能会更加重量级。

PS 你可以在Russell Spitzer 的博客中找到很多关于 Spark Cassandra 连接器的附加信息。

于 2020-10-20T17:05:32.923 回答