我们现在公司所有大数据平台全部上云平台,大数据使用的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的产品经验。
相关推荐
deb包完美进行离线安装docker,适用于ubuntu系统,Kylin系统,给出安装过程有可能缺少库依赖的解决办法,以后对于deb包缺少以赖库都可以用此方法
该文件介绍了一个基于AWS(Amazon Web Services)和Apache Kylin的数据分析服务解决方案。这个解决方案旨在帮助那些不熟悉大数据技术的用户也能从数据分析中受益,通过提供一站式建站服务和微信小程序,服务全球数...
Kylin还支持与其他工具的集成,例如与Tableau、Excel的连接,使得用户可以在这些BI工具中直接查询Kylin Cube。同时,Kylin提供了一套完整的API,开发者可以利用这些API开发自定义的应用程序,实现更丰富的分析功能。...
Kylin,源自LinkedIn,是一款开源的分布式分析引擎,专为Apache Hadoop设计,旨在提供亚秒级的SQL查询能力,支持大规模数据集。Kylin以其高性能、易用性和与Hadoop生态系统的无缝集成而备受推崇,尤其在大数据分析...
### Apache Kylin安装部署知识点详解 #### 一、Apache Kylin简介 Apache Kylin是一款开源的分布式分析引擎,它能够为Hadoop提供SQL查询接口以及多维分析(OLAP)能力,尤其适用于处理大规模的数据集。Kylin最初由...
Kylin是一种MOLAP的数据分析引擎。最早由eBay中国研发中心贡献给Apache基金。 Kylin特点: 数据源和模型:主要支持Hive、Kafka 构建引擎:早期支持MapReduce计算引擎,新版本支持Spark、Flink计算引擎。除了全量构建...
Kylin支持多种数据源,可以将数据存储在各种分布式存储系统中,比如HDFS、S3或本地存储,并提供快速查询的分析能力。在本文档中,我们将重点介绍Kylin新支持的Parquet存储格式,以及其基于Spark引擎的Cube构建。 ##...
Apache Kylin 环境搭建笔记 Apache Kylin 是一个基于分布式架构的企业级数据分析平台,由 Apache 软件基金会开发和维护。Kylin 环境搭建是一个复杂的过程,需要逐步配置和测试。本文将指导读者从头开始搭建 Apache ...
Apache Hudi 是一个面向大数据湖的文件系统,旨在支持数据更新和删除,而 Apache Kylin 是一个高性能的开源 OLAP 引擎,用于大数据的即席查询和多维分析。 首先,让我们深入了解 Hudi 和 Kylin 的核心特性。Hudi ...
Kylin v1.6还支持多Segment的并行构建和合并,以及通过RestAPI触发构建,使得用户操作更为灵活和便捷。 目前,Apache Kylin v1.6版本的新***ming OLAP实现仍处于公开测试阶段,期待能够进一步解决现有架构和实现中...
本文旨在通过对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++...
Apache Kylin 是一个开源的分布式分析引擎,提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay Inc 开发并贡献至开源社区。 Apache Kylin 的主要特点包括支持 SQL 接口...
Apache Kylin是一个开源的分布式分析引擎,为大数据开发人员提供Hadoop/Spark之上的SQL查询接口,以及支持超大规模数据集的多维分析能力,在大数据领域有着广泛的应用,是大数据开发人员的必备技能之一。 本套视频...
标签 "kylin big data 大数据 sunloginclient-1" 强调了几个关键点:Kylin操作系统与大数据的关系,以及SunLoginClient在处理大数据环境中的应用。Kylin是一个专为大规模数据分析设计的开源操作系统,它通常与Hadoop...
Kylin 操作系统支持多种架构,包括 x86 和 ARM。 三、插入 U 盘,打开 Rufus 在下载了 Rufus 和镜像文件后,用户需要插入 U 盘,并打开 Rufus。用户需要在 Rufus 中选择相应的设备和镜像文件,然后点击开始按钮,...
- Kylin支持标准的SQL查询,使得用户无需学习新的查询语言,可以直接利用现有的BI工具进行分析。 5. **Hadoop集成**: - Kylin与Hadoop生态系统紧密集成,可以与HDFS、HBase、Hive等无缝协作,处理海量数据。 6...
它能够运行在Hadoop集群之上,与Hive和HBase紧密集成,支持将Hive表中的数据构建成Cube,从而加速SQL查询响应,尤其适合于对海量数据的多维分析。 在操作使用Kylin之前,需要了解的是Kylin依赖于Hadoop集群,同时...
BigData引擎结合高性能列式存储和并行查询技术,能够支持明细查询,而且Kylin的Cloud部署模式支持多源集成,实现新旧数据资产的高效融合。 AI技术在Kylin中的应用体现在智能数据准备和分析上,能够释放IT部门的人力...