原创 spark反壓速率計算

當spark開啓反壓之後,將會在PIDRateEstimator中根據上一批任務的處理延時情況計算下一批接收數據的大小。 def compute( time: Long, elements: Long, proc

原创 spark閉包清理器ClosureCleaner

在spark給出的閉包清理器中的代碼註釋中,關於閉包的例子,給出了一個類作爲例子,稍作修改如下。 class SomethingNotSerializable { def someMethod(): Unit = scope("on

原创 Java1.8HashMap一段註釋的解釋

/** * Computes key.hashCode() and spreads (XORs) higher bits of hash * to lower. Because the table uses power-of-tw

原创 spark job生成的時間驅動

JobGenerator中有一個timer成員,根據配置中的時間間隔不斷產生GenerateJobs事件來觸發job的產生,以成爲job產生的起點。Timer通過clock來作爲構建時間的依據。 val clock = { val

原创 spark RadixSort基數排序源碼實現

Spark版本2.4.0   Spark的RadixSort基數排序實現的排序容器基於一個LongArray實現。 在LongArray中,一個元素的長度爲8字節,當排序的時候,將是每8個字節確定一個元素。 public static

原创 spark KafkaRDD的理解

Spark版本 2.4.0   先從0-8版本的kafka說起。 當jobGenerator根據時間準備生成相應的job的時候,會依次在graph中調用各個輸入流的getOrCompute()方法來獲取得到rdd,在這裏DirectKaf

原创 spark on yarn yarn-client模式實現源碼走讀

Spark版本2.4.0     在SparkContext的初始化過程中,將會根據配置的啓動模式來選擇不同的任務調度器TaskScheduler,而這個不同模式的實現也是在這裏根據選擇的TaskScheduler類型進行區分並實現。

原创 spark eventLoop模型

Sprak中,線程之前的交互採用eventLoop模型。 當JobGenerate中的clock達到觸發新一次job生成的時間後,並不會直接驅動graph去生成job,而是通過往eventLoop中發送一個JobGenerate事件以觸發

原创 spark中一些不是很有意義的數據結構

Spark版本2.4.0   CompactBuffer是一個基於scala的ArrayBuffer進行了優化的object數組。 原生的ArrayBuffer在缺省情況就會構造一個大小爲16的數組,這在一些小數據量,只有1個2個的情況,

原创 spark使用checkpoint恢復的兩個小坑

1.spark在使用checkpoint恢復的時候不能再執行流的定義的流程,新加入的流的狀態在恢復完成後的spark狀態下處於未初始化狀態,在spark根據checkpoint恢復的時候將不會再對各個流進行初始化,而是直接保存的狀態中恢復

原创 redis radix tree的簡單解釋

所有例子均出自源碼。 Radix tree壓縮前綴樹,是redis在5.0新加入的用來存儲key的數據結構。 前綴樹的節點結構如下。 typedef struct raxNode { uint32_t iskey:1;

原创 ScheduledThreadPoolExecutor定時任務線程池

ScheduledThreadPoolExecutor的schedule()方法可以將線程任務在一段時間後定時觸發,並在一段時間後反覆定時觸發。 在ScheduledThreadPoolExecutor,定時任務都會被包裝成一個Sched

原创 disruptor RingBuffer初始化與生產者事件產生

在Disruptor中,爲了防止僞共享導致的性能降低,所有元素都會在前後儘量填充64個字節以保證在cpu以64字節緩存數據的時候,在緩存行中,都只會有自己所需要的數據,不會導致緩衝行的更新影響到別的cpu,以空間換時間,保證性能的提升。

原创 spark兩種kafka偏移量維護方式

1.spark可以通過checkpoint的方式來維護kafka的偏移量,配置簡單,只需要配置checkpoint的路徑就可以完成偏移量的維護,如果本身spark業務就採用了state狀態,那麼既不需要額外配置即可確保偏移量的維護。 原理

原创 disruptor消費者模型

Disruptor的消費者實現是WorkerProcessor類,都實現了EventProcessor接口,這個接口繼承了Runnable接口,因此,每個消費者實則就是一條線程,具體的業務邏輯都實現自run()方法,一羣不重複消費的並行消