Kafka+kylin——kylin2.5.0流式构建
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a_drjiaoda/article/details/88290620
《一份详细的Kylin执行样例——基于kylin2.5.0》一文中,小厨介绍了如何使用kylin,今天开辟一个新路线,个人感觉随着时代的发展,数据实时分析会成为主力军,因为今天介绍一下Kafka+kylin,流式构建cube。kylin是从1.5版本开始,引入Streaming Table,目的是减少OLAP分析的延时,到目前的2.5.0版本 Streaming做的已经相当较成熟了。
主要方法:kylin通过已经创建好的虚拟表 Streaming Table,周期性地从kafka中读取数据,根据我们定义的Model和cube,将计算好的数据存入到Hbase,供用户查询。
我们的业务场景和上文中的一样,并且数据格式跟之前文章中提过的类似,依然是统计pv uv的值,只不过这里讲其都转换成了JSON格式,据说到目前,kylin流式构建只支持JSON的数据格式。{"access_time":1437494731879,"cookieId":"M211FDN88TXQHM9QEU","regionId":"G01","cityId":"G0102","site":"5143","os":"Android 7.0","pv":"9"}。
主要步骤:
在Kylin中建立新的Project;
Kylin中同步数据源(Load DataSource);
Kylin中建立数据模型(New Model);
定义New Cube
Build Cube;
查询Cube
注意:在 kylin v2.4.0 以前,Streaming Cube 不支持与 lookup 表进行 join;当定义数据模型时,只选择 fact 表,不选 lookup 表;这意味着你JSON含有哪些字段,之后你只能显示和操作哪些字段。举个例子,上面我们的"regionId":"G01"代表的是省会(安徽、陕西等),"cityId":"G0102"代表城市(合肥、西安),我们期望能通过关联其他两张表(region_tb1和city_tb1)来显示相关文字,但是在v2.4.0之前不可能做到,在其之后可以通过lookup表的方式来关联表之间的关系。
一、定义数据表
首先,我们将JSON格式的数据放入到Streaming DataSource的JSON框中,点击》图标,kylin会自动映射成表的字段,输入Table Name,这里需要注意的是,进入的字段可能映射的字段的类型不准确,比如我的pv它映射成了date,但是我后面的是要将其作为sum的,所以需要手动修改一下,省的后来还得回来重新创建表。这里面我们后来是要分钟级别的构建cube,因此我们要选到minute为止。之后配置你的Kafka集群的信息,包括topic name以及broker list,我这里name是web_pvuv_kylin_streaming_topic。
注意:Kylin允许用户挑选一些从业务时间戳上衍生出来的时间维度(Derived Time Dimension),具体来说有如下几种。
·minute_start:业务时间戳所在的分钟起始时间,类型为Timestamp(yyyy-MM-dd HH:mm:ss)。
·hour_start:业务时间戳所在的小时起始时间,类型为Timestamp(yyyy-MM-dd HH:mm:ss)。
·day_start:业务时间戳所在的天起始时间,类型为Date(yyyy-MMdd)。
·week_start:业务时间戳所在的周起始时间,类型为Date(yyyy-MMdd)。
·month_start:业务时间戳所在的月起始时间,类型为Date(yyyy-MMdd)。
·quarter_start:业务时间戳所在的季度起始时间,类型为Date(yyyyMM-dd)。
·year_start:业务时间戳所在的年起始时间,类型为Date(yyyy-MMdd)。
这些衍生时间维度都是可选的,如果用户选择了这些衍生维度,那么在对应的时间粒度上进行聚合时就能够获得更好的查询性能,一般来说不推荐把原始的业务时间戳选择成一个单独的维度,因为该列的基数一般都是很大的。
知识点:经过测试发现,通过Streaming建造的表都是默认在DEFAULT数据库中,目前没找到办法改。回到model中,我们看DataSource中刚刚创建的表如下:
二、创建Model
1、创建Model,选择new Model。输入名称为:web_pvuv_kylin_streaming_model。(和下图些许不同,但没啥影响)
2、依然是选择事实表,并且添加lookup table,j建立事实表与衍生表之间的关系。
添加第二张lookup table
选择事实表和lookup 表之后,单击next
3、主要是选择各个表的维度,我们既可以选择普通的维度,又可以选择衍生的时间维度。注意,一般不推荐直接选择业务时间戳作为维度(也就是这里的access_time),因为业务时间戳的精度往往是精确到秒级甚至是毫秒级的,使用它作为一个维度失去了聚合的意义,也会让整个Cube的体积变得非常庞大
4、选择需要度量指标的字段,本例中使用cookid和PV
5、在创建Model对话框的第五步设置中,一般选择最小粒度的衍生时间维度作为分割时间列,在这里我们选MINUTE_START,它的数据格式为yyyy-MM-dd HH:mm:ss。有了分割时间列,就可以对Cube进行分钟级的流式构建了
至此,点击save保存,model:web_pvuv_kylin_streaming就创建完成了。
三、创建cube
1、点击 new cube,绑定刚刚创建的模型,输入Cube名称:web_pvuv_kylin_streaming_cube
2、不要使用access_time,因为它的粒度太细。注意:这里我们不选择access_time,否则创建的cube体积太大。
3、Measures为度量指标的设计。这里我们对pv进行sum汇总计算,对cookieid进行count distinct去重过滤统计个数。为了让大家更清楚,我们将添加的Measure的页面也截出来,这里面有很多聚合函数,Top,count、sum等等;
4、创建Cube的第四步是设置Cube的自动合并时间。因为流式构建需要频繁地构建较小的Segment,为了不对存储器造成过大的压力,同时也为了获取较好的查询性能,因此需要通过自动合并将已有的多个小Segment合并成一个较大的Segment。所以,这里将设置一个层级的自动合并时间:0.5小时、4小时、1天、7天、28天。此外,设置保留时间为30天。此外,我们设置分区时间是从2013年开始,因为我们的模拟数据是从13年开始。
5、在Advanced Setting,Aggregation Groups设置中,可以把衍生时间维度设置为Hierarchy关系,
调整Rowkey,调整衍生时间维度,一般把上面时间衍生维度的行放在上面,拖拽即可,如下图:
单击下图中的save,即可成功创建cube。
结束之后,我们可以在Model中查看到这个cube,并且它的状态时disable的,cube Size为0。
四、配置运行kafka
在kafka创建topic之前,我们先看看三台虚机都要启动哪些进程,如下图所示:
1、在kakfa创建Topic:web_pvuv_kylin_streaming_topic。使用以下命令,确保已经配置了kafka的环境变量:
kafka-topics.sh --create --zookeeper master:2181,slave1:2181,slave2:2181 --replication-factor 3 --partitions 3 --topic web_pvuv_kylin_streaming_topic
五、首次Build cube + simple Kylin test
创建好topic之后,我们先去试一下刚刚的web_pvuv_kylin_streaming_cube是否能够build。
【注意:】这里在提一句,v2.5.0版本的kylin支持在web界面产生build操作,有些低版本的kylin不直接GUI方式build,只能通过在kylin的bin目录下使用命令来手动去build cube。之后为了保证流处理方式,每隔几分钟自动去创建build cube,实质上也就是linux在隔几分钟去执行 build cube的命令,下文我们会提到。
显然,在topic创建好立即执行build 操作会报错,这是由于Kylin 会记录每一个 build 的 offsets;当收到一个 build 请求,它将会从上一个结束的位置开始,然后从 Kafka 获取最新的 offsets。第一次没有数据时,没有offset则会报错。
我们使用eclipse多做kafka producer像该topic中发送数据,先发五条(这里我的计数是从0开始),立即停止,验证第一build时能否正确拿数据。停止之后,我们去kylin的web界面中build cube(这一步不贴图了)。
我们使用kafka -console-consumer.sh在cli中查看是否是五条,如下,验证通过。
此时回到kylin的web界面,在monitor上界面上可以看到上述的cube在经历23步之后已经build完成,历时7.9mins,大家可能回想为什么仅仅四条数据而已,为什么会花费这么多时间,其实这个只是第一次build的时候时间长,需要建表等一系列操作,我们在测试时发现,之后再build的时候时间会缩小一些。
从下图Model可以看出,建立的cube已经是READY状态,正好是五条数据。
那我先来做个简单的测试,从这五条数中查询一些信息,当然大家会想才5条数据而已,查询起来这很简单,但是这只是测试用例。下面我们会让kafka消息队列中产生大量的数据,再进行测试。从下图可以看出,我们查出来的数据是正确的,而且速度也非常快,可以提交给上级业务部门进行使用啦。
六、终极Test
简单测试之后,我们现在来让kafka+kylin自动跑起来。
要求:@1、使用Kakfa程序向topic中每秒发送10条数据,即每分钟600条数据;@2、cube每隔5分钟自动创建一次。
步骤:
1、写kakfa Producer程序,发送Json数据。有兴趣的同学,可以查看我的另外一篇博客《kafka之Producer实现》,分享使我快乐,如果觉得有帮助,点个赞吧。哈哈
2、使用 crontab -e 命令,输入以下:(单击三下可复制)
*/5 * * * * echo $(date) >> /usr/kylin/streamingBuild.txt; curl -X PUT --user ADMIN:KYLIN -H "Content-Type: application/json;charset=utf-8" -d '{ "sourceOffsetStart": 0, "sourceOffsetEnd": 9223372036854775807, "buildType": "BUILD"}' http://192.168.1.203:7070/kylin/api/cubes/web_pvuv_kylin_streaming_cube/build2
下图就是通过自动构建的命令,自动build cube,可以看出,是正在建立cube。
七、流式构建原理
流式构建需要达到分钟级的数据更新频率,Kylin的做法是每隔一段时间(INTERVAL)就启动一次微构建,用于处理最新的一批数据。这种做法的理念有一些类似于Spark Streaming,它们也是将流数据视作一种特殊的微批次来处理的。由于分布式网络存在延迟等因素,消息可能存在延迟,因此不能为某一时刻刚刚过去的那几分钟立刻构建微批次。
举例来说,如果在每个微构建中要处理5分钟的增量数据,假设消息队列中的消息最多可能有10分钟的延迟(对应于“Margin”),那么就不能在1:00的时候立刻尝试去构建0:55到1:00这5分钟的数据,因为这部分数据的消息最迟可能在1:10分才会到齐,否则构建出来的Segment就存在很大的遗漏数据的风险。此时,需要像增量构建中提到的“数据持续更新”的情形一样,对过往的Segment进行刷新操作。但是目前流式构建并不支持Segment刷新操作,所以,最早只能在1:10开始构建0:55到1:00这部分的数据。这中间的延迟我们称之为DELAY,它等于每个微构建批次的时间(INTERVAL)加上消息最长可能延迟的时间(MARGIN)。
————————————————
版权声明:本文为CSDN博主「夏天小厨」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a_drjiaoda/article/details/88290620
Kafka+kylin——kylin2.5.0流式构建的更多相关文章
- Vue2.0流式渲染中文乱码问题
在参照vue2.0中文官方文档学习服务端渲染之流式渲染时,因为响应头默认编码类型为GBK,而文件为UFT-8类型,所以出现了中文乱码问题. 解决办法:设置响应头编码类型即可 response.setH ...
- 流式处理的新贵 Kafka Stream - Kafka设计解析(七)
原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/kafka_stream/ Kafka Stream背景 Ka ...
- 流式计算新贵Kafka Stream设计详解--转
原文地址:https://mp.weixin.qq.com/s?__biz=MzA5NzkxMzg1Nw==&mid=2653162822&idx=1&sn=8c4611436 ...
- “流式”前端构建工具——gulp.js 简介
Grunt 一直是前端领域构建工具(任务运行器或许更准确一些,因为前端构建只是此类工具的一部分用途)的王者,然而它也不是毫无缺陷的,近期风头正劲的 gulp.js 隐隐有取而代之的态势.那么,究竟是什 ...
- 流式计算(二)-Kafka Stream
前面说了Java8的流,这里还说流处理,既然是流,比如水流车流,肯定得有流的源头,源可以有多种,可以自建,也可以从应用端获取,今天就拿非常经典的Kafka做源头来说事,比如要来一套应用日志实时分析框架 ...
- Demo:基于 Flink SQL 构建流式应用
Flink 1.10.0 于近期刚发布,释放了许多令人激动的新特性.尤其是 Flink SQL 模块,发展速度非常快,因此本文特意从实践的角度出发,带领大家一起探索使用 Flink SQL 如何快速构 ...
- Structured Streaming + Kafka Integration Guide 结构化流+Kafka集成指南 (Kafka broker version 0.10.0 or higher)
用于Kafka 0.10的结构化流集成从Kafka读取数据并将数据写入到Kafka. 1. Linking 对于使用SBT/Maven项目定义的Scala/Java应用程序,用以下工件artifact ...
- 【流处理】Kafka Stream-Spark Streaming-Storm流式计算框架比较选型
Kafka Stream-Spark Streaming-Storm流式计算框架比较选型 elasticsearch-head Elasticsearch-sql client NLPchina/el ...
- kafka 流式计算
http://www.infoq.com/cn/articles/kafka-analysis-part-7/ Kafka设计解析(七)- 流式计算的新贵 Kafka Stream
随机推荐
- SAS学习笔记63 如何导出Log
如上,将Log输出,然后又恢复到SAS系统里面的Log,把需要运行的程序放到他们中间就可以了.这种方法不会出现Log打印满了的情况 这种是先输出在SAS系统里面,然后在输出,在SAS里面Log的行是有 ...
- 3.03定义常量之enum
[注:本程序验证是使用vs2013版] #include <stdio.h> #include <stdlib.h> #include <string.h> #pr ...
- 接口与DRF的安装
接口 # 接口:url链接,通过向链接发送不同的类型请求与参数得到相应的响应数据# 1.在视图层书写处理请求的 视图函数# 2.在路由层为视图函数配置 url链接 => 产生接口# 3.前台通 ...
- [BZOJ2739]最远点(DP+分治+决策单调性)
根据旋转卡壳,当逆时针遍历点时,相应的最远点也逆时针转动,满足决策单调性.于是倍长成链,分治优化DP即可,复杂度O(n^2). #include<cstdio> #include<a ...
- Java8 基础数据类型包装类-Long
https://blog.csdn.net/u012562117/article/details/79023440 基础 //final修饰不可更改,每次赋值都是新建类(其中-128~127是通过L ...
- 如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀)
原文:如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀) 我们都知道可以通过在 Visual Studio 中设置输出路径(OutputPath)来更改项目输 ...
- [jsp学习笔记] jsp基础知识 数据初始化、同步
- cocoaPods升级遇到的问题 升级ruby 升级cocoaPos
最近重复了一次,修复一些更改. 1.查询 rvm版本rvm -v 2.查询ruby版本ruby -v 3.查询 gem 版本gem -v 4.查询ruby 镜像gem sources -l 5.升级r ...
- 0.UML图入门——学习《大话设计模式》笔记
<大话设计模式>中讲述了UML类图的基本用法,做此笔记加深理解. 注:上图来源于<大话设计模式> 上图中设计的关键术语为:继承.实现.聚合.组合.关联.依赖. 要想弄清楚UML ...
- JS函数的三种方式
函数,一段能够自动完成某些功能的代码块,函数的出现,既解决了重复使用重一功能的需求,又可以避免代码的臃肿性. 使用函数有两个要求:必须调用后才可以执行;函数名不要和关键字以及系统函数相同; 函数主要有 ...