Go语言kylin任务自动化实例详解

目录
  • 前言
  • 任务
  • 自动化实现
    • 初始化
    • cube提交build
    • cube运行结果检查
    • 重构cube
    • 历史job清理
    • 时间戳
  • 小结

前言

kylin是一个开源的OLAP分析引擎,具有亚秒级查询大表的能力

通过kylin提供的cube预构建功能,省去了不断写sql查询hive的麻烦,强化了任务统一管理和结果快速呈现的效果

kylin官网: https://kylin.apache.org/cn/

任务

当kylin集群比较大,和有多个kylin集群时,说明cube也越来越多,几百上千个cube便是常用便饭了

这些任务的运行就成了难题,人工去界面上点点点完全不实现了。此时就需要做成自动化周期性的任务

因为官方没有提供Go的客户端,只提供了http的api请求。下列例子使用Go中的http包来实现自动化任务

自动化实现

初始化

使用第三方http包(HttpRequest)来做http相关的请求,该包支持GET,POST,DELETE,PUT等四种请求方法,正好完全满足请求kylin的要求

var (
   url = "http://ip:7070/kylin/"
   username = "ADMIN"
   password = "Password"
   req *HttpRequest.Request
)
func init() {
   req = HttpRequest.NewRequest().Debug(false).SetTimeout(time.Second*5).
      SetHeaders(map[string]string{
         "Content-Type": "application/json;charset=utf-8",
      }).SetBasicAuth(username, password)
}

cube提交build

该方法接收三个参数,需要构建的cube名称,以及开始时间戳和结束时间戳

调用示例:

cubeBuild("dwd_jd_order","1637193600000","1637280000000")

时间戳获取方法,在第6小节

func cubeBuild(cube,startTime,endTime string) {
   m := map[string]string{
      "startTime": startTime,
      "endTime":   endTime,
      "buildType": "BUILD",
   }
   resp, err := req.JSON().Put(url+"api/cubes/"+cube+"/build", m)
   if err != nil {
      fmt.Println("cube构建请求错误: ", err)
   }
   if resp.StatusCode() != 200 {
      fmt.Println("cube构建状态码不符期望: ",resp.StatusCode())
   }
}

cube运行结果检查

检查cube运行结果,是成功还是失败了,还提供一个重新构建开关,如果cube失败,调用重构

kylin job检查接口属性说明

jobSearchMode 搜索模式(检查点和cubeing两种) ALL所有模式的数据

limit 限制返回条数

offset 位置(0是从第一条开始)

status 状态类型(8是错误类型,0是new,1是pending,2是running,32是stopped,4是finished,16是discarded)

timeFilter 时间范围过滤(1是一天,2是一周,3是一月,4是一年,5是全部)

调用示例: jobCheck(false)

为什么要在检查里面调重构方法,是因为重构cube需要拿到uuid,但uuid只能在这个接口中获取到,且uuid不是固定的,需要运cube运行后才可得到

func jobCheck(resumeSwitch bool) {
   resp, err := req.Get(url+"api/jobs?jobSearchMode=ALL&limit=15&offset=0&status=8&timeFilter=1")
   if err != nil {
      fmt.Println("job检查请求错误: ", err)
   }
   if resp.StatusCode() != 200 {
      fmt.Println("job检查状态码不符期望: ",resp.StatusCode())
   }
   body, _ := resp.Body()
   var i interface{}
   json.Unmarshal(body,&i)
   uuid, err := jmespath.Search("[0].uuid", i)
   if err != nil {
      fmt.Println("search err: ",err)
   }
   fmt.Println(uuid)
   if resumeSwitch {
      cubeResume("uuid")
   }
}

重构cube

重构cube在job失败后,自动构建非常有用,避免人工频繁介入到这些工作中,是自动化中关键一步

调用示例: cubeResume("uuid")

func cubeResume(uuid string)  {
   resp, err := req.Put(url+"api/jobs/"+uuid+"/resume")
   if err != nil {
      fmt.Println("cube重新build请求错误: ", err)
   }
   if resp.StatusCode() != 200 {
      fmt.Println("cube重新build状态码不符期望: ",resp.StatusCode())
   }
}

历史job清理

kylin在运行一段时间后,就会产生很多冗余,且时需要周期性的清理这些历史job

调用示例: jobHistoryDelete("uuid")

需要先检查job,获取uuid,然后再删除历史job

func jobHistoryDelete(uuid string) {
   resp, err := req.Delete(url+"api/jobs/"+uuid+"/drop")
   if err != nil {
      fmt.Println("历史job清理请求错误: ", err)
   }
   if resp.StatusCode() != 200 {
      fmt.Println("历史job清理状态码不符期望: ",resp.StatusCode())
   }
}

时间戳

kylin要求的时间毫秒,这里使用纳秒时间戳方法除一下就得到了毫秒

func timestamp()  {
   year := time.Now().Year()
   month := time.Now().Month()
   day := time.Now().Day()
   //今天的时间戳
   today := time.Date(year, month, day, 8, 0, 0, 0, time.Local).UnixNano() / 1e6
   fmt.Println(today)
   //昨天的时间戳
   iDay := time.Now().AddDate(0, 0, -1).Day()
   yesterday := time.Date(year, month, iDay, 8, 0, 0, 0, time.Local).UnixNano() / 1e6
   fmt.Println(yesterday)
}

小结

以上方法配合定时任务,就可以实现kylin自动化运维工作了,当然kylin官网还提供了更多接口,有需求的同学可以看看

传送门: https://kylin.apache.org/cn/docs31/howto/howto_use_restapi.html

更多关于Go语言kylin任务自动化的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go语言dolphinscheduler任务调度处理

    目录 简介 自动化 使用 例子 任务结果检查 测试连接 重跑任务 小结 简介 dolphinscheduler是一个可视化DAG工作流任务调度平台,在大数据领域做任务调用非常流行 提供了类似azkaban工作流调度,比azkaban更强的可视化DAG,支持大数据领域flink,spark,shell,python,java,scala,http等各种类型任务 官网传送门: https://dolphinscheduler.apache.org/zh-cn/ 自动化 为什么需要自动化任务处理,当你

  • GO 使用Webhook 实现github 自动化部署的方法

    通常大家开发大部分是本地git push 提交,服务器上git pull 手动更新.git 可以使用webhook实现自动部署. webhook是仓库平台的一个钩子事件,通过hook 钩子监听代码,回调通知(通知地址就是你在各个git仓库平台中填写的webhook地址,一般在你的某个项目仓库如myproject.git里面的设置中)仓库平台填写的地址. 其实原理流程就是: 所以自动部署主要实现方式就是: - 修改代码 push - github(其他仓库平台)发送请求给你的网站服务器 - 网站服

  • Go语言同步与异步执行多个任务封装详解(Runner和RunnerAsync)

    前言 同步适合多个连续执行的,每一步的执行依赖于上一步操作,异步执行则和任务执行顺序无关(如从10个站点抓取数据) 同步执行类RunnerAsync 支持返回超时检测,系统中断检测 错误常量定义 //超时错误 var ErrTimeout = errors.New("received timeout") //操作系统系统中断错误 var ErrInterrupt = errors.New("received interrupt") 实现代码如下 package ta

  • Go语言kylin任务自动化实例详解

    目录 前言 任务 自动化实现 初始化 cube提交build cube运行结果检查 重构cube 历史job清理 时间戳 小结 前言 kylin是一个开源的OLAP分析引擎,具有亚秒级查询大表的能力 通过kylin提供的cube预构建功能,省去了不断写sql查询hive的麻烦,强化了任务统一管理和结果快速呈现的效果 kylin官网: https://kylin.apache.org/cn/ 任务 当kylin集群比较大,和有多个kylin集群时,说明cube也越来越多,几百上千个cube便是常用

  • C/C++语言宏定义使用实例详解

     C/C++语言宏定义使用实例详解 1. #ifndef 防止头文件重定义 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成 一个可执行文件时,就会出现大量"重定义"的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定义. 方法:例如要编写头文件test.h 在头文件开头写上两行: #ifndef TEST_H #define TEST_H //一般是文件名的大写 头文件结尾写上一行: #endif 这样一个工程文件里同时

  • Kotlin语言编程Regex正则表达式实例详解

    目录 前言 Regex 构造函数 常用正则表达方法 示例展示 1.containsMatchIn(input: CharSequence) 包含指定字符串 2.matches(input: CharSequence) 匹配字符串 3.find(input: CharSequence, startIndex: Int = 0) 查找字符串,并返回第一次出现 4.findAll(input: CharSequence, startIndex: Int = 0) 查找字符串,返回所有出现的次数 5.r

  • GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式:[length]Type .[N]Type{value1, value2, ... , valueN}.[...]Type{value1, value2, ... , valueN} 如下: 复制代码 代码如下: func test5() {     var iarray1 [5]int32    

  • linux C语言开发管道通信实例详解

    linux C语言开发管道通信 Linux系统本身为进程间通信提供了很多的方式,比如说管道.共享内存.socket通信等.管道的使用十分简单,在创建了匿名管道之后,我们只需要从一个管道发送数据,再从另外一个管道接受数据即可. #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> int pipe_default[2]; int main() { pid_t

  • C语言字符串替换空格实例详解

    目录 一.题目描述 二.思路分析 三.整体代码 总结 一.题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例: 输入:s = "We are happy." 输出:"We%20are%20happy." 限制:0 <= s 的长度 <= 10000 二.思路分析 思路 C语言的字符串无法改变大小,所以无法直接在原来的字符串上操作.于是我们先统计空格个数,算出替换后的字符串的大小,并申请一块新内存.(注意要多申

  • C语言强制类型转换规则实例详解

    目录 整形之间的强制转换 无符号转有符号 有符号转无符号 不同长度数字转化中的截断 整形与浮点数的强制类型转换 总结 整形之间的强制转换 在强制类型转换中,我们常用的整形强制转换有无符号和有符号类型的强制转换.所以首先我们得介绍一下计算机中存储数字的方式,计算机中通常以补码的形式来存储数据,以8位数据为例,二进制与有符号数的对应关系为: 0 1 2 … 127 -128 -127 … -1 0000 0000 0000 0001 0000 0010 … 0111 1111 1000 0000 1

  • C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 #include <stdio.h> /* 将两个数据交换 */ void swap(int* Ina , int* Inb) { int temp = *Ina; *Ina = *Inb; *Inb = temp; } /* 进行一趟的快速排序,把一个序列分为两个部分 */ int getPart

  • C语言树状数组的实例详解

    C语言树状数组的实例详解 最近学了树状数组,给我的感觉就是 这个数据结构好神奇啊^_^ 首先她的常数比线段树小,其次她的实现复杂度也远低于线段树 (并没有黑线段树的意思=-=) 所以熟练掌握她是非常有必要的.. 关于树状数组的基础知识与原理网上一搜一大堆,我就不赘述了,就谈一些树状数组的应用好了 1,单点修改,求区间和 #define lowbit(x) (x&-x) // 设 x 的末尾零的个数为 y , 则 lowbit(x) == 2^y void Update(int i,int v)

  • Kotlin 语言中调用 JavaScript 方法实例详解

    Kotlin 语言中调用 JavaScript 方法实例详解 Kotlin 已被设计为能够与 Java 平台轻松互操作.它将 Java 类视为 Kotlin 类,并且 Java 也将 Kotlin 类视为 Java 类.但是,JavaScript 是一种动态类型语言,这意味着它不会在编译期检查类型.你可以通过动态类型在 Kotlin 中自由地与 JavaScript 交流,但是如果你想要 Kotlin 类型系统的全部威力 ,你可以为 JavaScript 库创建 Kotlin 头文件. 内联 J

随机推荐