【问题标题】:Cassandra and Spark卡桑德拉和火花
【发布时间】:2016-01-27 11:12:52
【问题描述】:

您好,我有一个关于集群拓扑和数据复制的高级问题,涉及在 datastax 企业中一起使用的 cassandra 和 spark。

我的理解是,如果集群中有 6 个节点并且完成了繁重的计算(例如分析),那么如果需要,您可以拥有三个 spark 节点和 3 个 cassandra 节点。或者您不需要三个节点来进行分析,但您的作业不会运行得那么快。您不希望对 cassandra 节点进行繁重分析的原因是,本地内存已被用完以处理 cassandra 的繁重读/写负载。

这很清楚,但这是我的问题:

  • 那么复制的数据如何工作?
  • 是否所有的 cassandra only 节点都在一个机架中,而所有 spark 节点都在另一个机架中?
  • 是否所有数据都复制到 spark 节点?
  • 如果可以,它是如何工作的?
  • 建议的配置步骤是什么,以确保数据正确复制到 spark 节点?

【问题讨论】:

    标签: cassandra apache-spark cassandra-2.0 datastax datastax-enterprise


    【解决方案1】:

    那么复制的数据是如何工作的呢?

    常规 Cassandra 复制将在节点和 DC 之间运行。就复制而言,这与拥有一个只有 c* 的集群和两个数据中心是一样的。

    是不是所有的 cassandra 节点都在一个机架上,而所有的 spark 节点都在另一个机架上?

    使用默认的 DSE Snitch,您的 C* 节点将位于一个 DC 中,而 Spark 节点将位于另一个 DC 中。它们都将位于默认机架中。如果您想使用多个机架,则必须使用高级飞贼自行配置。 GPFS 或 PFS 是不错的选择,具体取决于您的编排机制。了解更多in the DataStax Documentation

    是否所有数据都复制到 spark 节点?如果是这样,它如何工作?

    复制在键空间级别进行控制,取决于您的复制策略:

    SimpleStrategy 只会询问您在集群中所需的副本数量(它不支持数据中心,因此如果您有多个 DC,请不要使用它)

    create KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3 }
    

    这假设您只有一个 DC,并且您将拥有每个数据位的 3 个副本

    NetworkTopology 策略让您选择每个 DC 的副本数

    create KEYSPACE tst WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : 2, 'DC2': 3 }
    

    您可以选择每个 DC 拥有不同数量的副本。

    为了确保数据正确复制到 spark 节点,推荐的配置步骤是什么?

    更新RF的过程是in the datastax documentation。这是逐字逐句:

    更新复制因子 增加复制因子 增加存储在 a 中的 keyspace 数据的副本总数 Cassandra 集群。如果您使用安全功能,它是 增加复制因子尤为重要 system_auth 键空间来自默认值 (1),因为您将无法 如果具有唯一副本的节点出现故障,则登录到集群。 建议为 system_auth 设置复制因子 keyspace 等于每个数据中心的节点数。

    程序

    更新集群中的键空间并更改其复制策略 选项。 ALTER KEYSPACE system_auth WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 3, 'dc2' : 2};或者如果使用 简单策略:

    使用 REPLICATION = { 'class' 更改键空间“Excalibur”: 'SimpleStrategy', 'replication_factor' : 3 };在每个受影响的节点上, 运行 nodetool 修复命令。等到修复完成 节点,然后移动到下一个节点。

    知道增加集群中的 RF 会产生大量 IO 和 CPU 利用率以及网络流量,同时您的数据会在集群中被推送。

    如果您有实时生产工作负载,您可以使用nodetool getstreamthroughput / nodetool setstreamthroughput throttle 影响。

    你也可以throttle the resulting compactionsnodetool getcompactionthroughput nodetool setcompactionthroughput

    Cassandra 和 Spark 如何在分析节点上协同工作? 不争资源?如果您根本不打算在整个集群中限制 Cassandra,那么限制 Spark 的意义何在,只需启用所有节点 Spark。

    关键是您不会将主要事务性读取/写入指向 Analytics DC(使用一致性级别 ONE_LOCAL 或 QUORUM_LOCAL 之类的东西将这些请求指向 C* DC)。不用担心,您的数据仍会通过复制到达分析 DC,但您不会等待从分析节点返回的确认信息来响应客户请求。第二个 DC 是eventually consistent

    您说得对,cassandra 和 spark 仍在分析 DC 中的相同机器上运行(这对于数据本地化至关重要)并且可以访问相同的资源(并且您可以执行控制最大 spark 核心等操作,因此卡桑德拉还有喘息的空间)。但是您可以通过拥有两个数据中心来实现workload isolation

    默认情况下,DataStax 驱动程序会将其连接的第一个接触点的 DC 视为本地 DC,因此只需确保您的接触点列表仅包括本地 (c* DC) 中的机器。

    您也可以根据驱动程序自行指定本地数据中心。这是ruby driver 的示例,请查看其他语言的驱动程序文档。

    使用 :datacenter 集群方法:找到的第一个数据中心将是 默认情况下假定电流。请注意,如果您 在 :hosts 选项中仅指定本地数据中心的主机。

    【讨论】:

    • Cassandra 和 Spark 如何在分析节点上协同工作而不争夺资源?如果您根本不打算在整个集群中限制 Cassandra,那么限制 Spark 的意义何在,只需启用所有节点 Spark。请让我知道我错过了什么!
    • 但这并不能回答问题。您正在回答我们如何确保 Cassandra 在分析节点上有足够的喘息空间。但问题是——为什么我们不担心 Spark 有足够的内存呢?如果这些分析节点正在做 C* 节点正在做的所有 Cassandra,包括连接到客户端、充当协调器、做各种 Cassandra 任务和作业,那么 Spark 怎么会有足够的资源。跨度>
    • 好的,非常感谢。我只是想知道您如何确保您的事务性读取写入特定数据中心?我知道您可以选择 local_one 或 local_quroum,但您如何准确地告诉司机从哪个数据中心开始?
    • 分析工作负载在定义上比具有严格 SLA 的事务工作负载更不容易受到这种影响,这就是为什么我们谈论保护 cassandra 的资源免受 Spark 批处理作业的影响。让我举个例子:如果批处理作业中的 Spark 线程由于 OS 子系统争用而必须挂起 100 毫秒,则影响无关紧要。如果这发生在事务性工作负载中,那么您的 SLA 就会出现。
    • 有很多关于如何配置驱动程序以击中特定 DC 的资源,但我还是会更新答案
    【解决方案2】:

    您是对的,您希望将 cassandra 和分析工作负载分开。 典型的设置可能是:

    • 一个数据中心中的 3 个节点(名称:cassandra)
    • 第二个数据中心的 3 个节点(名称:分析)

    在创建键空间时,您可以使用 NetworkTopologyStrategy 和为每个数据中心定义的复制因子来定义它们,如下所示:

    CREATE KEYSPACE myKeyspace WITH replication = {'class': 'NetworkTopologyStrategy', 'cassandra': 2, 'analytics': 2};
    

    通过此设置,您的数据将在每个数据中心复制两次。这是由 cassandra 自动完成的。因此,当您在 DC cassandra 中插入数据时,插入的数据将自动复制到 DC 分析中,反之亦然。注意:您可以通过对要分析的数据和不想分析的数据使用单独的键空间来定义要复制的数据。

    在您的 cassandra.yaml 中,您应该使用 GossipingPropertyFileSnitch。有了这个告密者,您可以在文件cassandra-rackdc.properties 中定义节点的 DC 和机架。然后,此信息通过 gossip 协议传播。所以每个节点都会学习集群的拓扑结构。

    【讨论】:

    • 好吧,分析数据中心在做所有的读写操作,并且像 C* 数据中心一样做 Cassandra 的所有事情,那么将分析节点限制在一个数据中心有什么意义呢?我认为重点是在分析节点上至少有一些有限的 Cassandra oltp 操作,这样 spark 有更多的本地资源来做它需要做的事情,而不是一直与 Cassandra 抗衡。 Cassandra 应该以有限的容量在分析节点上运行,这样它就不会占用 spark 的所有内存。因为那为什么不在所有节点上启用 spark 呢?
    • “普通”客户端不应访问分析节点。您只想将 cassandra DC ips 暴露给您的驱动程序。因此,您在 cassandra 节点上拥有所有客户端流量,并且“仅”在分析 DC 上进行复制和分析内容
    猜你喜欢
    • 2018-08-14
    • 2017-11-14
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2013-09-13
    • 2017-11-05
    • 1970-01-01
    相关资源
    最近更新 更多