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

25 篇文章 0 订阅

通过将 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=true
kylin.metrics.reporter-job-enabled=true
kylin.metrics.reporter-query-enabled=true
kylin.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 

推荐阅读:

在 Kylin 中实现异常值检测 UD(A)F

必读|Nginx的日志采集方式对比

Apache Kylin在绿城客户画像系统中的实践

戳破 | hive on spark 调优点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值