最近公司须要对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结束