【问题标题】:How to make workers to query only local cassandra nodes?如何让工作人员只查询本地 cassandra 节点?
【发布时间】:2016-02-02 11:47:22
【问题描述】:

假设我有几台机器,每台机器都安装了 spark worker 和 cassandra 节点。是否可以要求每个 spark worker 只查询其本地 cassandra 节点(在同一台机器上),这样当我在 repartitionByCassandraReplica 后使用 spark-cassandra-connector 执行 joinWithCassandraTable 时不涉及网络操作,因此每个 spark worker 从其本地获取数据贮存?

【问题讨论】:

  • 我怀疑这里的数据局部性允许工作人员通过在查询中指定令牌范围来直接查询 cassandra 节点存储数据的位置,因此 cassandra 节点可以远离工作人员。我怀疑工作人员能否以某种方式找出同一台机器上有一个 cassandra 节点,它应该查询它。

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


【解决方案1】:

在 Spark-Cassandra 连接器内部,LocalNodeFirstLoadBalancingPolicy 处理这项工作。它首先首选本地节点,然后检查同一 DC 中的节点。具体来说,本地节点是使用java.net.NetworkInterface在主机列表中找到与本地地址列表中的一个匹配的地址来确定的,如下:

private val localAddresses =
  NetworkInterface.getNetworkInterfaces.flatMap(_.getInetAddresses).toSet

/** Returns true if given host is local host */
def isLocalHost(host: Host): Boolean = {
  val hostAddress = host.getAddress
  hostAddress.isLoopbackAddress || localAddresses.contains(hostAddress)
}

此逻辑用于创建查询计划,该计划返回查询的候选主机列表。无论计划类型如何(令牌感知或不感知),列表中的第一个主机始终是本地主机(如果存在)。

【讨论】:

  • 看看代码 sn-ps 如何在 Spark-Cassandra 连接器中使用而不是如何找出本地地址(这不是特定于手头的情况)会很棒。介意提供一些指针作为链接或完整的代码中的sn-ps吗?
  • 检查this。入口点是newQueryPlan,每个语句执行都会调用它。
猜你喜欢
  • 2018-02-24
  • 2019-03-13
  • 2014-12-12
  • 1970-01-01
  • 2021-08-10
  • 2023-03-20
  • 2016-06-28
  • 2014-05-19
  • 2014-10-24
相关资源
最近更新 更多