kylin(七)扩展数据源、计算引擎、存储框架源码

前面章节介绍了kylin源码的调试过程,这里讲解下kylin的三大扩展框架,以及对应的编辑方式。
参考demo:wyt01kylinplus: kylin三大扩展框架的自定义扩展demo样例 

1、kylin整体的框架
kylin对外支持restapi和sql查询,内部则是从hadoop hive中获取元数据、随后在cube引擎中预计算、最后将结果输出到hbase中。kylin的restapi功能很丰富,创建模型、cube以及build和删除操作都有,纯粹的和kylin对接直接使用该api即可,因为版本问题,有的api可能官网上查不到,这个时候可以下载kylin相关的包,然后查看包内的接口信息。如3.1.1版本api上没有创建project接口,但是jar上可以直接查到对应的controller接口使用。如果需要变更kylin内部的一些逻辑,一般则需要下载源码进行修改。

不过kylin从1.5版本开始引入了“可扩展”的概念,很多地方直接扩展实现即可,一般不用再重写源码,如图所示:

 其中虚线框所处的位置就是可扩展插件的位置,可扩展指Kylin可以对其主要依赖的三个模块做任意的扩展和替换。Kylin的三大依赖模块分别是数据源、构建引擎和存储引擎。在设计之初,作为Hadoop家族的一员,这三者分别是Hive、MapReduce和HBase。但随着推广和使用的深入,渐渐有用户发现它们均存在不足之处。比如,实时分析可能会希望从Kafka导入数据而不是从Hive;而Spark的迅速崛起,又使我们不得不考虑将MapReduce替换为Spark,以期大幅提高Cube的构建速度;至于HBase,它的读性能可能还不如Cassandra或Kudu等。于是kylin团队对Kylin1.5版本的系统架构进行了重构,将数据源、构建引擎、存储引擎三大依赖抽象为接口,而Hive、MapReduce、HBase只是默认实现。深度用户可以根据自己的需要做二次开发,将其中的一个或多个替换为更适合的技术。

2、cube构建大致流程
为了更好的了解可扩展插件的作用,我们先来了解下cube构建的大致流程:
       创建临时的Hive平表(从Hive读取数据);
       计算各维度的不同值,并收集各Cuboid的统计数据;
       创建并保存字典;保存Cuboid统计信息;
       创建HTable;
       计算Cube(MapReduce计算分析);
       将Cube的计算结果转成HFile;
       加载HFile到HBase;(将结果存储在hbase中)
       更新Cube元数据;
       垃圾回收。

3、目标
因为专门写一个可扩展插件逻辑比较耗时,这里为了方便测试。接下来样例目标是自定义扩展插件在读hive数据、计算cube和存hbase前打印自定义日志。实际工作中,如果有这块的需要则可以根据情况在对应位置修改。

4、项目开发
首先创建简单的spring项目,然后添加maven依赖:

数据源的扩展主要是实现 ISource 接口,我这里直接继承已有的hive实现,然后打印自定义日志:

public class KylinSource extends HiveSource {
    private static Logger logger = LoggerFactory.getLogger(KylinSource.class);

    public KylinSource(KylinConfig config) {
        super(config);
    }

    @Override
    public <I> I adaptToBuildEngine(Class<I> engineInterface) {
        logger.info("wyt01kylinplus: this is KylinSource!");
        return super.adaptToBuildEngine(engineInterface);
    }
}

计算引擎的扩展主要是实现 IBatchCubingEngine 接口,我这里直接继承已有的mapreduce实现,然后打印自定义的日志。

public class KylinEngine extends MRBatchCubingEngine2 {
    private static Logger logger = LoggerFactory.getLogger(KylinEngine.class);
    @Override
    public DefaultChainedExecutable createBatchCubingJob(CubeSegment newSegment, String submitter, Integer priorityOffset) {
        logger.info("wyt01kylinplus: this is KylinEngine!");
        return super.createBatchCubingJob(newSegment, submitter, priorityOffset);
    }
}

存储源的扩展主要是实现 IStorage 接口,我这里直接继承已有的hbase实现,然后打印自定义日志。

public class KylinStorage extends HBaseStorage {
    private static Logger logger = LoggerFactory.getLogger(KylinStorage.class);

    @Override
    public <I> I adaptToBuildEngine(Class<I> engineInterface) {
        logger.info("wyt01kylinplus: this is KylinStorage!");
        return super.adaptToBuildEngine(engineInterface);
    }
}

5、文件配置

开发结束,首先是要在conf/kylin.properties配置文件中进行声明配置,然后再把包放到指定的位置。

kylin.storage.provider.0=com.wyt.storage.KylinStorage
kylin.source.provider.0=com.wyt.source.KylinSource
kylin.engine.provider.2=com.wyt.engine.KylinEngine

这里的配置并不是一定的,即kylin.storage.provider.0的写法不一定,上面的写法仅针对3.1.0版本,如果版本不同,可以下载个源码,然后去KylinConfigBase类中参考getJobEngines、getSourceEngines、getStorageEngines三个方法中的读取规则。

6、踩坑

坑一:NoSuchMethodException: com.wyt.source.KylinSource.<init>
原因:包放的位置不对
解决: 把包放置在 {kylin-home}/tomcat/webapps/kylin/WEB-INF/lib/目录下,然后重启kylin生效

坑二:java.lang.IllegalArgumentException: Implementations missing, ID 2, interface org.apache.kylin.engine.IBatchCubingEngine
原因:mapreduce加载不到实现的kylin扩展代码包
解决:把包放一份在mapreduce的目录下/opt/module/hadoop-2.10.1/share/hadoop/mapreduce 

上面两个坑的具体原因和分析流程参考这篇文章:kylin自定义扩展的类加载问题_Interest1_wyt的博客-CSDN博客 

坑三:日志打印不出来(待解决,近期更新)
原因:
解决:


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值