2015-11-02 52 views
1

假設我有幾臺機器都安裝了spark worker和cassandra節點。是否有可能要求每個Spark工作人員僅查詢其本地cassandra節點(在同一臺機器上),以便在使用spark-cassandra-connector重新分配SparkCopyandraReplica之後加入WithCassandraTable時不涉及網絡操作,因此每個Spark工作人員都從其本地存儲?如何讓工作人員只查詢本地cassandra節點?

+0

我懷疑這裏的數據局部性允許工作人員通過在查詢中指定令牌範圍直接查詢cassandra節點,因此cassandra節點可以遠離工作人員。我懷疑這個工作人員能夠發現在同一臺機器上有一個cassandra節點,並且它應該查詢它。 –

回答

2

在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) 
} 

此邏輯在創建查詢計劃,它返回一個用於查詢的候選主機列表。無論計劃類型如何(標記感知或不知道),列表中的第一個主機始終是本地主機(如果存在)。

+0

看看Spark-Cassandra連接器中如何使用代碼片段,而不是如何找出本地地址(這不是特定的情況)。介意提供一些指針作爲鏈接或完整的代碼片段? –

+0

檢查[this](https://gist.github.com/rstrickland/3e56cf1a2a8817fe8c25)。入口點是'newQueryPlan',爲每個語句執行調用。 –