查看原文
其他

吃狗粮:用 Kylin 实时分析 Kylin 运行时指标

俞霄翔 apachekylin 2022-04-23

通过将 System Cube 的 sink 设置为 Kafka,可以一键提升 System Cube 的易用性和实时性,并且实现 Kylin Metrics 系统的功能闭环。



注:文末有大彩蛋



01

背景

在 Apache Kylin v2.3 中,Kylin 发布了系统 Cube(System Cube) 和仪表盘 (Dashboard) 功能,使得用户可以更加容易地收集和观测 Kylin 本身运行时的各项指标。通过配置 System Cube 为 HiveSink 或者 KafkaSink, 可以将 Metrics 信息发布到对应的存储(Hive 或 Kafka), 随后通过触发构建任务,可以将指标汇总进入 System Cube,从而满足系统管理员通过 SQL 查询获取 Kylin 系统信息的需求;借助仪表盘用户可以轻松地做到 Kylin 系统监控信息的可视化分析。System Cube 中的数据,如查询历史、查询延迟等信息,也对后续 Cube 的自动优化(Cube planner 二阶段优化)奠定了基础,具有非常高的价值。


然而,从 Hive/Kafa 中批次加载数据进入 System Cube,存在调度以及较长的数据加载延迟等问题;Kylin 3.0 发布了 Real-time OLAP的新特性, 可以使得用户可以实时地获取和查询流式数据源;所以在这里, 将尝试如何将 Real-time OLAP 和 System Cube 相集成, 简化 System Cube 的数据加载并降低数据准备延迟。System Cube 本身已经包含了 KafkaSink 的实现, 所以需要的开发工作是修改 SCCreator, 使之能准备 Real-time OLAP 所需的 Cube 元数据,和一些其它适配工作。



02

设计


1. Metrics System

在 System Cube 中, 首先需要收集 Metrics 信息,然后基于 Cubing Engine 来构建 System Cube。通过下图所示的 Metrics System 可以获取和汇报 Job 和 Query 主题的消息到不同的 Sink。Metrics System 代码主要包含在 core-metrics, metrics-reporter-hive, metrics-reporter-kafka 三个 module 中,另外还有 QueryMetricsFacade,JobMetricsFacade。


Metrics System 架构示意图如下:


在 Metrics Event 的输入部分,Kylin 基于门面模式的设计,Job 和 Query 相关的消息被对应的门面 (QueryMetricsFacade,JobMetricsFacade) 封装成统一的 RecordEvent。Query 和 Job 相关的记录会分别由对应的门面来负责进行加工,然后通过 MetricsManager 的 update 方法统一发送给 Metrics System。


发送给 Metrics System 的 RecordEvent,会交由 ActiveReservoir 来暂存,根据对 RecordEvent 的缓存策略和对数据延迟的需求,可以分别配置使用 BlockingReservoir 和 InstantReservoir。其中, BlockingReservoir 会以(微)批次的方式向 Sink 发送数据,而 InstantReservoir 会不做等待地直接发送 RecordEvent;所以一般 BlockingReservoir 比较适合和 HiveSink 搭配写入DFS/Hive,而 InstantReservoir 比较适合和 KafkaSink 搭配。


在输出部分,每个 ActiveReservoir 可以拥有数个 ActiveReservoirReporter,如 HiveReservoirReporter 和 KafkaReservoirReporter 负责将消息写入不同的 Sink。目前文档的默认配置是 HiveSink,我在这里会尝试适配 KafkaSink。


在 Metrics System 之外,我们还需要工具来创建 System Cube 来获取来分析落到不同 Sink 的数据,这块的工作由 SCCreator 负责。System Cube 一共有5个。SCCreator 需要一个 json 文件指定System Cube 所需的配置项。最终通过 SCCreator 我们会获取完成一系列所需要的准备工作,包括用于创建 Hive Table/Kafka Topic 的脚本和包含一系列模型和 Cube 的新的 Project 元数据。当相关的准备工作完成后, 我们可以使用 corntab 来定时调度构建作业,这样使得数据源源不断地被构建进入 Kylin, 以便 Dashboard 和 Cube Planner 两者来对其进行查询(消费)。


2. Real-time OLAP

在 Kylin 3.0 中,Kylin 通过一个新的架构实现流式数据处理的解决方案。


请看下面的架构图: 在数据源端, 通过新增的 Recevier 节点实时摄入数据, 并且不断地将满足时间条件的数据上传和整合到 HDFS以及 HBase; 在查询端, 通过合并来自 HBase 的历史数据和来自 Receiver 的实时数据, 可以获取近乎实时的查询结果。


更加详细的分析可以参考以下技术博客:http://kylin.apache.org/blog/2019/04/12/rt-streaming-design/。



3. 集成 System Cube 和 Real-time OLAP

在集成两者的过程中,我主要修改了 SCCreator,在这里我们主要适配了 Kafka Topic 和 Real-time OLAP 所需的一些额外元数据的创建工作,这两个任务分别来由 KafkaTopicCreator 和 StreamingMetadataCreator 来负责,最后由 SCCreator 来统一调度。对于 Metrics System 则不需要改动。



03

如何使用

1. 开启 Metrics 信息收集, 跟正常步骤一样。

kylin.metrics.monitor-enabled=truekylin.metrics.reporter-job-enabled=truekylin.metrics.reporter-query-enabled=truekylin.web.dashboard-enabled=true


2. 准备 System Cube 所需的 Cube 参数文件。


我们需要提供一个 Json Array,存成一个文件命名为 sink.json,Array 包含的对象为 MetricsSinkDesc。


在这里,我们增加了新的以 Kafka 数据源的 MetricsSinkDesc 对象,其中 storage_type 需要被指定为 3。此外的参数需要根据需求来自行决定,配置项的参数和含义可以参考:http://kylin.apache.org/docs/install/configuration.html#realtime-olap。

[ { "sink": "hive", "storage_type": 2, "cube_desc_override_properties": { "kylin.cube.algorithm": "INMEM", "kylin.cube.max-building-segments": "1" } }, { "sink": "kafka", "storage_type": 3, "cube_desc_override_properties": { "kylin.cube.algorithm": "INMEM", "kylin.stream.cube.window": 28800, "kylin.stream.cube.duration": 3600, "kylin.stream.segment.retention.policy": "fullBuild", "kylin.cube.max-building-segments": "20" }, "table_properties": { "bootstrap.servers": "{YOUR_KAFKA_SERVERS_LIST}" } }]


3. 运行命令,使用上面的 sink.json 生成 System Cube 元数据,以及脚本 create_kafka_topic_for_system_cubes.sh。

./bin/kylin.sh org.apache.kylin.tool.metrics.systemcube.SCCreator -inputConfig sink.json  -output system-cube


4. 创建 Kafka Topic

对于脚本 create_kafka_topic_for_system_cubes.sh,你需要根据实际情况来修改参数 zookeeper 和 partitions,然后执行该脚本来创建所需 topic。 

sh create_kafka_topic_for_system_cubes.sh


5. 从本地导入 System Cube 的定义。

sh bin/metastore.sh restore system-cube/


6. 更新 kylinMetrics.xml (该文件在路径 $KYLIN_HOME/tomcat/webapp/kylin/WEB-INF/classes)

相对于默认配置,这里主要将 BlockingReservoir 改为 InstantReservoir,并且同时修改 ReservoirReporter 和 Sink 的类型(将 HiveSink 改为 KafkaSink),并且增加 KafkaReservoirReporter 的参数 bootstrap.servers。

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <description>Kylin Metrics Related Configuration (System Cube)</description> <!-- A Reservoir which don't staged metrics message at all, emit it in no time. Maybe good for debug purpose.--> <bean id="instantReservoir" class="org.apache.kylin.metrics.lib.impl.InstantReservoir"/> <bean id="kafkaSink" class="org.apache.kylin.metrics.lib.impl.kafka.KafkaSink"/> <bean id="initMetricsManager" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass" value="org.apache.kylin.metrics.MetricsManager"/> <property name="targetMethod" value="initMetricsManager"/> <property name="arguments"> <list> <!-- Sink of System Cube. --> <ref bean="kafkaSink"/> <!-- Bind properties for each ActiveReservoirReporter. --> <map key-type="org.apache.kylin.metrics.lib.ActiveReservoir" value-type="java.util.List"> <!-- Each ActiveReservoir can have multi ReservoirReporter --> <entry key-ref="instantReservoir"> <list> <bean class="org.apache.kylin.common.util.Pair"> <!-- Implementation of ReservoirReporter--> <property name="first" value="org.apache.kylin.metrics.lib.impl.kafka.KafkaReservoirReporter"/> <!-- Properties for specific ReservoirReporter--> <property name="second"> <props> <prop key="bootstrap.servers">cdh-master:9092,cdh-worker-1:9092,cdh-worker-2:9092</prop> </props> </property> </bean> </list> </entry> </map> </list> </property> </bean></beans>


7. 启动 Kylin 并启用 System Cube。



04

对比

通过将 Sink 设置为 Kafka,并且使用 Kylin Realtime OLAP 来流式摄入和构建 System Cube,我们可以实现:


  1. Metrics 消息从其产生到其对 Kylin 查询系统可见的延迟, 从之前的小时级别延迟下降为秒级延迟. 这将大大提高 Dashboard 数据展示结果的实时性, 十分有利于问题的及时发现和诊断。

  2. 避免之前的定时调度 Cube 构建任务的步骤, 可以依赖于 Real-time OLAP 来完成摄入和自动化调度构建任务。

  3. Kylin 自己消费自己的 Metrics 信息,减少对外依赖,实现功能闭环。



05

参考链接

  • http://kylin.apache.org/docs/tutorial/setup_systemcube.html

  • http://kylin.apache.org/docs/tutorial/realtime_olap.html

  • http://kylin.apache.org/docs/tutorial/use_dashboard.html

  • KYLIN-4371 - Integrate System Cube with Real-time OLAP 



06

发布计划

该功能预计随 Kylin v3.1(预计 6 月中旬)发布。




彩蛋环节



吃狗粮大揭秘~~~



吃狗粮 / Eat your own dog food

Eat your own dog food is the practice of an organization using its own product.自己的日(gou)志(liang),自己含着泪也要吃下去。祝大家 520 狗粮节快乐~早点下班,回家过节(狗头





活动报名


5 月 23 日(本周六) 20点

<直播 | Kylin 在汽车之家的应用与实践>

Kylin 在战略级商业化数据产品“车智云”中的应用

流量、线索、用户行为、推荐效果等分析场景

Kylin 集群升级经验分享

现在就去报名吧~

↓↓↓扫描二维码免费报名↓↓↓



点“阅读原文”报名近期活动

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存