在分布式應用中,有時候需要把一些東西,例如cookie,編碼成int/long型數字,在這裡提供一些思路。
1. 集中式編碼
類似於單機,將所有cookie重新切分在一起,按次序編碼
var idnum:long = 0
idrdd.repartition(1).map(oriid => ).repartition(partitionnum)
這種方法在資料量比較大的時候非常慢
2. 固定間隔分布式編碼
每個partition內部實現順序編碼,各partition之間預留一定的間隔,需要預估每個partition容納的最大數量,例如我們如果估計每個partition中的數量不會超過100萬,則
var baseindex: long = mapindex.tolong*1000000l
itemiter.map(oriid => )
})這種方法的缺點在於不夠靈活,間隔是固定的,遇到資料增長較快時容易出現問題;而預留間隔如果太大,編碼數字浪費較多
3. 彈性分布式編碼
spark提供了分布式的編碼方案,在org.apache.spark.rdd的zipwithuniqueid函式中,首先獲得partition的個數partitionnum,然後每個partition內部的起始id為partitionid,間隔為partitionnum,這樣在partition資料分布比較均勻時,中間浪費的編碼會很少,且不用預設partition之間的間隔,非常靈活。舉個栗子,我們有500個partition,則第乙個partition內部的起始id為0,間隔為500, 編碼為(0, 500, 1000, …),第二個partition內部的起始id為1,編碼同理(1, 501, 1001, …), 其他類似。偽碼
var partitionnum; //partition個數
var partitionid; //partition的id
//對每個partition內部
for i=0
to n
partitionid+i*partitionnum
下面給出spark的實現
val n = idrdd.partitions.length.tolong
(k, iter) =>
utils.getiteratorzipwithindex(iter, 0l).map
}
構築數位化運營基石,加速數位化轉型
在華為運營轉型峰會 operations transformation forum 2016 華為董事,電信軟體業務部總裁張平安先生發表主題演講,提倡運營商採用big bang transformation的方式構建數位化運營系統進行徹底數位化變革,從而匹配數位化商業發展訴求,確保收入增長與盈利能力...
分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...
分布式 分布式事務
是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...