`

kylin完美支持aws glue data catalog

阅读更多

       我们现在公司所有大数据平台全部上云平台,大数据使用的aws EMR,随着数据暴增带来提数慢,提数难,很难满足数据分析师、运营人员、销售的需求,特别是我们现在商业变现部门的销售人员去客户现场进行数据演示时的即席查询。于是我们商业变现数据团队对当下OLAP框架进行选型,最终选择kylin作为我们DMP平台底层的计算引擎,但是我们在测试中发现kylin版本不支持aws glue data catalog,但是我们现在所有数据团队的元数据都是使用aws glue来进行存储,这样带来的好处在于hive、presto、spark中的建立的表可以在共享查询,使得每个主题都串联起来形成一个大的立方体,打破物理障碍。

      那什么是aws glue ?

AWS Glue 是一项完全托管的 ETL(提取、转换和加载)服务,使您能够轻松而经济高效地对数据进行分类、清理和扩充,并在各种数据存储之间可靠地移动数据。AWS Glue 由一个称为 AWS Glue 数据目录的中央元数据存储库、一个自动生成代码的 ETL 引擎以及一个处理依赖项解析、作业监控和重试的灵活计划程序组成。AWS Glue 是无服务器服务,因此无需设置或管理基础设施。看着官方的解释可能比较懵懂,通俗的说我们在使用aws 的EMR,组件主要包括hadoop、spark、hive、presto等,如果没有配置使用aws glue data catalog,那么在各个数据仓库组件hive、spark、hive、presto建的数据表,在其它组件上是找不到的,也就不能使用,公司底层的数据仓库是提供给各个业务部门来进行使用,为了解决这个问题,在创建EMR时就可以使用aws glue data catalog来存储元数据,对各个组件共享数据源,对各个业务部门进行共享数据源,将各个业务部门的数据构建成一个大的数据立方体,能够快速响应公司高速发展的业务需求。

        我们是怎么修改kylin的代码完成支持aws glue的?

(1) 发现问题-加载数据源时不支持aws glue data catalog

hive中配置了使用aws glue data catalog存储元数据,部署kylin后可以正常启动,但是登陆kylin web ui加载数据源时,只看到该EMR集群的hive 数据源而其他的无法看到,如图

 

这三个数据库是该EMR集群自己的数据库,而我们整个公司的数据库远远不止这些。debug代码进去发现加载数据源时获取metastoreclient的类CLIHiveClient.java

private IMetaStoreClient getMetaStoreClient() throws Exception {
if (metaStoreClient == null) {
metaStoreClient = new HiveMetaStoreClient(hiveConf);
}
return metaStoreClient;
}

 目前只支持HiveMetaStoreClient,而没有看到任何支持AWSCatalogMetastoreClient的相关代码。

(2)发现问题-build cube报获取AWSCatalogMetastoreClient异常,debug代码发现kylin在build job 第1阶段Create Flat Table & Materialize Hive View in Lookup Tables使用hcatalog读取hive表的数据,计算后插入新的hive表。

public CubingJob build() {
    logger.info("MR_V2 new job to BUILD segment " + seg);
final CubingJob result = CubingJob.createBuildJob(seg, submitter, config);
final String jobId = result.getId();
    final String cuboidRootPath = getCuboidRootPath(jobId);
// Phase 1: Create Flat Table & Materialize Hive View in Lookup Tables
    inputSide.addStepPhase1_CreateFlatTable(result);
// Phase 2: Build Dictionary
    result.addTask(createFactDistinctColumnsStep(jobId));
if (isEnableUHCDictStep()) {
        result.addTask(createBuildUHCDictStep(jobId));
    }
    result.addTask(createBuildDictionaryStep(jobId));
    result.addTask(createSaveStatisticsStep(jobId));
// add materialize lookup tables if needed
    LookupMaterializeContext lookupMaterializeContext = addMaterializeLookupTableSteps(result);
    outputSide.addStepPhase2_BuildDictionary(result);
if (seg.getCubeDesc().isShrunkenDictFromGlobalEnabled()) {
        result.addTask(createExtractDictionaryFromGlobalJob(jobId));
    }
// Phase 3: Build Cube
    addLayerCubingSteps(result, jobId, cuboidRootPath); // layer cubing, only selected algorithm will execute
    addInMemCubingSteps(result, jobId, cuboidRootPath); // inmem cubing, only selected algorithm will execute
    outputSide.addStepPhase3_BuildCube(result);
// Phase 4: Update Metadata & Cleanup
    result.addTask(createUpdateCubeInfoAfterBuildStep(jobId, lookupMaterializeContext));
    inputSide.addStepPhase4_Cleanup(result);
    outputSide.addStepPhase4_Cleanup(result);
// Set the task priority if specified
    result.setPriorityBasedOnPriorityOffset(priorityOffset);
    result.getTasks().forEach(task -> task.setPriorityBasedOnPriorityOffset(priorityOffset));
return result;
}

 最后调用调用HiveMRInput.java

public void configureJob(Job job) {
try {
        job.getConfiguration().addResource("hive-site.xml");
//该方法内部使用反射获取metastoreclient,如果在hive-site配置了
        <property>
          <name>hive.metastore.client.factory.class</name>
          <value>com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory</value>
         </property>
         那么通过反射获取AWSGlueDataCatalogHiveClientFactory
        HCatInputFormat.setInput(job, dbName, tableName);
        job.setInputFormatClass(HCatInputFormat.class);
    } catch (IOException e) {
throw new RuntimeException(e);
    }
}

 报如下异常:

Caused by: com.google.common.util.concurrent.ExecutionError: java.lang.AbstractMethodError: com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory.createMetaStoreClient(Lorg/apache/hadoop/hive/conf/HiveConf;Lorg/apache/hadoop/hive/metastore/HiveMetaHookLoader;ZLjava/util/concurrent/ConcurrentHashMap;)Lorg/apache/hadoop/hive/metastore/IMetaStoreClient;
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2261) ~[kylin-job-2.6.4.jar:2.6.4]
at com.google.common.cache.LocalCache.get(LocalCache.java:4000) ~[kylin-job-2.6.4.jar:2.6.4]
at com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.java:4789) ~[kylin-job-2.6.4.jar:2.6.4]
at org.apache.hive.hcatalog.common.HiveClientCache.getOrCreate(HiveClientCache.java:315) ~[hive-hcatalog-core-2.3.5-amzn-1.jar:2.3.5-amzn-1]
at org.apache.hive.hcatalog.common.HiveClientCache.get(HiveClientCache.java:277) ~[hive-hcatalog-core-2.3.5-amzn-1.jar:2.3.5-amzn-1]
at org.apache.hive.hcatalog.common.HCatUtil.getHiveMetastoreClient(HCatUtil.java:558) ~[hive-hcatalog-core-2.3.5-amzn-1.jar:2.3.5-amzn-1]
at org.apache.hive.hcatalog.mapreduce.InitializeInput.getInputJobInfo(InitializeInput.java:104) ~[hive-hcatalog-core-2.3.5-amzn-1.jar:2.3.5-amzn-1]
at org.apache.hive.hcatalog.mapreduce.InitializeInput.setInput(InitializeInput.java:88) ~[hive-hcatalog-core-2.3.5-amzn-1.jar:2.3.5-amzn-1]
at org.apache.hive.hcatalog.mapreduce.HCatInputFormat.setInput(HCatInputFormat.java:95) ~[hive-hcatalog-core-2.3.5-amzn-1.jar:2.3.5-amzn-1]
at org.apache.hive.hcatalog.mapreduce.HCatInputFormat.setInput(HCatInputFormat.java:51) ~[hive-hcatalog-core-2.3.5-amzn-1.jar:2.3.5-amzn-1]
at org.apache.kylin.source.hive.HiveMRInput$HiveTableInputFormat.configureJob(HiveMRInput.java:80) ~[kylin-source-hive-2.6.4.jar:2.6.4]
at org.apache.kylin.engine.mr.steps.FactDistinctColumnsJob.setupMapper(FactDistinctColumnsJob.java:126) ~[kylin-engine-mr-2.6.4.jar:2.6.4]
at org.apache.kylin.engine.mr.steps.FactDistinctColumnsJob.run(FactDistinctColumnsJob.java:104) ~[kylin-engine-mr-2.6.4.jar:2.6.4]
at org.apache.kylin.engine.mr.common.MapReduceExecutable.doWork(MapReduceExecutable.java:131) ~[kylin-engine-mr-2.6.4.jar:2.6.4]
at org.apache.kylin.job.execution.AbstractExecutable.execute(AbstractExecutable.java:167) ~[kylin-core-job-2.6.4.jar:2.6.4]
at org.apache.kylin.job.execution.DefaultChainedExecutable.doWork(DefaultChainedExecutable.java:71) ~[kylin-core-job-2.6.4.jar:2.6.4]
at org.apache.kylin.job.execution.AbstractExecutable.execute(AbstractExecutable.java:167) ~[kylin-core-job-2.6.4.jar:2.6.4]
     ... 4 more

 通过异常信息可以看到类AWSGlueDataCatalogHiveClientFactory接口不兼容,跟踪查看AWSGlueDataCatalogHiveClient源码,AWSGlueDataCatalogHiveClient具体编译运行打包详见:

https://github.com/awslabs/aws-glue-data-catalog-client-for-apache-hive-metastore

 

问题找到,修改代码,测试并在SHAREit生产环境运行,源码已经提交github。

jira地址:

https://issues.apache.org/jira/browse/KYLIN-4206

github源码地址:

<!--?xml version="1.0" encoding="UTF-8"?--> https://github.com/apache/kylin/pull/1040

 

完美支持后如下图:

感谢kylingence的俞霄翔和张亚倩的帮助。

未完待续......

韦荣能,茄子快传广告大数据和工程负责人,8年大数据架构及开发经验,擅长底层大数据框架的调优,有多个从0到1的产品经验。

 

0
1
分享到:
评论

相关推荐

    基于 AWS 和 Apache Kylin 实现面向数百万用户的数据分析服务.pdf

    上海技术峰会 ,基于 AWS 和 Apache Kylin 实现面向数百万用户的数据分析服务。

    ubuntu/kylin系统完美离线安装docker

    deb包完美进行离线安装docker,适用于ubuntu系统,Kylin系统,给出安装过程有可能缺少库依赖的解决办法,以后对于deb包缺少以赖库都可以用此方法

    kylin 3.0.2下载

    Kylin是一种MOLAP的数据分析引擎。最早由eBay中国研发中心贡献给Apache基金。 Kylin特点: 数据源和模型:主要支持Hive、Kafka 构建引擎:早期支持MapReduce计算引擎,新版本支持Spark、Flink计算引擎。除了全量构建...

    kylin使用文档

    ylin二进制包中包含了一份用于测试的样例数据集,总共大小仅1MB左右,共计3张表,其中事实表有 ...kylin仅支持星型数据模型,这里用到的样例数据集就是一个规范的星型模型结构,它总共包含了3个数据表

    基于AWS和Apache Kylin实现数据分析服务.pptx

    基于AWS和Apache Kylin实现数据分析服务.pptx

    Kylin-Desktop-V10-GFB-Release-020-ARM64-g++ 安装包

    Kylin-Desktop-V10-GFB-Release-020-ARM64—g++ 安装包 Kylin-Desktop-V10-GFB-Release-020-ARM64—g++ 安装包 Kylin-Desktop-V10-GFB-Release-020-ARM64—g++ 安装包 Kylin-Desktop-V10-GFB-Release-020-ARM64—g++...

    大数据技术之Kylin视频教程

    Apache Kylin是一个开源的分布式分析引擎,为大数据开发人员提供Hadoop/Spark之上的SQL查询接口,以及支持超大规模数据集的多维分析能力,在大数据领域有着广泛的应用,是大数据开发人员的必备技能之一。 本套视频...

    apache kylin4.0.1 源码编译所需jar包

    apache-kylin-4.0.1 源码所需jar包,一键打包。 只包含jar,不包括js相关内容 内部列表: kylin-shaded-guava-3.1.0.jar commons-configuration-1.6.jar RoaringBitmap-0.7.36-os-kylin-r1.jar commons-compiler-...

    kylin权威使用指南

    kylin权威使用指南kylin权威使用指南kylin权威使用指南

    Kylin安装学习教程_KYLIN_

    此文档是kylin的详细讲解指南,我们共同进步。

    Kylin-Iptables防火墙配置方法

    Kylin_Iptables防火墙配置方法

    Kylin on Parquet.pdf

    开源OLAP分析引擎Kylin最新支持parquet存储,并且使用spark进行cube的构建。本文档是Kyligence工程师关于上述内容的相关分享。

    Kylin安装包、安装文档

    Kylin及其安装文档

    Apache-Kylin-权威指南

    kylin 核心团队书籍 kylin 核心团队书籍 kylin 核心团队书籍 kylin 核心团队书籍

    kylin-jdbc-2.0.0.jar

    kylin-jdbc-2.0.0.jar jdbc连接的驱动包,kylin安装包的lib文件下面有这个包。 kylin-jdbc-2.0.0.jar jdbc连接的驱动包,kylin安装包的lib文件下面有这个包。

    银河麒麟Kylin桌面操作系统 V10 (SP1) X86-64

    银河麒麟Kylin桌面操作系统 V10 (SP1) X86_64 Kylin-Desktop-V10-SP1-General-Release-2303-X86_64.iso 银河麒麟桌面操作系统V10是新一代面向桌面应用的图形化桌面操作系统,同时面向国产软硬件平台开展了大量优化...

    Apache Kylin 2.0 之Spark构建引擎

    Apache Kylin 作为领先的大数据OLAP分析平台步入了2.0时代,正逐渐从Hadoop上的传统OLAP演变为一个实时数据仓库,新的版本支持灵活的雪花模型和更加全面的SQL语法,引入了更加先进的Spark Cubing构建引擎,更好地...

    Apache Kylin安装部署

    Apache Kylin安装部署Apache Kylin安装部署Apache Kylin安装部署

    Kyligence-ODBC-Driver-for-Apache-Kylin.zip

    最新的kylin ODBC Driver,支持最新的kylin 3.0.2。

    Kylin操作系统.txt

    成果 目前,Kylin操作系统经过全面而严格的测试,已经可以运行在多种型号的联想万全服务器(包括采用EM64T技术的新一代Intel至强处理器)和其它类型的服务器上,并全面支持64位应用。同时,在军队机要服务器、可...

Global site tag (gtag.js) - Google Analytics