点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- Hadoop(已更完)
- HDFS(已更完)
- MapReduce(已更完)
- Hive(已更完)
- Flume(已更完)
- Sqoop(已更完)
- Zookeeper(已更完)
- HBase(已更完)
- Redis (已更完)
- Kafka(已更完)
- Spark(已更完)
- Flink(已更完)
- ClickHouse(已更完)
- Kudu(已更完)
- Druid(已更完)
- Kylin(正在更新…)
章节内容
上节我们完成了如下的内容:
- Apache Kylin 安装
- Apache Kylin 部署
- Apache Kylin 集群模式
Cube 介绍
Apache Kylin 是一个开源的分布式分析引擎,专注于提供大数据的实时OLAP(在线分析处理)能力。Cube(立方体)是 Apache Kylin 的核心概念之一,通过预计算大规模数据的多维数据集合,加速复杂的 SQL 查询。下面详细介绍 Cube 的关键点:
Cube 的基本概念
Kylin 中的 Cube 是通过对一组事实表(通常是业务数据表)进行多维建模后,生成的预计算数据结构。Cube 涉及对多维数据的度量和维度的组合,从而可以在查询时通过检索预先计算的结果来显著减少计算开销。
- 维度(Dimension):数据中用于分组、筛选和切片的数据字段,例如时间、地区、产品等。
- 度量(Measure):通常是需要进行聚合计算的数据字段,例如销售额、订单数等。
- Cuboid:每个 Cube 由多个 Cuboid 构成,Cuboid 是一个特定维度组合的子集。Cube 中每种维度组合都会生成一个 Cuboid,每个 Cuboid 存储了该组合下的预聚合结果。
Cube 的创建过程
- 数据建模:首先在 Kylin 中创建一个数据模型(Data Model),这个模型定义了事实表和维度表之间的关系,类似于星型或雪花型模式。模型中也定义了需要聚合的度量字段。
- Cube 设计:基于数据模型设计 Cube,指定 Cube 的维度和度量。Kylin 会根据定义自动计算所有可能的维度组合(Cuboid)。
- 构建 Cube:构建过程会读取底层数据源(如 Hive、HBase、Kafka),然后根据指定的维度和度量生成每个 Cuboid 的预计算数据。这些预计算结果存储在 HBase 或其他存储引擎中。
Cube 的查询与优化
- 查询加速:当有 SQL 查询请求到达时,Kylin 会根据查询所涉及的维度组合,选择合适的 Cuboid 返回结果,避免了实时计算,极大地提高了查询性能。
- Cube 优化:为了控制 Cube 大小和加速构建,Kylin 支持裁剪 Cube,通过配置仅生成部分 Cuboid,这称为“Aggregation Group”,可以减少冗余计算。
实时 OLAP
Kylin 4.0 引入了对实时 OLAP 的支持,使用 Kafka 作为实时数据流输入,构建实时 Cube。通过使用 Lambda 架构,Kylin 可以支持实时和批处理数据的整合分析。
Cube 的典型应用场景
- 大规模数据分析:Cube 适用于分析超大规模的数据集,通过预计算方式加速查询。
- 实时分析:实时 Cube 允许用户在近乎实时的基础上分析流数据。
- 商业智能(BI)工具的集成:Kylin 提供与 Tableau、Power BI 等常见 BI 工具的集成,用户可以使用熟悉的 SQL 查询语言进行复杂的多维分析。
前置要求
需要你配置并且启动好了 Kylin!
由于我是在 h122.wzk.icu 节点上启动的,所以下面的操作都在 h122 节点上,后续没有详细说明就是在该机器上了。
准备数据
准备数据
将4个数据文件:
- dw_sales_data.txt
- dim_channel_data.txt
- dim_product_data.txt
- dim_region_data.txt
我写了几个脚本来辅助生成数据
dw_sales_data
import random
import datetime
# 设置参数
num_records =1000
output_file ='dw_sales_data.txt'# 定义可能的值
channel_ids =['C001','C002','C003','C004']
product_ids =['P001','P002','P003','P004']
region_ids =['R001','R002','R003','R004']
base_date = datetime.date(2024,1,1)# 生成数据withopen(output_file,'w')as f:for i inrange(num_records):
record_id =f"{i+1:04d}"
date1 =(base_date + datetime.timedelta(days=random.randint(0,365))).strftime('%Y-%m-%d')
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},{date1},{channel_id},{product_id},{region_id},{amount},{price}\n"
f.write(line)print(f"{num_records} records have been written to {output_file}")
生成数据如下图所示:
dim_channel_data
# 设置参数
output_file ='dim_channel_data.txt'# 定义渠道ID和渠道名称
channels =[('C001','Online Sales'),('C002','Retail Store'),('C003','Wholesale'),('C004','Direct Sales')]# 生成数据withopen(output_file,'w')as f:for channel_id, channel_name in channels:
line =f"{channel_id},{channel_name}\n"
f.write(line)print(f"Channel data has been written to {output_file}")
生成数据如下图所示:
dim_product_data
# 设置参数
output_file ='dim_product_data.txt'# 定义产品ID和产品名称
products =[('P001','Smartphone'),('P002','Laptop'),('P003','Tablet'),('P004','Smartwatch'),('P005','Camera'),('P006','Headphones'),('P007','Monitor'),('P008','Keyboard'),('P009','Mouse'),('P010','Printer')]# 生成数据withopen(output_file,'w')as f:for product_id, product_name in products:
line =f"{product_id},{product_name}\n"
f.write(line)print(f"Product data has been written to {output_file}")
生成数据如下图所示:
dim_region_data
# 设置参数
output_file ='dim_region_data.txt'# 定义区域ID和区域名称
regions =[('R001','North America'),('R002','Europe'),('R003','Asia'),('R004','South America'),('R005','Africa'),('R006','Australia'),('R007','Antarctica')]# 生成数据withopen(output_file,'w')as f:for region_id, region_name in regions:
line =f"{region_id},{region_name}\n"
f.write(line)print(f"Region data has been written to {output_file}")
生成的数据如下图所示:
kylin_examples.sql
-- 创建订单数据库、表结构createdatabaseifnotexists`wzk_kylin`;-- 1、销售表:dw_sales-- id 唯一标识-- date1 日期-- channelId 渠道ID-- productId 产品ID-- regionId 区域ID-- amount 数量-- price 金额createtable wzk_kylin.dw_sales(
id string,
date1 string,
channelId string,
productId string,
regionId string,
amount int,
price double)ROW FORMAT DELIMITED FIELDSTERMINATEDBY',';-- 2、渠道表:dim_channel-- channelId 渠道ID-- channelName 渠道名称createtable wzk_kylin.dim_channel(
channelId string,
channelName string
)ROW FORMAT DELIMITED FIELDSTERMINATEDBY',';-- 3、产品表:dim_productcreatetable wzk_kylin.dim_product(
productId string,
productName string
)ROW FORMAT DELIMITED FIELDSTERMINATEDBY',';--4、区域表:dim_regioncreatetable wzk_kylin.dim_region(
regionId string,
regionName string
)ROW FORMAT DELIMITED FIELDSTERMINATEDBY',';-- 导入数据LOADDATALOCAL INPATH '/opt/wzk/kylin_test/dw_sales_data.txt'
OVERWRITE INTOTABLE wzk_kylin.dw_sales;LOADDATALOCAL INPATH '/opt/wzk/kylin_test/dim_channel_data.txt'
OVERWRITE INTOTABLE wzk_kylin.dim_channel;LOADDATALOCAL INPATH '/opt/wzk/kylin_test/dim_product_data.txt'
OVERWRITE INTOTABLE wzk_kylin.dim_product;LOADDATALOCAL INPATH '/opt/wzk/kylin_test/dim_region_data.txt'
OVERWRITE INTOTABLE wzk_kylin.dim_region;
运行数据
我们需要把刚才的数据上传到指定目录上,/opt/wzk/目录下。
cd /opt/wzk/kylin_test
我已经上传到服务器上了:
SQL文件也记得上传上去
执行Hive:
hive -f kylin_examples.sql
执行结果如下图所示:
测试数据
我们需要启动Hive
hive
执行结果如下图所示:
执行如下的指令:
use wzk_kylin;select date1, sum(price) as total_money, sum(amount) as
total_amount
from dw_sales
group by date1;
执行结果如下图所示:
版权归原作者 武子康 所有, 如有侵权,请联系我们删除。