大数据-162 Apache Kylin 全量增量Cube的构建 Segment 超详细记录 多图

news2024/10/10 11:41:54

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(正在更新…)

章节内容

上节我们完成了如下的内容:

  • 构建Cube 按照日期、区域、产品、渠道
  • Cube 优化方案

在这里插入图片描述

增量 Cube

  • 在大多数业务场景下,Hive中的数据处于不断增长的状态
  • 为了支持在构建Cube,无需重复处理历史数据,引入增量构建功能

Segment

Kylin将Cube划分为多个Segment(对应就是HBase中的一个表)

  • 一个Cube可能由1个或多个Segment组成,Segment是指定时间范围的Cube,可以理解为Cube的分区
  • Segment是针对源数据中的某个片段计算出来的Cube数据,代表一段时间内源数据的预计计算结果
  • 每个Segment用起始时间和结束时间来标志
  • 一个Segment的起始时间等于它之前Segment的结束前时间,它的结束时间等于它后面那个Segment的起始时间
  • 同一个Cube下不同的Segment除了背后的源数据不同之外,其他如结构定义、构建过程、优化方法、存储方式等完全相同

在这里插入图片描述

Segment示意图

在这里插入图片描述
例如:以下为针对某个Cube的Segment

在这里插入图片描述

全量构建与增量构建

全量构建

在全量构建中:

  • Cube中存在唯一一个Segment
  • 每Segment没有分割时间的概念,即没有起始时间和结束时间
  • 对于全量构建来说,每当需要更新Cube数据时,它不会区分历史数据和新加入的数据,即在构建时导入并处理所有的数据

增量构建

在增量构建中:

  • 只会导入新Segment指定的时间区间内的原始数据,并只对这部分原始数据进行预计算

相互对比

在这里插入图片描述
全量构建与增量构建的Cube查询的方式对比:
全量构建Cube:

  • 查询引擎只需要向存储引擎访问单个Segment所对应的数据,无需进行Segment之间的聚合
  • 为了加强性能,单个Segment的数据也有可能被分片存储到引擎的多个分区上,查询引擎可能仍然需要对单个Segment不同分区的数据进一步聚合

增量构建Cube:

  • 由于不同的时间的数据分布在不同的Segment中,查询引擎需要向存储引擎请求读取各个Segment的数据
  • 增量构建的Cube上的查询会比全量构建的做更多的运行时聚合,通常来说增量构建的Cube上查询会比全量构建的Cube上的查询要慢一些

对于小数据量的Cube,或者经常需要全表更新的Cube,使用全量构建需要更少的运维精力,以少量的重复计算降低生产环境中的维护复杂度。
对于大数据量的Cube,例一个包含较长历史数据的Cube,如果每天更新,那么大量的资源是在用于重复计算,这个情况下可以考虑使用增量构建。

增量构建Cube过程

指定分割时间列

增量构建Cube的定义必须包含一个时间维度,用来分割不同的Segment,这样的维度称为分割时间列(Partition Date Column)。

增量构建过程

  • 在进行增量构建时,将增量部分的起始时间和结束时间作为增量构建请求的一部分提交给Kylin的任务引擎
  • 任务引擎会根据起始时间和结束时间从Hive中抽取相应时间的数据,并对这部分数据做预处理计算
  • 将预计算的结果封装成一个新的Segment,并将相应的信息保存到元数据和存储引擎中,一般来说,增量部分的起始时间等于Cube中最后一个Segment的结束时间

增量Cube构建

步骤:定义数据源 => 定义Model => 定义Cube => 构建Cube

SQL 语句

-- 数据结构类似,只是改为了分区表
drop table wzk_kylin.dw_sales1;
create table wzk_kylin.dw_sales1(
  id string,
  channelId string,
  productId string,
  regionId string,
  amount int,
  price double
)
partitioned by (dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

-- 加载数据
load data local inpath "dw_sales20240101_data.txt"
into table wzk_kylin.dw_sales1
partition(dt="2024-01-01");
load data local inpath "dw_sales20240102_data.txt"
into table wzk_kylin.dw_sales1
partition(dt="2024-01-02");
load data local inpath "dw_sales20240103_data.txt"
into table wzk_kylin.dw_sales1
partition(dt="2024-01-03");
load data local inpath "dw_sales20240104_data.txt"
into table wzk_kylin.dw_sales1
partition(dt="2024-01-04");

生成数据

同样,我们先编写一个脚本来生成对应的数据:

import random

# 设置参数
dates = ["2024-01-01", "2024-01-02", "2024-01-03", "2024-01-04"]
num_records_per_file = 100

# 定义可能的值
channel_ids = ['C001', 'C002', 'C003', 'C004']
product_ids = ['P001', 'P002', 'P003', 'P004']
region_ids = ['R001', 'R002', 'R003', 'R004']

# 生成数据
for dt in dates:
    output_file = f'dw_sales{dt.replace("-", "")}_data.txt'
    
    with open(output_file, 'w') as f:
        for i in range(num_records_per_file):
            record_id = f"{i+1:04d}"
            channel_id = random.choice(channel_ids)
            product_id = random.choice(product_ids)
            region_id = random.choice(region_ids)
            amount = random.randint(1, 100)
            price = round(random.uniform(10.0, 500.0), 2)
            
            line = f"{record_id},{channel_id},{product_id},{region_id},{amount},{price}\n"
            f.write(line)
    
    print(f"{num_records_per_file} records have been written to {output_file}")

print("All data files have been generated.")

执行的结果如下图所示:
在这里插入图片描述

上传数据

通过你习惯的方式,将这几个txt上传到服务器上,准备执行:
在这里插入图片描述

执行脚本

hive -f kylin_partition.sql

执行结果如下图:
在这里插入图片描述

加载数据源

Load Table From Tree

在这里插入图片描述
选择刚才创建的表,wzk_kylin.dw_sales1:
在这里插入图片描述

定义Model

增量构建的Cube需要指定分割时间列,例如:将日期分区字段添加到维度列中:
Data Model:New Join Condition,需要配置好几个:
在这里插入图片描述
配置成如下的结果:
在这里插入图片描述
维度配置如下图所示:
在这里插入图片描述
度量选择 AMOUNT 和 PRICE,最后的设置:
在这里插入图片描述

定义Cube

填写名字等跳过,维度需要添加 DT、其他都要:
在这里插入图片描述
配置完的结果如下图:
在这里插入图片描述
度量配置如下:(Bulk Add Measures 快速配置)
在这里插入图片描述
剩余的信息都默认填写即可:
在这里插入图片描述

构建Cube

接下来构建Cube的时候,进行Build:
在这里插入图片描述

选部分的日期,就不选所有数据了:
在这里插入图片描述

继续等待构建完毕:
在这里插入图片描述

查看Segment

刚才我们构建了

  • 2024-01-01 到 2024-01-02 的数据
  • 我们继续build 2024-01-02 到 2024-01-03
  • 完成后继续build 2024-01-03 到 2024-01-04
    分段的进行build的任务,最后我们查看 Segment如下:

2024-01-01 到 2024-01-02 完成之后,我们继续任务:
在这里插入图片描述
2024-01-02 到 2024-01-03 完成之后,我们继续任务:
在这里插入图片描述
漫长等待,任务都完成之后如下图所示:
在这里插入图片描述

查询测试

第一部分:按日期和地区汇总销售数据

-- 第一部分查询:按日期和地区汇总销售数据
SELECT 
    t1.dt,
    t2.regionname,
    SUM(t1.price) AS total_money,
    SUM(t1.amount) AS total_amount,
    MAX(t1.price) AS max_price,
    MIN(t1.amount) AS min_amount
FROM 
    dw_sales1 t1
JOIN 
    dim_region t2 
ON 
    t1.regionid = t2.regionid
GROUP BY 
    t1.dt, 
    t2.regionname
ORDER BY 
    t1.dt;

运行的结果如下图所示:
在这里插入图片描述
另一部分:按日期、地区和产品汇总销售数据

-- 第二部分查询:按日期、地区和产品汇总销售数据
SELECT 
    t1.dt,
    t2.regionid,
    t2.regionname,
    t3.productid,
    t3.productname,
    SUM(t1.price) AS total_money,
    SUM(t1.amount) AS total_amount
FROM 
    dw_sales1 t1
INNER JOIN 
    dim_region t2 
ON 
    t1.regionid = t2.regionid
INNER JOIN 
    dim_product t3 
ON 
    t1.productid = t3.productid
GROUP BY 
    t1.dt,
    t2.regionid,
    t2.regionname,
    t3.productid,
    t3.productname
ORDER BY 
    t1.dt,
    t2.regionname,
    t3.productname;

查询结果如下图所示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2201894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【无人水面艇路径跟随控制10】(Matlab)USV代码阅读:testUSV仿真无人水面艇在一定时间内的运动,使用欧拉法对状态进行积分,并绘制仿真结果

【无人水面艇路径跟随控制10】(Matlab)USV代码阅读:仿真无人水面艇在一定时间内的运动,使用欧拉法对状态进行积分,并绘制仿真结果 写在最前面testUSV.m总结代码详解1. **初始化部分**2. **仿真循环**3. **仿真数据提取…

【力扣刷题实战】(顺序表)移除元素

大家好,我是小卡皮巴拉 文章目录 目录 力扣题目: 移除元素 题目描述 示例 1: 示例 2: 解题思路 具体思路 题目要点 完整代码 兄弟们共勉 !!! 每篇前言 博客主页:小卡…

AI测试入门:认识Graph RAG

AI测试入门:认识Graph RAG 前言1. 什么是Graph RAG?2. Graph RAG的工作原理3. Graph RAG的应用场景4. Graph RAG的技术实现5. Graph RAG的优势6. Graph RAG的实际应用案例总结 前言 传统的检索增强生成(RAG)方法逐渐暴露出一些局限…

高被引算法GOA优化VMD,结合Transformer-SVM的轴承诊断,保姆级教程!

本期采用2023年瞪羚优化算法优化VMD,并结合Transformer-SVM实现轴承诊断,算是一个小创新方法了。需要水论文的童鞋尽快! 瞪羚优化算法之前推荐过,该成果于2023年发表在计算机领域三区SCI期刊“Neural Computing and Applications”…

DockerCompose 启动 open-match

背景介绍 open-match是Google和unity联合开源的支持实时多人匹配的框架,已有多家游戏厂商在生产环境使用,官网 https://open-match.dev/site/ 。原本我们使用的是UOS上提供的匹配能力,但是UOS目前不支持自建的Dedicated servers 集群&#x…

【万字长文】Word2Vec计算详解(一)CBOW模型

【万字长文】Word2Vec计算详解(一)CBOW模型 写在前面 本文用于记录本人学习NLP过程中,学习Word2Vec部分时的详细过程,本文与本人写的其他文章一样,旨在给出Word2Vec模型中的详细计算过程,包括每个模块的计…

LLM4Rec最新工作: 字节发布用于序列推荐的分层大模型HLLM

前几个月 Meta HSTU 点燃各大厂商对 LLM4Rec 的热情,一时间,探索推荐领域的 Scaling Law、实现推荐的 ChatGPT 时刻、取代传统推荐模型等一系列话题让人兴奋,然而理想有多丰满,现实就有多骨感,尚未有业界公开真正复刻 …

微服务架构---认识Zuul

目录 认识Zuul简单的例子 第一个Zuul程序步骤1:创建父工程zuul-1步骤2:创建HystrixController类步骤3:搭建服务消费者eureka-consumer项目(1)创建一个config包,在config包下新建配置类RestConfig&#xff0…

别再浪费时间!利用ChatGPT写作提效神器,赶紧收藏!

在信息化迅猛发展的当下,写作已成为我们日常中不可或缺的组成部分。论是在撰写报告、进行学术论文创作,还是写博客内容,写作都是我们思想和观点的核心手段。然而,写作非易事,它常需要我们付出大量的时间和精力。那么&a…

Superset SQL模板使用

使用背景 有时想让表的时间索引生效,而不是在最外层配置报表时,再套多一层时间范围。这时可以使用SQL模板 参考官方文档 https://superset.apache.org/docs/configuration/sql-templating/#:~:textSQL%20Lab%20and%20Explore%20supports%20Jinja 我…

vscode中的Code Runner配置----output中文乱码(设置默认使用cmd运行文件)、设置当前文件夹为根路径

问题描述 1. 存在中文显示异常,以及输出用Output输出的问题 解决方法: 把终端改为 cmd。如果是就不用替换了 修改RunCode的配置 完成,下面点击 run code就在cmd中运行了 2. 设置当前文件夹为根路径 code runner 的默认根路径是当前项目…

C#中Assembly3个获取路径的方法

在C#中,经常要获取路径 ,可以通过Assembly的三个重载方法来获取,如下所示这三个分别是GetCallingAssembly、GetEntryAssembly和GetExecutingAssembly。 string tmpEntryPath Assembly.GetEntryAssembly().Location;string tmpExeasmPath As…

嵌入式面试——C语言和数据结构篇(二)

本篇为C语言和数据结构篇(二) 1、关键字static的作用是什么? 答: 在C语言中,关键字static有三个明显的作用: 1>在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2&…

深度解读数字化转型的核心驱动因素与实践指南从战略到落地

数字化转型的战略重心 在当今商业环境中,数字化转型不仅是企业提升效率的工具,更是创造竞争优势的必要条件。随着技术的飞速发展,企业在面对市场动态变化时,依赖于其数字化基础设施、数据处理能力以及对新技术的敏捷反应能力&…

嵌入式面试——FreeRTOS篇(六) 任务通知

本篇为:FreeRTOS 任务通知篇 任务通知简介 1、任务通知介绍 答: 任务通知:用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 使用队列、信号量、事件标志组时都需要另外创建一个结构体&#xff0c…

【JAVA开源】基于Vue和SpringBoot的高校学科竞赛平台

本文项目编号 T 075 ,文末自助获取源码 \color{red}{T075,文末自助获取源码} T075,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 教…

如何使用DAMODEL进行AI开发教程

DAMODEL:DAMODEL 目前DAmodel注册并实名赠送50大洋的免费额度,搭载4090的服务器费用不到2r/h 教程: 完成注册并实名后 在此点击创建实例 选择实例配置 选择镜像,看你使用哪种dl框架 设置完毕后创建密钥并选择该密钥。 创建…

防火墙的三种工作模式:路由模式、透明模式(网桥)、混合模式

防火墙作为网络安全的核心设备之一,扮演着至关重要的角色。它不仅能够有效防御外部网络的攻击,还能保护内部网络的安全。在如今复杂多样的网络环境下,防火墙的部署和工作模式直接影响着网络安全策略的实施效果。防火墙通常可以工作在三种模式…

论文阅读笔记-Self-Attention

前言 Self-Attention能够将每个元素和当前时刻元素进行比较来确定上下文元素的重要性,这也使得它在NLP模型中表现优异。而本篇文章则是将卷积结构与Self-Attention结构进行了比较,通过 实验证明了这样的卷积结构同样有着高效的计算和足以和Self-Attention媲美的效果。本篇文…

【AAOS】Android Automotive 9模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r61 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emulator Home界面 MAP All apps S…