最近公司需要对CarbonData进一步应用,或许封装进产品,或许是为了解析CarbonData元数据,于是开始预研CarbonData,下面将保持每天一篇以上的阅读CarbonData源码博客,由于自己基础薄弱,会记录自己所有觉得有价值的点,内容或旁杂或简单,海涵。

  阅读方式以example或test类为入口,后期熟悉整体项目后将走完整流程,并与parquet进行对比。

  源码整体结构如下:

  第一篇 common package

一:首先浏览Test类LoggingServiceTest_FT,主要是carbon对日志服务进行了一些定制,在这里我看到了MDC, MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。即用户个体的行为日志是不完整的,多用户多线程的情况下,打印出来的日志会参杂断续,比如:

2018-12-15 00:00:00  did something (userA)

2018-12-15 00:00:01  did something (userB )

2018-12-15 00:00:02  did something  (userA)

除非用户自己定义将用户姓名打印到日志中,否则很难维护整个项目全量的日志,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结束

CarbonData-1:common的更多相关文章

  1. phpcms 源码分析三:common.inc.php

    这次是逆雪寒分析common.inc.php的数据库部分: <?php // 包含数据库操作类,下章详说 require PHPCMS_ROOT.'/include/'.$db_file.'.c ...

  2. phpcms 源码分析一: common.inc.php

      其实就是从网上找到的的逆雪寒的分析, 我下来之后发现格式和错字的问题,非常影响阅读,现在我就是做了下搬运工的角色, 同时将格式调整到可读性提高点而已,让各位看官稍微舒心点: 下面进入整体: < ...

  3. HDU1159 && POJ1458:Common Subsequence(LCS)

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  4. Java-Maven(十二):idea多项目:common module进行compiler和install正常,运行domain-perf module提示:Could not resolve dependencies for project

    前提: product项目下有三个module,分别是: driver module domain-perf module common module 问题: driver 和 domain-perf ...

  5. POJ 1458:Common Subsequence

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41957   Accepted: 16 ...

  6. 算法:Common Subsequence(动态规划 Java 最长子序列)

    Description A subsequence of a given sequence is the given sequence with some elements (possible non ...

  7. HDU 1159:Common Subsequence(LCS模板)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  8. hdu-题目1159:Common Subsequence

    http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Java/Oth ...

  9. POJ3415:Common Substrings——题解

    http://poj.org/problem?id=3415 给定两个字符串A 和B,求长度不小于k 的公共子串的个数(可以相同). 论文题,和上道题(POJ2774)类似,首先想到现将AB串合并,然 ...

随机推荐

  1. Python学习(三十七)—— 模板语言之自定义filter和中间件

    一.模板语言之自定义filter 自定义filter文件存放位置 模板中自定义函数 - 在已注册的app中创建一个名字叫 templatetags 文件夹 - 任意创建一个py文件 - 创建名字交 r ...

  2. 查看linux空间大小

    du -sh : 查看当前目录总共占的容量.而不单独列出各子项占用的容量 du -lh --max-depth=1 : 查看当前目录下一级子文件和子目录占用的磁盘容量.

  3. thinkphp的静态缓存,数据缓存,快速缓存,查询缓存

    // 静态缓存 // 'HTML_PATH' 缓存目录,这是个常量不是配置项,在入口文件中定义 // 'HTML_CACHE_ON'     =>    true, // 开启静态缓存 'HTM ...

  4. Linux下Apache配置HTTPS功能

    Apache配置HTTPS功能  转 https://www.cnblogs.com/liaojiafa/p/6028816.html 一.yum 安装openssl和openssl-devel,ht ...

  5. C# 默认访问修饰符

    c# 中类,成员,枚举,结构等默认访问修饰符是? 根据MSDN文档有: [MSDN] Classes and structs that are not nested within other clas ...

  6. python使用urllib2 http 下载参数的try catch

    import urllib2 req = urllib2.Request('http://blog.csdn.net/cqcre')try: urllib2.urlopen(req)except ur ...

  7. CF_2018-2019 Russia Open High School Programming Contest (Unrated, Online Mirror, ICPC Rules, Teams Preferred)

    只做了两个就去上课去啦... A. Company Merging time limit per test 1 second memory limit per test 512 megabytes i ...

  8. I Think I Need a Houseboat POJ - 1005

    I Think I Need a Houseboat POJ - 1005 解题思路:水题 #include <iostream> #include <cstdio> #inc ...

  9. 解决C#中FileSystemWatcher类的Changed事件触发多次的问题

    public static void WatchFile() { FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = ...

  10. c#拷贝整个文件夹到指定文件夹下(非递归)

    public static void CopyEntireDir(string sourcePath, string destPath) { //Now Create all of the direc ...