脚本调度Kylin之创建篇

一、背景

  • 大数据环境下的离线数据存储,考虑到持久性以及扩展性上,架构上使用的是Hive作为数据结构存储。
  • 同时,也面临着Hive查询速度不够快的问题,在报表查询面临着需要快速查询到数据结果下。直接从Hive中查询已经无法满足要求,必须要有一个更加快速的查询工具来进行预处理。
  • 那么,就是Kylin了,Kylin基于Hive、HBase等架构之上,可以基于Hive进行数据的多维度的数据预处理,并把结果存储到HBase中。当用户需要对数据进行查询的时候,可通过查询Kylin获取到查询结果。
  • Kylin有一个统一的Web配置平台。但是一旦我们创建了任务,如果每天调度执行一次,就需要定时调度Kylin去处理。

二、思路

  • 虽然可以直接通过各种方式模拟Http请求,但是考虑到工作量等因素尽量选择简单的语言开发(Python/Shell)
  • 考虑到是Hive调度之后,直接执行Kylin调度任务,最快想到的就是用Shell脚本来直接调度Kylin。
  • 基本思路如下,用curl模拟请求。
    • 界面创建一个模板任务,获取请求地址与请求体
    • curl模拟登陆cookie
    • curl模拟加载数据源
    • curl模拟创建Model
    • curl模拟创建Cubes
    • curl模拟构建任务

三、Coding

3.1 定义Kylin全局变量

kylin_url=http://123456:7070/kylin

3.2 登陆授权获取Cookie

curl -c cookfile.txt -X POST \
-H "Authorization:Basic QURNSU46S1lMSU4=" \
-H "Content-Type: application/json" \
${kylin_url}/api/user/authentication
  • QURNSU46S1lMSU4=为加密算法(username:password的Base64密码加密)

3.3 创建数据源

获取到查询接口为${kylin_url}/api/tables/${hiveTableName}/${projectName}

curl -b cookfile.txt \
-X POST \
-H "Content-Type:application/json" \
-d '{"calculate":false}'  \
${kylin_url}/api/tables/${hiveTableName}/${projectName}

calculate为true或者false统计预计算

3.4 创建Model

获取到查询接口为${kylin_url}/api/models

可自行在页面上创建,复制一个请求体,以此作为模板后,后续的创建都以模板为准


curl -b cookfile.txt \
-X POST \
-H "Content-Type:application/json" \
-d '{"modelDescData":".........","project":"testProject"}' \
${kylin_url}/api/models

body体

{
    "modelDescData": "........",
    "project": "tbl_biz_log_plus"
}

modelDescData内部为json转义内容

{
    "name": "${model名好处呢给}",
    "description": "",
    "fact_table": "${事实表名称}",
    "lookups": [],
    "filter_condition": "",
    "dimensions": [{
        "table": "${事实表名称}'",
        "columns": ["${维度列1}", "${维度列2}", "${维度列3}", "${维度列4}"]
    }],
    "metrics": ["${量度列1}"],
    "partition_desc": {
        "partition_date_column": "${时间分区列}",
        "partition_type": "APPEND",
        "partition_date_format": "${时间分区列,yyyyMMdd,yyyy-MM-dd}"
    },
    "last_modified": 0
}

3.5 创建Cubes

获取到查询接口为${kylin_url}/api/cubes

可自行在页面上创建,复制一个请求体,以此作为模板后,后续的创建都以模板为准


curl -b cookfile.txt \
-X POST \
-H "Content-Type:application/json" \
-d '{"cubeDescData":"...","project":"tbl_biz_log_plus"}' \
${kylin_url}/api/cubes
  1. body体
{
"modelDescData": "........",
"project": "tbl_biz_log_plus"
}

modelDescData内部为json转义内容

{
"name": "${Cube名称}",
"model_name": "${Mode名称}",
"description": "",
"dimensions": [{
"name": "${维度1}",
"table": "${表名}",
"column": "${维度1}"
}, {
"name": "${维度2}",
"table": "${表名}",
"column": "${维度2}"
}, {
"name": "${维度2}",
"table": "${表名}",
"column": "${维度2}"
}, {
"name": "${维度3}",
"table": "${表名}",
"column": "${维度3}"
}],
//统计量度
"measures": [{
"name": "_COUNT_",
"function": {
"expression": "COUNT",
"returntype": "bigint",
"parameter": {
"type": "constant",
"value": "1"
},
"configuration": {}
}
}, {
"name": "count_uid",
"function": {
"expression": "COUNT_DISTINCT",
"returntype": "hllc(16)",
"parameter": {
"type": "column",
"value": "${表名}.${量度1}"
}
},
"showDim": false
}],
"dictionaries": [],
// rowkey设计原则
"rowkey": {
"rowkey_columns": [{
"column": "${表名}.${维度1}",
"encoding": "dict",
"isShardBy": "false",
"encoding_version": 1
}, {
"column": "${表名}.${维度2}",
"encoding": "dict",
"isShardBy": "false",
"encoding_version": 1
}, {
"column": "${表名}.${维度3}",
"encoding": "dict",
"isShardBy": "false",
"encoding_version": 1
}, {
"column": "${表名}.${维度4}",
"encoding": "dict",
"isShardBy": "false",
"encoding_version": 1
}]
},
// 维度购机优化
"aggregation_groups": [{
"includes": ["${表名}.${维度4}"],
"select_rule": {
"hierarchy_dims": [
["TBL_BIZ_LOG_PLUS_'${startDate}'.APP_ID", "TBL_BIZ_LOG_PLUS_'${startDate}'.CHANNEL_ID"]
],
"mandatory_dims": ["TBL_BIZ_LOG_PLUS_'${startDate}'.DT"],
"joint_dims": []
}
}],
"mandatory_dimension_set_list": [],
"partition_date_start": 0,
"notify_list": [],
"hbase_mapping": {
"column_family": [{
"name": "F1",
"columns": [{
"qualifier": "M",
"measure_refs": ["_COUNT_"]
}]
}, {
"name": "F2",
"columns": [{
"qualifier": "M",
"measure_refs": ["count_uid"]
}]
}]
},
"volatile_range": "0",
"retention_range": "0",
"status_need_notify": ["ERROR", "DISCARDED", "SUCCEED"],
"auto_merge_time_ranges": [],
"engine_type": "2",
"storage_type": "2",
"override_kylin_properties": {}
}

3.6 构建任务

构建执行任务,开始时间与结束时间构建计算

today=$(date +%Y%m%d)
endTime=`date -d "${today} 00:00:00" +%s`
endTime=$[(endTime+8*60*60)*1000]
startTime=$[endTime-24*60*60*1000]

curl -b cookfile.txt \
-X PUT \
-H "Content-Type:application/json" \
-d '{"buildType":"BUILD","startTime":'${startTime}',"endTime":'${endTime}'}' \
${kylin_url}/api/cubes/${CubeName}/rebuild

四、总结

  • 总体流程即为
    • 抓包
    • 登陆Cookie
    • 模拟请求
  • 在定时执行完Hive任务之后,就可以直接可以调度Kylin执行任务了。

本篇文章由一文多发平台ArtiPub自动发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342