THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!

Apache Kylin : Analytical Data Warehouse for Big Data

Kylin 的监控系统的验证, 解释和增强 (KYLIN-4371的开发日志)


一. 背景

在 Kylin 2.3 发布后, Kylin team 发布了 System Cube 和 Dashboard, 使得 Kylin 用户可以更加容易地收集和观测 Kylin本身 应用级别的 Metrics 信息. 在目前版本的 Kylin, 通过配置 System Cube 为 HiveSink 或者 KafkaSink, 可以将 Metrics 信息发布到对应的 Sink, 并且通过定时调度构建任务则可以构建 System Cube 以满足通过 SQL 查询 Kylin的系统信息的需求. 此外, 借助 Dashboard 用户可以轻松地做到 Kylin 系统监控信息的可视化分析.

在 Kylin 3.0, Kylin team 发布了另外一个特性, 也就是 Real-time OLAP, 可以使得用户可以实时地获取和查询流式数据源.

这里, 我尝试探索如何将 System Cube 和 Real-time OLAP 相集成, 来降低 System Cube 的数据准备延迟. 经过调研, System Cube 本身已经包含了 KafkaSink, 所以需要的工作是修改 SCCreator, 使之能准备 Real-time OLAP 所需的 Cube 元数据, 和一些其它适配工作.

二. 设计

基于 eBay 引入的 System Cube 特性中, 通过下图的 Metrics System 可以获取和汇报 Job 和 Quey 主题的消息到不同的 Sink. Metrics System 代码主要包含在 core-metricsmetrics-reporter-hivemetrics-reporter-kafka 三个 Maven module中, 另外还有 QueryMetricsFacadeJobMetricsFacade.

Metrics System 架构示意图如下:

在输入部分, 基于门面模式的设计, Job 和 Query 相关的消息被对应的门面 (QueryMetricsFacadeJobMetricsFacade) 封装成统一的 RecordEvent. Query 和 Job 相关的记录会分别对应的门面进行加工, 然后通过 MetricsManagerudpate 方法统一发送给 Metrics System.

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

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

在 Metrics System 以外, 我们还需要工具来创建 Cube 来获取和分析落到不同 Sink 的数据, 这块的工作由 SCCreator 负责. 由创建出来的 Cube 称之为 System Cube, 一共有5个. SCCreator 需要一个 json指定System Cube 所需的一些配置项.

System Cube 的 JIRA issue : Unable to render Jira issues macro, execution error.

Dashboard 的 JIRA issue : Unable to render Jira issues macro, execution error.

System Cube 和 Real-time OLAP 的集成的 JIRA issue : Unable to render Jira issues macro, execution error.

三 如何使用

1. 开启 Metrics 信息收集

kylin.properties
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 参数文件

sink.json
[
  {
    "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_SERVERS_LIST}"
    }
  }
]

3. 生成 System Cube (Real-time OLAP) 元数据

....

4. 创建 Kafka Topic

在 create_kafka_topic_for_system_cubes.sh 中, 参数 zookeeper,

sh create_kafka_topic_for_system_cubes.sh

5. 导入 Cube 元数据

sh bin/metastore.sh restore system-cube/

6. 更新 kylinMetrics.xml

将默认的BlockingResiovr改为InstantReservoir, 并且同时修改ReservoirReporter和sink的类型.

kylinMetrics.xml
<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. 启用 System Cube


四 Metrics信息

五 参考链接

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

http://kylin.apache.org/blog/2016/08/27/query-metrics-in-kylin/



  • No labels