【问题标题】:Cassandra Spark Datastax ReplicaCassandra Spark Datastax 副本
【发布时间】:2016-10-14 09:10:27
【问题描述】:

我在 Cassandra 中有 3 个表聚集到几个节点中,每个节点上都有 spark 工作人员。让我们将这些表称为 A、B 和 C。

A 和 B 很大,但它们具有相同的分区键,因此当我将它们连接在一起时可以保持数据局部性。

现在我想加入另一个表 C,它有不同的分区键,但没有其他两个那么大。如果需要,我还准备将表复制到我的所有节点。

我如何将它们连接在一起,以最少的洗牌保持数据局部性?

【问题讨论】:

    标签: scala apache-spark cassandra datastax spark-dataframe


    【解决方案1】:

    正如您所提到的,第三个表与其他表的分区键不同,因此您无法确定所有数据都在同一个节点上。

    这意味着您有两个选择,您可以在第三个 RDD 上使用 sparkContext.broadcast 在其他 RDD 上执行 map side join。 此选项不会触发随机播放,因为广播的 RDD 在集群中的每台机器上都“复制”了,您必须检查的一件事是您没有广播巨大的 RDD(所谓的巨大,我的意思是几千兆字节,即使我从未找到任何证据证明广播此类 RDD 是邪恶的)

    另一个选项是使用HashPartitioner on a parent RDD,此选项使您比映射侧连接更灵活,因为您可以使用 Spark API 中的rightOuterJoinleftOuterJoin。但是,您必须将所有 RDD 映射到父 RDD,并且您需要知道必须使用多少个分区才能在连接操作中获得最佳性能,根据我的经验,我通常每个分区保持 128 Mb 左右,但仅此而已比自己测试更有效,因为一切都取决于您的用例。

    【讨论】:

    • 谢谢,我选择了广播,因为数据不是很大。抱歉,我没有 15 位代表来支持您的回答。
    猜你喜欢
    • 2016-08-20
    • 2017-03-04
    • 2015-01-21
    • 2016-08-11
    • 2020-10-17
    • 1970-01-01
    • 2015-05-24
    • 2015-08-16
    • 2016-07-15
    相关资源
    最近更新 更多