`

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
分享到:
评论

相关推荐

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

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

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

    该文件介绍了一个基于AWS(Amazon Web Services)和Apache Kylin的数据分析服务解决方案。这个解决方案旨在帮助那些不熟悉大数据技术的用户也能从数据分析中受益,通过提供一站式建站服务和微信小程序,服务全球数...

    Kylin安装学习教程_KYLIN_

    Kylin还支持与其他工具的集成,例如与Tableau、Excel的连接,使得用户可以在这些BI工具中直接查询Kylin Cube。同时,Kylin提供了一套完整的API,开发者可以利用这些API开发自定义的应用程序,实现更丰富的分析功能。...

    Kylin安装包、安装文档

    Kylin,源自LinkedIn,是一款开源的分布式分析引擎,专为Apache Hadoop设计,旨在提供亚秒级的SQL查询能力,支持大规模数据集。Kylin以其高性能、易用性和与Hadoop生态系统的无缝集成而备受推崇,尤其在大数据分析...

    Apache Kylin安装部署

    ### Apache Kylin安装部署知识点详解 #### 一、Apache Kylin简介 Apache Kylin是一款开源的分布式分析引擎,它能够为Hadoop提供SQL查询接口以及多维分析(OLAP)能力,尤其适用于处理大规模的数据集。Kylin最初由...

    kylin 3.0.2下载

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

    Kylin on Parquet.pdf

    Kylin支持多种数据源,可以将数据存储在各种分布式存储系统中,比如HDFS、S3或本地存储,并提供快速查询的分析能力。在本文档中,我们将重点介绍Kylin新支持的Parquet存储格式,以及其基于Spark引擎的Cube构建。 ##...

    apache kylin 搭建笔记

    Apache Kylin 环境搭建笔记 Apache Kylin 是一个基于分布式架构的企业级数据分析平台,由 Apache 软件基金会开发和维护。Kylin 环境搭建是一个复杂的过程,需要逐步配置和测试。本文将指导读者从头开始搭建 Apache ...

    基于 Hudi 和 Kylin 构建准实时高性能数据仓库.pdf

    Apache Hudi 是一个面向大数据湖的文件系统,旨在支持数据更新和删除,而 Apache Kylin 是一个高性能的开源 OLAP 引擎,用于大数据的即席查询和多维分析。 首先,让我们深入了解 Hudi 和 Kylin 的核心特性。Hudi ...

    Apache Kylin v1.6 之 新Streaming OLAP实现

    Kylin v1.6还支持多Segment的并行构建和合并,以及通过RestAPI触发构建,使得用户操作更为灵活和便捷。 目前,Apache Kylin v1.6版本的新***ming OLAP实现仍处于公开测试阶段,期待能够进一步解决现有架构和实现中...

    Apache Kylin竞品分析.pdf

    本文旨在通过对Kylin及其竞品进行深入比较,揭示各产品在底层技术、大数据支持、查询速度以及吞吐率等方面的异同,从而帮助读者更好地理解Kylin的优势所在。 #### 二、竞品对比 ##### 1. 大数据处理技术共性 几乎...

    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++...

    尚硅谷大数据技术之Kylin1

    Apache Kylin 是一个开源的分布式分析引擎,提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay Inc 开发并贡献至开源社区。 Apache Kylin 的主要特点包括支持 SQL 接口...

    大数据技术之Kylin视频教程

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

    sunloginclient-10.0.2.24779_kylin_arm64(1)

    标签 "kylin big data 大数据 sunloginclient-1" 强调了几个关键点:Kylin操作系统与大数据的关系,以及SunLoginClient在处理大数据环境中的应用。Kylin是一个专为大规模数据分析设计的开源操作系统,它通常与Hadoop...

    kylin系统盘制作及安装.pdf

    Kylin 操作系统支持多种架构,包括 x86 和 ARM。 三、插入 U 盘,打开 Rufus 在下载了 Rufus 和镜像文件后,用户需要插入 U 盘,并打开 Rufus。用户需要在 Rufus 中选择相应的设备和镜像文件,然后点击开始按钮,...

    Kylin收集的电子文档

    - Kylin支持标准的SQL查询,使得用户无需学习新的查询语言,可以直接利用现有的BI工具进行分析。 5. **Hadoop集成**: - Kylin与Hadoop生态系统紧密集成,可以与HDFS、HBase、Hive等无缝协作,处理海量数据。 6...

    apache kylin操作使用教程

    它能够运行在Hadoop集群之上,与Hive和HBase紧密集成,支持将Hive表中的数据构建成Cube,从而加速SQL查询响应,尤其适合于对海量数据的多维分析。 在操作使用Kylin之前,需要了解的是Kylin依赖于Hadoop集群,同时...

    基于Apache Kylin,赋能Azure大数据自助式分析.pdf

    BigData引擎结合高性能列式存储和并行查询技术,能够支持明细查询,而且Kylin的Cloud部署模式支持多源集成,实现新旧数据资产的高效融合。 AI技术在Kylin中的应用体现在智能数据准备和分析上,能够释放IT部门的人力...

Global site tag (gtag.js) - Google Analytics