2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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:005115

评论

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

教你如何在Spark Scala/Java应用中调用Python脚本

华为云开发者联盟

Java Python spark JVM Spark Scala

硬核干货!TDSQL全局一致性读技术详解|

腾讯云数据库

tdsql 国产数据库

基于Hive Connector的openLooKeng Connector 创建复用机制剖析

LooK

大数据 hive 多数据源配置 计算引擎 openLooKeng

性能优化反思:不要在for循环中操作DB

CRMEB

浅析openLooKeng安全认证机制

LooK

大数据 ldap openLooKeng 安全认证

【Java原理剖析系列】深度synchronized工作原理分析

码界西柚

java 11月日更

2020Android 开发年度总结:“这一年里我到底做了些啥,面试阿里的时候一定会问到的

android 程序员 移动开发

2020Android-目前最稳定和高效的UI适配方案!你头秃都没想到还能这样吧!

android 程序员 移动开发

新版本发布!openLooKeng v1.4.0上线

LooK

大数据 计算引擎 openLooKeng

JPA + EclipseLink + 云平台 = 运行在云端的数据库应用

汪子熙

数据库 Cloud Cloud Native 11月日更

实用推荐系统:寻找有用的用户行为

博文视点Broadview

TDSQL | 深度解读HTAP系统的问题与主义之争

腾讯云数据库

tdsql 国产数据库

恒源云(GPUSHARE)_U1S1,1年1度GPU云种草大会

恒源云

深度学习

2020 国内互联网公司的Android工程师薪酬排名!看看你是什么水平

android 程序员 移动开发

超详细攻略!手把手教你如何在windows下搭建openLooKeng开发环境

LooK

大数据 计算引擎

超简单教程!自动部署openLooKeng

LooK

大数据 计算引擎 openLooKeng 安装部署

飞鹤乳业数智化转型之路

大咖说

云计算 数字化转型 数字化 企业上云

双11在即,分享一些稳定性保障技术干货

老张

系统稳定性 大促 生产环境全链路压测

TDSQL已助力20余家金融机构完成核心替换

腾讯云数据库

tdsql 国产数据库

极复杂编码,下载《原神》角色高清图、中日无损配音,爬虫 16 / 120 例

梦想橡皮擦

11月日更

TDSQL将发布免费版本,助力国产数据库生态完善

腾讯云数据库

数据库 tdsql

2020 更新 - 腾讯 Android 面试 (已拿到月薪22K offer)

android 程序员 移动开发

Hazelcast在openLooKeng中的应用(Cache篇)

LooK

大数据 cache 计算引擎 openLooKeng

推荐!DevOps工具正越来越自动化

飞算JavaAI开发助手

2020-Android-面试重难点(万字篇),android屏幕适配的五种方式

android 程序员 移动开发

模块三作业

doublechun

「架构实战营」

云上远程运维的最后那点担心,“云梯”帮你解决

华为云开发者联盟

运维 华为云Stack 远程运维 安全可信 云梯

助力邯钢工业4.0!TDengine在深度(平潭)节水减排项目中的应用

TDengine

数据库 tdengine 后端

2020 年需要关注的 5 大 Android 开发技术(1),Android知识总结

android 程序员 移动开发

使用JPA + Eclipselink操作PostgreSQL数据库

汪子熙

eclipse 数据库 11月日更

用一套代码实现APP和小程序

Speedoooo

容器 移动开发 ios开发 APP开发 Andriod开发

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