【问题标题】:Spark local rdd Write to local Cassandra DBSpark local rdd 写入本地 Cassandra DB
【发布时间】:2021-02-03 08:53:50
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    如果您re-partitioned the data to match Cassandra's partitioning),您可以获得并置数据,但是这种重新分区可能会导致 Spark shuffle,与将数据从 executor 写入另一个节点相比,它可能会更加重量级。

    附:您可以在Russell Spitzer's blog 中找到有关 Spark Cassandra 连接器的大量其他信息。

    【讨论】:

      【解决方案2】:

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

      恐怕数据需要通过网络进行复制,即使每个 spark 节点都与其本地 cassandra 节点通信。

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

      【讨论】:

      • Spark Cassandra 连接器不使用 Thrift(端口 9160):-)
      • 另外,127.0.0.1 也无济于事,因为接触点只是用来发现集群的拓扑结构,而不是发送写入/读取的位置
      猜你喜欢
      • 2019-11-12
      • 1970-01-01
      • 2020-06-25
      • 2015-01-30
      • 2020-05-23
      • 2017-02-09
      • 2014-01-22
      • 2016-01-30
      • 2017-08-22
      相关资源
      最近更新 更多