【问题标题】:Cassandra + Spark executor hyperconvergenceCassandra + Spark 执行器超融合
【发布时间】:2020-05-11 11:32:08
【问题描述】:

由于 Apache Spark 是建议用于 Cassandra 的分布式处理引擎,我知道可以将 Spark 执行器与 Cassandra 节点一起运行。 我的问题是,驱动程序和 Spark 连接器是否足够聪明,能够理解分区和分片分配,从而以超融合的方式处理数据。

简单地说,执行器是否从托管在执行器运行的节点上的分区中读取存储的数据,这样就不会像 Spark 在 HDFS 上运行时那样通过网络传输不必要的数据?

【问题讨论】:

  • 理论上是的。但实际上我在云上看到的较少,其中单独的节点用于 spark 和 Cassandra

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


【解决方案1】:

是的,Spark Cassandra 连接器能够做到这一点。来自source code

getPreferredLocations 方法告诉 Spark 要从中获取分区的首选节点,以便分区的数据与任务发送到的节点相同。 如果 Cassandra 节点与 Spark 节点并置,则查询始终发送到与 Spark Executor 进程在同一节点上运行的 Cassandra 进程,因此数据不会在节点之间传输。 如果 Cassandra 节点发生故障或在读取期间过载,查询将重试到不同的节点。

【讨论】:

  • 谢谢,这就是我要找的答案。
【解决方案2】:

理论上是的。 HDFS 也一样。 Howevet 实际上,我在使用云服务时将单独的节点用于 spark 和 Cassandra 的云上很少见。如果您使用 IAsAS 并设置自己的 Cassandra 和 Spark,那么您可以实现它。

【讨论】:

    【解决方案3】:

    我想补充一下 Alex 的回答:

    是的,Spark Cassandra 连接器能够做到这一点。从源头 代码:

    getPreferredLocations 方法告诉 Spark 首选节点 从中获取一个分区,以便该分区的数据位于 任务发送到的同一节点。如果 Cassandra 节点与 Spark 节点,查询总是发送到 Cassandra 进程 与 Spark Executor 进程在同一节点上运行,因此数据是 不在节点之间传输。如果 Cassandra 节点发生故障或获取 在读取期间过载,查询将重试到不同的节点。

    这是一种不好的行为。

    在 Cassandra 中,当您要求获取特定分区的数据时,只会访问一个节点。由于复制,Spark 实际上可以访问 3 个节点。因此,在不改组的情况下,您有 3 个节点参与该作业。

    然而,在 Hadoop 中,当您要求获取特定分区的数据时,通常会访问集群中的所有节点,然后 Spark 会使用集群中的所有节点作为执行器。

    因此,如果您有 100 个节点:在 Cassandra 中,Spark 将利用 3 个节点。在 Hadoop 中,Spark 将利用 100 个节点。

    Cassandra 针对实时操作系统进行了优化,因此并未针对数据湖等分析进行优化。

    【讨论】:

    • 感谢您提供更多信息。我不打算将 Cassandra 用作数据湖解决方案。我们正在研究将其用作实时 HA 操作数据存储(类似于 Google BT),但我正在寻找可用于进行全扫描和范围扫描以检测异常并进行更正的处理框架。 Spark 是理想的候选者,我一直在研究它可以如何有效地使用分区托管来消除不必要的繁琐和 IO 操作。
    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 2020-11-30
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多