9 月 13 日,2025 Inclusion・外滩大会「开源嘉年华」正在限量报名中! 了解详情
写点什么

Apache CarbonData 里程碑式版本 1.3 发布

  • 2018-02-08
  • 本文字数:3343 字

    阅读完需:约 11 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

CarbonData 是一种新的高性能数据存储格式,已在 20+ 企业生产环境上部署和使应用,企业数据规模达到万亿。针对当前大数据领域分析场景需求各异而导致的存储冗余问题,业务驱动下的数据分析灵活性要求越来越高,CarbonData 提供了一种新的融合数据存储方案,以一份数据同时支持多种应用场景,并通过多级索引、字典编码、预聚合、动态 Partition、准实时数据查询、列存等特性提升了 IO 扫描和计算性能,实现百亿数据级秒级响应。

我们来看下,CarbonData 1.3.0 有哪些重大特性:

1. 支持与 Spark 2.2.1 集成

CarbonData 1.3.0 支持与最新稳定的 Spark 2.2.1 版本集成。

2. 支持预聚合表特性

在 1.3.0 中,CarbonData 的预聚合特性,与传统 BI 系统的 CUBE 方案最大区别是,用户不需要改任何 SQL 语句,既可加速 group by 的统计性能,又可查询明细数据,做到一份数据满足多种应用场景。具体的用法如下:

a) 创建主表:

复制代码
CREATE TABLE sales (
order_time TIMESTAMP,
user_id STRING,
sex STRING,
country STRING,
quantity INT,
price BIGINT)
STORED BY 'carbondata'

b) 基于上面主表 sales 创建预聚合表:

复制代码
CREATE DATAMAP agg_sales
ON TABLE sales
USING "preaggregate"
AS
SELECT country, sex, sum(quantity), avg(price)
FROM sales
GROUP BY country, sex

c) 用户不需要改 SQL 语句,基于主表 sales 的查询语句如命中预聚合表 agg_sales,可以显著提升查询性能:

复制代码
SELECT country, sex, sum(quantity), avg(price) FROM sales GROUP BY country, sex;// 命中,完全和聚合表一样
SELECT sex, sum(quantity) FROM sales GROUP BY sex;// 命中,聚合表的部分查询
SELECT country, avg(price) FROM sales GROUP BY country;// 命中,聚合表的部分查询
SELECT country, sum(price) FROM sales GROUP BY country;// 命中,因为聚合表里 avg(price) 是通过 sum(price)/count(price) 产生,所以 sum(price) 也命中
SELECT sex, avg(quantity) FROM sales GROUP BY sex; // 没命中,需要创建新的预聚合表
SELECT max(price), country FROM sales GROUP BY country;// 没命中,需要创建新的预聚合表
SELECT user_id, country, sex, sum(quantity), avg(price) FROM sales GROUP BY user_id, country, sex; // 没命中,需要创建新的预聚合表

d) 在 3.0 版本中,支持的预聚合表达式有:SUM、AVG、MAX、MIN、COUNT

e) 实测性能可提升 10+ 倍以上,大家可以参考例子,把测试数据调到 1 亿规模以上,跑下这个例子:/apache/carbondata/examples/PreAggregateTableExample.scala

3. 支持时间维度的预聚合特性,并支持自动上卷

此特性为 Alpha 特性,当前时间粒度支持设置为 1,比如:支持按 1 天聚合,暂不支持指定 3 天,5 天的粒度进行聚合,下个版本将支持。支持自动上卷(Year,Month,Day,Hour,Minute),具体用法如下:

a) 创建主表:

复制代码
CREATE TABLE sales (
order_time TIMESTAMP,
user_id STRING,
sex STRING,
country STRING,
quantity INT,
price BIGINT)
STORED BY 'carbondata'

b) 分别创建 Year、Month、Day、Hour、Minute 粒度的聚合表:

复制代码
CREATE DATAMAP agg_year
ON TABLE sales
USING "timeseries"
DMPROPERTIES (
'event_time’=’order_time’,
'year_granualrity’=’1’,
) AS
SELECT order_time, country, sex, sum(quantity), max(quantity), count(user_id), sum(price),
avg(price) FROM sales GROUP BY order_time, country, sex
CREATE DATAMAP agg_month
ON TABLE sales
USING "timeseries"
DMPROPERTIES (
'event_time’=’order_time’,
'month_granualrity’=’1’,
) AS
SELECT order_time, country, sex, sum(quantity), max(quantity), count(user_id), sum(price),
avg(price) FROM sales GROUP BY order_time, country, sex
CREATE DATAMAP agg_day
ON TABLE sales
USING "timeseries"
DMPROPERTIES (
'event_time’=’order_time’,
'day_granualrity’=’1’, // 当前粒度只支持设置为 1,
) AS
SELECT order_time, country, sex, sum(quantity), max(quantity), count(user_id), sum(price),
avg(price) FROM sales GROUP BY order_time, country, sex
CREATE DATAMAP agg_sales_hour
ON TABLE sales
USING "timeseries"
DMPROPERTIES (
'event_time’=’order_time’,
'hour_granualrity’=’1’,
) AS
SELECT order_time, country, sex, sum(quantity), max(quantity), count(user_id), sum(price),
avg(price) FROM sales GROUP BY order_time, country, sex
CREATE DATAMAP agg_minute
ON TABLE sales
USING "timeseries"
DMPROPERTIES (
'event_time’=’order_time’,
'minute_granualrity’=’1’,
) AS
SELECT order_time, country, sex, sum(quantity), max(quantity), count(user_id), sum(price),
avg(price) FROM sales GROUP BY order_time, country, sex

c) 用户可不用创建所有时间粒度的聚合表,系统支持自动 roll-up 上卷,如:已创建了 Day 粒度的聚合表,当查询 Year、Month 粒度的 group by 聚合时,系统会基于已聚合好的 Day 粒度值推算出 Year、Month 粒度的聚合值:

复制代码
CREATE DATAMAP agg_day
ON TABLE sales
USING "timeseries"
DMPROPERTIES (
'event_time’=’order_time’,
'day_granualrity’=’1’,
) AS
SELECT order_time, country, sex, sum(quantity), max(quantity), count(user_id), sum(price),
avg(price) FROM sales GROUP BY order_time, country, sex

(Year、Month 粒度的聚合查询,可用上面创建的 agg_day 上卷)

复制代码
SELECT timeseries(order_time, ‘month’), sum(quantity) FROM sales group by timeseries(order_time,
’month’)
SELECT timeseries(order_time, ‘year’), sum(quantity) FROM sales group by timeseries(order_time,
’year’)

4. 支持实时入库,准实时查询

在 1.3.0 中,支持通过 Structured Streaming 实时导入数据到 CarbonData 表,并立即可查询这些 fresh 数据。

a) 实时获取数据:

复制代码
val readSocketDF = spark.readStream
.format("socket")
.option("host", "localhost")
.option("port", 9099)
.load()

b) 写数据到 CarbonData 表

复制代码
qry = readSocketDF.writeStream
.format("carbondata")
.trigger(ProcessingTime("5 seconds"))
.option("checkpointLocation", tablePath.getStreamingCheckpointDir)
.option("dbName", "default")
.option("tableName", "carbon_table")
.start()

(具体可参考例子 /apache/carbondata/examples/CarbonStructuredStreamingExample.scala)

5. 支持标准的 Partition 特性:

此 Partition 和 Hive 和 Spark partition 一样,用户可以按字段值建立 partition 分区,查询时可指定具体分区数据进行快速查询;与 SORT_COLUMNS 组合应用,可以建立多级排序,满足任意维度组合的过滤查询,做到一份数据满足多种应用场景。如:创建下面表,设置 productDate 作为 partition 字段,数据按天进行分区;再通过 SORT_COLUMNS 建立多维 MDK 索引。这样可以按照 productDate,productName, storeProvince, storeCity 任意过滤组合快速查询数据。

复制代码
CREATE TABLE IF NOT EXISTS productSalesTable (
productName STRING,
storeProvince STRING,
storeCity STRING,
saleQuantity INT,
revenue INT)
PARTITIONED BY (productDate DATE)
STORED BY 'carbondata'
TBLPROPERTIES(‘SORT_COLUMNS’ = ‘productName, storeProvince, storeCity’)

6. 支持 CREATE TABLE AS SELECT 语法

CREATE TABLE carbon_table STORED BY 'carbondata' AS SELECT * FROM parquet_table7. 支持指定导入的数据进行查询

CarbonData 每批次导入的数据,会放到一个 segment 下,在 1.3.0 里用户可以指定 segment 数据进行查询,即:用户可以指定数据批次按需查询。

a) 查询 Segment ID 列表

SHOW SEGMENTS FOR TABLE <databasename>.<table_name>b) 设置 Segment ID

SET carbon.input.segments.<databasename>.<table_name> = <list of segment IDs>(具体可参考例子:/apache/carbondata/examples/QuerySegmentExample.scala)

8. Apache CarbonData**** 官网:apache.org

1.3.0下载地址

2018-02-08 18:005031

评论

发布
暂无评论
发现更多内容

从零开始实现一个Promise

helloworld1024fd

JavaScript

上干货 | 园区智慧物联管理解决方案

AIRIOT

物联网 智慧园区 低代码开发 园区解决方案

除了防火墙,还要部署什么设备才能保证服务器安全?

青藤云安全

网络安全 主机安全 青藤云安全

云图说|AppCube零代码,开启无码新生活

华为云开发者联盟

低代码 零代码 华为云 企业号十月 PK 榜

需求吞吐量半年提升 65%,500强企业这样做|ONES 研发管理大师课

万事ONES

音视频开发进阶——YUV与RGB的采样与存储格式

ZEGO即构

音视频开发

前端编程培训学习就业有前途吗?

小谷哥

AntDB数据并行加载工具的实现

亚信AntDB数据库

大数据 AntDB AntDB数据库 企业号十月PK榜 企业号十月 PK 榜

K8S 故障排错新手段:kubectl debug实战

BoCloud博云

容器 云原生 k8s

时间复杂度与空间复杂度

lovevivi

c 数据结构 10月月更

大数据开发培训机构有哪些?

小谷哥

重磅来袭 | 尚硅谷数据湖Hudi视频教程发布

小谷哥

ThreadLocal 源码分析-扩容和get方法

zarmnosaj

10月月更

开源依赖管理的最佳实践

SEAL安全

开源许可证 开源安全 软件供应链安全 开源安全与治理 10月月更

C# Timer控件学习,使用Timer解决按钮幂等性问题

IC00

C# 学习 程序员 上位机 10月月更

一句口诀教你辨别索引失效七大场景

华为云开发者联盟

数据库 后端 索引 华为云 企业号十月 PK 榜

web前端开发培训学习合适吗?

小谷哥

不知道如何设计帮助中心?这里有解决办法!

Baklib

产品 效率工具 帮助中心 文档编辑

质量切入点都在哪儿呢?

QE_LAB

质量保障 敏捷精益

js 和 css 是如何影响DOM树构建的?

CoderBin

CSS JavaScript 前端 DOM 10月月更

数据结构学习,数组和数组矩阵的三种压缩

IC00

学习 数据结构 算法 学习笔记 10月月更

前端培训学习好就业吗?

小谷哥

在线问题反馈模块实战(一):梳理业务需求并创建数据库表

bug菌

springboot 项目实战 10月月更

在DAYU200上实现OpenHarmony跳转拨号界面

OpenHarmony开发者

OpenHarmony

Zebec 以 Layer2 的形式推出 Zebec Chain,有望引发流支付赛道的新变革

股市老人

在线问题反馈模块实战(三):自动生成所有Controller、Service、Mapper等文件

bug菌

springboot 项目实战 10月月更

长安链源码分析之网络模块 net-liquid(4)

vcluster -- 基于虚拟集群的多租户方案

Se7en

Kubernetes 云原生

在线问题反馈模块实战(二):封装代码自动生成类文件器

bug菌

springboot 项目实战 10月月更

Baklib电子产品手册制作,简单且实用

Baklib

Apache CarbonData里程碑式版本1.3发布_开源_陈亮_InfoQ精选文章