apache flume 是資料倉儲體系中用於做實時 etl 的工具。它提供了豐富的資料來源和寫入元件,這些元件在執行時都由 flume 的生命週期管理機制進行監控和維護。本文將對這部分功能的原始碼進行解析。
/flume-ng
-node
/flume-ng
-code
/flume-ng
-sdk
/flume-ng
-sources/flume-kafka
-source
/flume-ng
-channels/flume-kafka
-channel
/flume-ng
-sinks/flume-hdfs
-sink
public
class
public
static
void
main(string args) else
} else
runtime.getruntime().addshutdownhook(new thread("agent-shutdown-hook")
});}}
啟動過程說明如下:
使用commons-cli
對命令列引數進行解析,提取 agent 名稱、配置資訊讀取方式及其路徑資訊;
配置資訊可以通過檔案或 zookeeper 的方式進行讀取,兩種方式都支援熱載入,即我們不需要重啟 agent 就可以更新配置內容:
如果熱更新未開啟,則配置提供方將在啟動時立刻讀取配置檔案,並由lifecyclesupervisor
啟動和管理所有元件。
@subscribe
public
synchronized
void
handleconfigurationevent(materializedconfiguration conf)
// pollingpropertiesfileconfigurationprovider$filewatcherrunnable 內部類
@override
public
void
run()
private
void
startallcomponents(materializedconfiguration materializedconfiguration)
// 等待所有管道啟動完畢
for (channel ch : materializedconfiguration.getchannels().values())
} // 相繼啟動目的地和資料來源元件
}
lifecyclesupervisor
類(**中的supervisor
變數)可用於管理實現了lifecycleaware
介面的元件。該類會初始化乙個monitorrunnable
,每三秒輪詢一次元件狀態,通過lifecycleaware#start
和stop
方法,保證其始終處於desiredstate
變數所指定的狀態。
public
static
class
monitorrunnable
implements
runnable
}}}
public
class
lifecyclesupervisor
implements
lifecycleaware
}}}
對於單個元件的生命週期,我們以kafkasource
為例:
public
class
kafkasource
extends
abstractpollablesource
@override
protected
void
dostop() throws flumeexception
}
kafkasource
被定義成輪詢式的資料來源,也就是說我們需要使用乙個執行緒不斷對其進行輪詢,檢視是否有資料可以供處理:
public
class
pollablesourcerunner
extends
sourcerunner
@override
public
void
stop()
// 輪詢執行緒
public
static
class
pollingrunner
implements
runnable
}}}
abstractpollablesource
和sourcerunner
都實現了lifecycleaware
介面,因此都有start
和stop
方法。但是,只有sourcerunner
會由lifecyclesupervisor
管理,pollablesource
則是附屬於sourcerunner
的乙個元件。我們可以在abstractconfigurationprovider#loadsources
中看到配置關係:
private
void
loadsources(mapsourcerunnermap)
Flume簡介 原始碼編譯
flume og flume original generation,即flume 0.9.x版本 flume ng flume next generation 即flume 1.x版本 現在一般叫flume ng,也是使用最為廣泛的 agent用於採集資料,agent是flume中產生資料流的地方...
pomelo原始碼解析之元件Remote
首先提出問題 1.元件remote是什麼?2.remote的作用是什麼?remote模組是遠端通訊模組服務端監聽模組,作用是作為各個模組間通訊物件的存在。變數中儲存.return paths var paths var role master server should not come here ...
Fabric 原始碼解析 原始碼目錄解析
這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...