在从 cassandra 源读取数据时,重新分区会改变火花分区的数量吗?

时间:2021-06-07 10:21:43

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

我正在用 spark 读取 cassandra 表中的表。我在 cassandra 中有很大的分区,当 cassandra 的分区大小超过 64 MB 时,在这种情况下,cassandra 分区将等于 spark 分区。由于分区很大,我在 spark 中遇到了内存问题。

我的问题是,如果我在从 cassandra 读取数据后开始重新分区,火花分区的数量会改变吗?它不会导致火花内存问题吗?

我的假设首先是 spark 会从 cassandra 读取数据,因此在这个阶段 cassandra 大分区不会由于 repartition 而分裂。重新分区将处理从 cassandra 加载的底层数据。

我只是想知道在从 spark 读取数据时重新分区是否可以改变数据分布,而不是再次分区?

1 个答案:

答案 0 :(得分:0)

如果您使用某个任意键重新分区数据,那么是的,它将在 Spark 分区之间重新分配。

从技术上讲,当您检索数据时,Cassandra 分区不会拆分为 Spark 分区,但是一旦您完成读取,您就可以在不同的键上重新分区以拆分大型 Cassandra 分区的行。

为了记录,它首先没有避免读取大型 Cassandra 分区的内存问题,因为 64MB 的默认输入拆分大小只是 Spark 用来计算需要多少 Spark 分区的概念目标关于估计的 Cassandra 表大小和 C* 分区大小。但由于计算是基于估计的,因此 Spark 分区的大小实际上并没有达到 64MB。

如果您有兴趣,我在这篇博文中详细解释了 Spark 分区的计算方式 -- https://community.datastax.com/questions/11500/

举例说明,假设根据估计的表大小和估计的 C* 分区数,每个 Spark 分区映射到 Cassandra 中的 200 个令牌范围。

对于第一个 Spark 分区,令牌范围可能只包含 2 个大小为 3MB 和 15MB 的 Cassandra 分区,因此 Sthe park 分区中的数据实际大小仅为 18MB。

但在下一个 Spark 分区中,token 范围包含 28 个 Cassandra 分区,大部分为 1 到 4MB,但有一个分区为 56MB。这个 Spark 分区的总大小最终超过 64MB。

在这两种情况下,一个 Spark 分区的大小仅为 18MB,而另一个大于 64MB 的目标大小。我在这篇文章中更详细地解释了这个问题 - https://community.datastax.com/questions/11565/。干杯!