Apache Kylin权威指南3.3 触发增量构建

3.3 触发增量构建


3.3.1 Web GUI触发

在Web GUI上触发Cube的增量构建与触发全量构建的方式基本相同。在Web GUI的Model页面中,选中想要增量构建的Cube,单击Action→Build,如图3-3所示。

不同于全量构建,增量构建的Cube会在此时弹出对话框让用户选择“End Date”(如

图3-4所示),目前Kylin要求增量Segment的起始时间等于Cube中最后一个Segment的结束时间,因此当我们为一个已经有Segment的Cube触发增量构建的时候,“Start Date”的值已经被确定,且不能修改。如果在触发增量构建的时候Cube中不存在任何的Segment,那么“Start Date”的值会被系统设置为“Partition Start Date”的值(参见3.2.2节)。

 

图3-3 触发增量构建

 

图3-4 选择增量构建End Date

仅当Cube中不存在任何Segment,或者不存在任何未完成的构建任务时,Kylin才接受该Cube上新的构建任务。未完成的构建任务不仅包含正在运行中的构建任务,还包括已经出错并处于ERROR状态的构任务。如果存在一个ERROR状态的构建任务,那么用户需要先处理好该构建任务,然后才能成功地向Kylin提交新的构建任务。处理ERROR状态的构建任务的方式有两种:比较正常的做法是首先在Web GUI或后台的日志中查找构建失败的原因,解决问题后回到Monitor页面,选中失败的构建任务,单击Action→Resume,恢复该构建任务的执行。我们知道构建任务分为多个子步骤,Resume操作会跳过之前所有已经成功了的子步骤,直接从第一个失败的子步骤重新开始执行。举例来说,如果某次构建任务失败,我们在后台Hadoop的日志中发现失败的原因是由于Mapper和Reducer分配的内存过小导致了内存溢出,那么我们可以在更新了Hadoop相关的配置之后再恢复失败的构建任务。

3.3.2 构建相关的Rest API

Kylin提供了Rest API以帮助自动化地触发增量构建。该API同样也适用于非增量构建的Cube。关于Kylin API的更详细的介绍可以参见Kylin官网:http://kylin.apache.org/docs15/howto/howto_build_cube_with_restapi.html和http://kylin.apache.org?/docs15/howto/howto_use_restapi.html。

本节将着重介绍增量构建相关的API。事实上我们在Web GUI上进行的所有操作,其背后调用的都是同一套Rest API,所以在使用Rest API触发构建的时候,应当谨记之前进行Web GUI构建时所遇到的限制和经验。

1.?获取Segment列表

首先可以通过以下的Rest API来获取某个Cube所包含的所有的Segment列表信息。返回的列表信息可以帮助客户端分析Cube的状态,并且决定下一步增量构建的参数:

GET http://hostname:port/kylin/api/Cubes?CubeName={CubeName}

 

Path Variable

CubeName – 必须的,Cube名字

举例而言,假设在本地的7070端口启动了Kylin Server,那么可以通过如下的Rest请求获取名为test_kylin_cube_without_slr_empty的Cube的Segment列表:

curl -X GET -H "Authorization: Basic QURNSU46S1lMSU4=" -H "Content-Type: application/json" http://localhost:7070/kylin/api/Cubes?CubeName=test_kylin_cube_ ? without_slr_empty

格式化之后,该请求的返回结果如下所示:

[

    {

        "uuid": "daa53e80-41be-49a5-90ca-9fb7294db186",

        "version": "1.5.3",

        "name": "test_kylin_cube_without_slr_empty",

        "owner": null,

        "cost": 50,

        "status": "READY",

        "segments": [

            {

                "uuid": "f492158b-0910-4ced-bc51-26e78b9b8b81",

                "name": "19700101000000_20220101000000",

                "status": "READY",

                "dictionaries": {

                    "DEFAULT.TEST_KYLIN_FACT/LSTG_SITE_ID": "/dict/EDW.TEST_SITES/SITE_ID/a9f93c23-9eca-4e2e-a814-17b81344a816.dict",

                    "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME": "/dict/DEFAULT.

TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/58372aa5-6d42-4045-a32f-e6ae41c219a8.dict",

                    "DEFAULT.TEST_KYLIN_FACT/LSTG_FORMAT_NAME": "/dict/DEFAULT.TEST_KYLIN_FACT/LSTG_FORMAT_NAME/2e2e8137-5600-4c63-ba3f-3f382f452227.dict",

                    "DEFAULT.TEST_KYLIN_FACT/LEAF_CATEG_ID": "/dict/DEFAULT.TEST_

CATEGORY_GROUPINGS/LEAF_CATEG_ID/ee675200-8c5c-4112-99fa-763bb0aa689a.dict",

                    "DEFAULT.TEST_CATEGORY_GROUPINGS/META_CATEG_NAME": "/dict/DEFAULT.

TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/8bc37a42-5577-4c18-b6a5-bd1c7eb55c73.dict",

                    "DEFAULT.TEST_KYLIN_FACT/SLR_SEGMENT_CD": "/dict/EDW.TEST_SELLER_

TYPE_DIM/SELLER_TYPE_CD/0c356b8c-74fa-4e58-b8b8-bbbd5095a6be.dict",

                    "DEFAULT.TEST_KYLIN_FACT/CAL_DT": "/dict/EDW.TEST_CAL_DT/CAL_

DT/5e4b4f35-0fc8-4940-b123-b18c9f77da19.dict",

                    "DEFAULT.TEST_KYLIN_FACT/PRICE": "/dict/DEFAULT.TEST_KYLIN_FACT/

PRICE/94d429fc-60ef-4635-af1e-2b47679bb494.dict",

                    "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME": "/dict/DEFAULT.

TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/759e5fd6-9c7e-47ed-9293-e7c8695b6bb4.dict"

                },

                "snapshots": {

                    "EDW.TEST_SITES": "/table_snapshot/test_sites/1c3d3b91-8afa-

4d12-8743-5376133185eb.snapshot",

                    "EDW.TEST_CAL_DT": "/table_snapshot/test_cal_dt/96a2ad25-4279-

4c7f-9c0a-7e1f0132ae77.snapshot",

                    "DEFAULT.TEST_CATEGORY_GROUPINGS": "/table_snapshot/test_category

_groupings/3ed9f146-2a8b-4bdb-8899-45f2d765c25a.snapshot",

                    "EDW.TEST_SELLER_TYPE_DIM": "/table_snapshot/test_seller_type_

dim/f7f7b3c8-cfe8-49ea-8230-8c296d0e03ef.snapshot"

                },

                "storage_location_identifier": "KYLIN_KZO9NPAWGC",

                "date_range_start": 0,

                "date_range_end": 1640995200000,

                "source_offset_start": 0,

                "source_offset_end": 0,

                "size_kb": 1589,

                "input_records": 6000,

                "input_records_size": 154637,

                "last_build_time": 1467995504950,

                "last_build_job_id": "f3f49487-e5bc-4fd0-a571-58c13c9311e9",

                "create_time_utc": 1467995076271,

                "cuboid_shard_nums": {},

                "total_shards": 1,

                "blackout_cuboids": [],

                "binary_signature": null,

                "index_path": "/kylin/kylin_metadata/kylin-f3f49487-e5bc-4fd0-a571-

58c13c9311e9/test_kylin_cube_without_slr_empty/secondary_index/",

                "rowkey_stats": [

                    [

                        "LEAF_CATEG_ID",

                        134,

                        1

                    ],

                    [

                        "META_CATEG_NAME",

                        44,

                        1

                    ],

                    [

                        "CATEG_LVL2_NAME",

                        94,

                        1

                    ],

                    [

                        "CATEG_LVL3_NAME",

                        127,

                        1

                    ],

                    [

                        "LSTG_SITE_ID",

                        262,

                        2

                    ],

                    [

                        "SLR_SEGMENT_CD",

                        8,

                        1

                    ],

                    [

                        "CAL_DT",

                        3652427,

                        3

                    ],

                    [

                        "LSTG_FORMAT_NAME",

                        5,

                        1

                    ],

                    [

                        "PRICE",

                        5999,

                        2

                    ]

                ]

            }

        ],

        "last_modified": 1467995504950,

        "descriptor": "test_kylin_cube_without_slr_desc",

        "create_time_utc": 0,

        "size_kb": 1589,

        "input_records_count": 6000,

        "input_records_size": 154637

    }

]

尽管输出比较复杂,但是我们仍然能够迅速地观察到当前的test_kylin_cube_without_slr_empty包含一个Segment,该Segment的分割时间为1970-01-01到2022-01-01。我们还能看到该Segment的状态(“status”)均为READY,表示这个Segment背后的构建任务均已正常完成,并且这个Segment已经可以正常使用。

2.?获取构建任务详情

如果Segment的状态显示为“NEW”,则说明该Segment背后的构建任务尚未完成,需要提取该构建任务的标识符(job id),即Segment中的last_build_job_id字段的值,然后以此为参数向Kylin提交如下的Rest请求以获取该构建任务的详情:

GET http://hostname:port/kylin/api/jobs/{job_uuid}

 

Path Variable

Job_uuid – 必需的,构建任务标识符

该请求的返回会带上相应的任务步骤清单,步骤中可能包含MapReduce作业或其他作业。每一个步骤都有相应的状态信息“step_status”。

PENDING:表示该步骤处于等待被执行的状态。

RUNNING:表示该步骤处于执行状态。

ERROR:表示该步骤的执行已经结束,并且该步骤执行失败。

DISCARDED:表示该步骤由于这个构建任务被取消而处于取消状态。

FINISHED:表示该步骤的执行已经结束,并且该步骤执行成功。

test_kylin_cube_without_slr_empty的第一个Segment的last_build_job_id为f3f49487-e5bc-4fd0-a571-58c13c9311e9,通过以上的Rest接口可以得到如下的结果:

{

    "uuid": "f3f49487-e5bc-4fd0-a571-58c13c9311e9",

    "version": "1.5.3",

    "name": "test_kylin_cube_without_slr_empty - 19700101000000_20220101000000 - BUILD - GMT-08:00 2016-07-08 08:24:36",

    "type": "BUILD",

    "duration": 393,

    "steps": [

        {

            "id": "f3f49487-e5bc-4fd0-a571-58c13c9311e9-00",

            "name": "Count Source Table",

            "info": {

                "endTime": "1467995164094",

                "source_records_size": "571743",

                "mr_job_id": "job_1466095360365_0611",

                "hdfs_bytes_written": "6",

                "yarn_application_tracking_url": "http://sandbox.hortonworks.com:

8088/proxy/application_1466095360365_0611/",

                "startTime": "1467995122900"

            },

            "interruptCmd": null,

            "sequence_id": 0,

            "exec_cmd": "hive -e \"SET dfs.replication=2;\nSET hive.exec.compress.

output=true;\nSET hive.auto.convert.join.noconditionaltask=true;\nSET hive.auto.convert.join.noconditionaltask.size=300000000;\nSET hive.merge.size.per.task=32000000;\n\nset hive.exec.compress.output=false;\n\ndfs -mkdir -p /kylin/kylin_metadata/kylin-f3f49487-e5bc-4fd0-a571-58c13c9311e9/row_count;INSERT OVERWRITE DIRECTORY '/kylin/kylin_metadata/kylin-f3f49487-e5bc-4fd0-a571-58c13c9311e9/row_count' SELECT count(*) from DEFAULT.TEST_KYLIN_FACT TEST_KYLIN_FACT\nWHERE (TEST_KYLIN_FACT.CAL_DT < '2022-01-01')\n\n\"",

            "interrupt_cmd": null,

            "exec_start_time": 1467995122900,

            "exec_end_time": 1467995164094,

            "exec_wait_time": 0,

            "step_status": "FINISHED",

            "cmd_type": "SHELL_CMD_HADOOP",

            "run_async": false

        },

        {

            "id": "f3f49487-e5bc-4fd0-a571-58c13c9311e9-01",

            "name": "Create Intermediate Flat Hive Table",

            "info": {

                "endTime": "1467995223284",

                "startTime": "1467995164168"

            },

            "interruptCmd": null,

            "sequence_id": 1,

            "exec_cmd": null,

            "interrupt_cmd": null,

            "exec_start_time": 1467995164168,

            "exec_end_time": 1467995223284,

            "exec_wait_time": 0,

            "step_status": "FINISHED",

            "cmd_type": "SHELL_CMD_HADOOP",

            "run_async": false

        },

 

    …

 

        {

            "id": "f3f49487-e5bc-4fd0-a571-58c13c9311e9-16",

            "name": "Garbage Collection",

            "info": {

                "endTime": "1467995516662",

                "startTime": "1467995505050"

            },

            "interruptCmd": null,

            "sequence_id": 16,

            "exec_cmd": null,

            "interrupt_cmd": null,

            "exec_start_time": 1467995505050,

            "exec_end_time": 1467995516662,

            "exec_wait_time": 0,

            "step_status": "FINISHED",

            "cmd_type": "SHELL_CMD_HADOOP",

            "run_async": false

        }

    ],

    "submitter": "TEST",

    "progress": 100,

    "last_modified": 1467995516721,

    "related_cube": "test_kylin_cube_without_slr_empty",

    "related_segment": "f492158b-0910-4ced-bc51-26e78b9b8b81",

    "exec_start_time": 0,

    "exec_end_time": 0,

    "mr_waiting": 94,

    "job_status": "FINISHED"

}

由于篇幅的限制,此处省略了中间14个子步骤的信息,但是仍然可以观察到每个子步骤的信息都描述了步骤的参数等元信息,另外每个子步骤还有一个唯一的字符串标识符“id”。这些信息可以帮助快速定位问题的所在。

3.?获取构建步骤的输出

一般情况下,构建触发的客户端会首先获取Cube的Segment列表,如果所有Segment的状态都是READY,那么客户端就可以开始构建新的Segment。反之,如果存在状态不是READY的Segment,那么客户端需要获取构建任务详情来观察各个子步骤的状态:如果某个子步骤的状态为ERROR,或者长时间PENDING,或者运行了非常长的时间,那么客户端有必要检查一下该步骤中究竟正在发生什么。Kylin提供了另外一个Rest接口允许用户获取构建任务中某个特定子步骤的输出,接口的请求如下:

GET http://hostname:port/kylin/api/jobs/{job_uuid}/steps/{step_id}/output

 

Path Variable

Job_uuid – 必需的,构建任务标识符

Step_id – 必需的,构建任务子步骤标识符

该接口的输出为该步骤的日志,根据输出的结果,用户可以在触发构建的客户端中找到问题并修复问题,并且可调用以下的RESUME Rest接口重新执行该次构建任务。RESUME接口会跳过之前所有已经成功了的子步骤,直接从第一个失败的子步骤开始重新执行:

PUT http://hostname:port/kylin/api/jobs/{job_uuid}/resume

 

Path Variable

Job_uuid – 必需的,构建任务标识符

由于自动修复的复杂性,触发构建的客户端也可以选择只向管理员发送邮件通知该次失败。Kylin服务器中自带的Web GUI客户端中暂时没有自动修复的逻辑,在遇到构建失败的情况时,Web GUI会根据Cube层面的配置向不同的人员发送构建失败的消息,并且将整个构建任务置于ERROR状态,并等待管理人员重新登录Web GUI查看详情。关于出错时通知方式的配置可以参考第10章。

4.?触发构建

首先介绍一下具体的API规范,代码如下:

PUT http://hostname:port/kylin/api/Cubes/{CubeName}/rebuild

 

Path Variable

CubeName – 必需的,Cube名字

Request Body

startTime – 必需的,长整数类型的起始时间,例如使用1388563200000代表起始时间为2014-01-01

endTime – 必需的,长整数类型的结束时间

buildType – 必需的,构建类型,可能的值为‘BUILD’‘MERGE’和‘REFRESH’,分别对应于新建Segment、合并多个Segment,以及刷新某个Segment

举例而言,假设在本地的7070端口启动了Kylin Server,那么可以通过如下的Rest请求申请名为test_kylin_cube_without_slr_empty的Cube,用于增量地构建[2022-01-01, 2023-01-01)这个时间段的新Segment:

curl -X PUT -H "Authorization: Basic QURNSU46S1lMSU4=" -H "Content-Type: application/json" -d '{"startTime": 1640995200000, "endTime": 1672560000000, "buildType": "BUILD"}' http://localhost:7070/kylin/api/Cubes/test_kylin_cube_without_slr_empty/rebuild

如果当前Cube不存在任何Segment,那么可以将startTime设置为0,这样kylin就会自动选择Cube的Partition Start Date(见3.2.2节)作为startTime。如果当前Cube不为空,那么对于BUILD类型的构建任务,请求中的startTime必须等于最后一个Segment的endTime,否则请求会返回500错误。

时间: 2024-10-23 19:47:26

Apache Kylin权威指南3.3 触发增量构建的相关文章

Apache Kylin权威指南3.1 为什么要增量构建

第3章 增量?构建 第2章介绍了如何构建Cube并利用其完成在线多维分析的查询.每次Cube的构建都会从Hive中批量读取数据,而对于大多数业务场景来说,Hive中的数据处于不断增长的状态.为了支持Cube中的数据能够不断地得到更新,且无需重复地为已经处理过的历史数据构建Cube,因此对于Cube引入了增量构建的功能. 我们将Cube划分为多个Segment,每个Segment用起始时间和结束时间来标志.Segment代表一段时间内源数据的预计算结果.在大部分情况下(例外情况见第4章"流式构建&

Apache Kylin权威指南导读

前 言 "麒麟出没,必有祥瑞." --中国古谚语 "于我而言,与Apache Kylin团队一起合作使Kylin通过孵化成为顶级项目是非常激动人心的,诚然,Kylin在技术方面非常振奋人心,但同样令人兴奋的是Kylin代表了亚洲国家,特别是中国,在开源社区中越来越高的参与度." --Ted Dunning Apache孵化项目副总裁,MapR首席应用架构师 今天,随着移动互联网.物联网.AI等技术的快速兴起,数据成为了所有这些技术背后最重要,也是最有价值的"

Apache Kylin权威指南3.4 管理Cube碎片

3.4 管理Cube碎片 增量构建的Cube每天都可能会有新的增量.日积月累,这样的Cube中最终可能包含上百个Segment,这将会导致查询性能受到严重的影响,因为运行时的查询引擎需要聚合多个Segment的结果才能返回正确的查询结果.从存储引擎的角度来说,大量的Segment会带来大量的文件,这些文件会充斥所提供的命名空间,给存储空间的多个模块带来巨大的压力,例如Zookeeper.HDFS Namenode等.因此,有必要采取措施控制Cube中Segment的数量. 另外,有时候用户场景并

Apache Kylin权威指南3.2 设计增量Cube

3.2 设计增量Cube 3.2.1 设计增量Cube的前提 并非所有的Cube都适用于增量构建,Cube的定义必须包含一个时间维度,用来分割不同的Segment,我们将这样的维度称为分割时间列(Partition Date Column).尽管由于历史原因该命名中存在"date"的字样,但是分割时间列既可以是Hive中的Date类型.也可以是Timestamp类型或String类型.无论是哪种类型,Kylin都要求用户显式地指定分割时间列的数据格式,例如精确到年月日的Date类型(或

Apache Kylin权威指南2.2 在Hive中准备数据

2.2 在Hive中准备数据 2.1节介绍了Kylin中的常见概念.本节将介绍准备Hive数据的一些注意事项.需要被分析的数据必须先保存为Hive表的形式,然后Kylin才能从Hive中导入数据,创建Cube. Apache Hive是一个基于Hadoop的数据仓库工具,最初由Facebook开发并贡献到Apache软件基金会.Hive可以将结构化的数据文件映射为数据库表,并可以将SQL语句转换为MapReduce或Tez任务进行运行,从而让用户以类SQL(HiveQL,也称HQL)的方式管理和

Apache Kylin权威指南2.4 构建Cube

2.4 构建Cube 本节将快速介绍构建Cube相关的操作说明和设置,因受到篇幅的限制,许多具体内容无法深入展开,读者可以从后续的第3章和第4章中获得更详细的介绍. 新创建的Cube只有定义,而没有计算的数据,它的状态是"DISABLED",是不会被查询引擎挑中的.要想让Cube有数据,还需要对它进行构建.Cube的构建方式通常有两种:全量构建和增量构建:两者的构建步骤是完全一样的,区别只在于构建时读取的数据源是全集还是子集. Cube的构建包含如下步骤,由任务引擎来调度执行. 1)创

Apache Kylin权威指南2.3 设计Cube

2.3 设计Cube 如果数据已经在Hive中准备好了,并且已经满足了2.2节中介绍的条件,那么就可以开始设计和创建Cube了.本节将按通常的步骤介绍Cube是如何进行创建的. 2.3.1 导入Hive表定义 登录Kylin的Web界面,创建新的或选择一个已有的项目之后,需要做的就是将Hive表的定义导入到Kylin中. 单击Web界面的Model→Data source下的"Load Hive Table"图标,然后输入表的名称(可以一次导入多张表,以逗号分隔表名,如图2-1所示),

Apache Kylin权威指南2.7 小结

2.7 小结 本章介绍了使用Apache Kylin必备的基本概念,如星形数据模型.事实表.维表.维度.度量等,并在这些基础上快速创建了基于Sample Data的模型,构建Cube,最后执行SQL查询.带领读者体验了Apache Kylin的主要使用过程.后续的章节将继续展开和探讨这个过程中的一些关键技术,比如增量构建.可视化和Cube优化等.  

Apache Kylin权威指南3.5 小结

3.5 小结 增量构建是使用Apache Kylin的关键步骤.因为对于大多数使用场景,数据都是日积月累逐渐增长的.如何合理地安排增量构建,保证用户在Cube中可以及时查询到最新的数据,是Apache Kylin运行维护的日常.第4章将延续本章的内容,继续探讨流式构建,将Apache Kylin的数据延迟缩短到分钟级别.