最近公司須要對CarbonData進一步應用,或許封裝進產品,或許是爲了解析CarbonData元數據,因而開始預研CarbonData,下面將保持天天一篇以上的閱讀CarbonData源碼博客,因爲本身基礎薄弱,會記錄本身全部以爲有價值的點,內容或旁雜或簡單,海涵。多線程
閱讀方式以example或test類爲入口,後期熟悉總體項目後將走完整流程,並與parquet進行對比。app
源碼總體結構以下:oop
第一篇 common package測試
一:首先瀏覽Test類LoggingServiceTest_FT,主要是carbon對日誌服務進行了一些定製,在這裏我看到了MDC, MDC(Mapped Diagnostic Context,映射調試上下文)是 log4j 和 logback 提供的一種方便在多線程條件下記錄日誌的功能。即用戶個體的行爲日誌是不完整的,多用戶多線程的狀況下,打印出來的日誌會參雜斷續,好比:this
2018-12-15 00:00:00 did something (userA)spa
2018-12-15 00:00:01 did something (userB )線程
2018-12-15 00:00:02 did something (userA)3d
除非用戶本身定義將用戶姓名打印到日誌中,不然很難維護整個項目全量的日誌,MDC的做用就是一個map映射,根據kye去取出相應的value。調試
而後是對日誌的封裝:日誌
在MDC內部實現中有ThreadLocalMap,以前就據說過這個是爲了讓多線程中每一個線程都有本身的變量副本,不受其餘線程的影響。實現方式也是一個Map,只是這裏的kye很是特殊,是線程自己,value就是複製的變量值。今天點進去發現ThreadLocalMap繼承inheritableThreadLocal,這個類的做用正如其名,inheritable父進程的value值,也就是說在某個線程中,new了一個新的線程,該線程在原map中是沒有的,因此返回是null,可是有了這個類,就使得它擁有和父進程同樣的value。
Hashtable ht = (Hashtable)((ThreadLocalMap)this.tlm).get();
public final class ThreadLocalMap extends InheritableThreadLocal {
public ThreadLocalMap() {
}
public final Object childValue(Object parentValue) {
Hashtable ht = (Hashtable)parentValue;
return ht != null ? ht.clone() : null;
}
}
二:LogServiceFactoryTest_UT,主要是定義了一個final standardLogService,即日誌標準類,對日誌的開發定義規範,部門也能夠借鑑,如今各個系統,系統內部的日誌格式都不統一,一個是存在沒法快速定位問題,第二個是沒法對接外部日誌系統。
測試類就這兩個,接下去總體看下全部類
三:
annotations,自定義註解;
LoggerAction 是對badrecord的處理枚舉,badrecord發生在Data Load以後,即數據load失敗,如數據的列與目的表的列數不一致,就會出現bad,處理的當時就在這個枚舉中定義,目前有四種,如將錯誤數據轉換爲null,或者不作處理直接寫入,或者不寫入,最後一種是當出現bad,整個data load失敗。 badrecord會存在一個指定目錄下 CarbonProperties.getInstance().addProperty("carbon.badRecords.location","hdfs://master:9000/data/carbondata/badrecords/")。
標準日誌輸出,StandardLogService 如設置日誌開頭,打印Thread.name,partitionId、hostName、UserName(Hadoop-common包中)
CarbonIterator,implements Iterator 做用是去除了Iterator的remove方法,而且定義了其餘的abstract方法,改變各種的遍歷方式
Maps,對map中的null定義了default value
Stings 爲Scala增長了mkString方法
Common Package結束