美文网首页
CarbonData 2.0 RC2预览版正式发布,在数据湖+索

CarbonData 2.0 RC2预览版正式发布,在数据湖+索

作者: 好_1b67 | 来源:发表于2020-05-03 14:10 被阅读0次

CarbonData是一个支持索引和物化视图的ACID数据湖,在5月初正式发布了2.0 RC2,这个版本在索引、物化视图、数据湖能力、ACID等方面均有增强。

我们可以先快速浏览一下这个版本。

**索引和物化视图能力**:

* 详单查询:二级索引、时序索引、空间索引、Segment级别MINMAX索引,实现PB级别详单查询秒级响应。

* 复杂查询:物化视图、分桶索引,实现复杂查询秒级响应

* 数据湖索引管理:分布式索引缓存——IndexServer、并支持索引内存预加载

**数据湖能力**:

* 历史数据无缝迁移:支持对Parquet、ORC、CarbonData数据进行统一元数据管理,PB级别Parquet数据秒级导入CarbonData

* 历史数据加速:为Parquet、ORC、CarbonData构建统一物化视图

* 异构计算融合:对接Flink、Hive、Presto、PyTorch、TensorFlow

**ACID**:

* Insert、Update和Delete性能增强,支持Merge语法

下面我们首先介绍CarbonData的愿景,其次通过示例介绍CarbonData的索引、物化视图、数据湖能力和ACID能力。

## 前言

如下表所示,业界在EB级别存储的数据库可选方案主要包含Nosql数据、Hadoop生态数据仓库等,但都有其明显的不足。

可选方案 | 优势 | 不足

-|-|-

HBase、ES、Kudu、MPP等 | 快 | 贵

Spark、Hive等 | 成本低 | 慢

​    首先,以HBase服务、MongoDB服务或者ElasticSearch服务为代表的Nosql数据库,虽然也可以支持快速的复杂SQL查询,但是这些服务均不支持存储与计算分离,为了满足PB/EB级别存储的需求,往往我们需要启动更多的计算节点,消耗更多的CPU和存储成本,同时还要付出更多的运维成本,计算和存储的紧密耦合也意味着更低的计算和存储利用率。例如HBase服务,单台RegionServer可维护不超过10TB的数据,面对10PB的数据存储时,需要1000台计算节点部署RegionServer,其所面对的金钱成本和运维成本都十分高昂。

​    其次,以Spark on Parquet、Hive on ORC为代表的Hadoop生态数据仓库解决方案,支持将数据放在对象存储服务上,但是没有对数据构建高效的索引,使得明细数据查询或者复杂查询都很慢。假设如下几种场景:1)查询过去一年某用户的行为轨迹,当没有针对用户构建索引时,只能暴力扫描过去一整年的数据,测试中需要7天才能完成,2)Join类的复杂查询同样如此,无索引情况下,只能对数据暴力扫描,极大限制了查询速度。

​    由上可见,Nosql数据库虽然具有较好的数据索引机制,但是“太贵”,传统的Hadoop生态数据仓库将数据放在对象存储上,但是“太慢”,这两者各自的局限性,使得我们进行EB级别数据仓库选型时,面临着这一个鱼与熊掌不可兼得的选择题。

> ​    为了能够像关系型数据库一样,可以高效执行复杂SQL查询,又可以像NoSQL数据库一样,构建高效索引,最后,又可以和Spark/Hive一样,享受高度可扩展性的数据并行处理,又能利用近乎无限的低成本的对象存储资源,满足这种“又方便又快又便宜”的任性就是CarbonData的使命。

>

接下来的内容,我们将重点介绍如何体验CarbonData 2.0 RC2中的索引、物化视图、ACID能力。

## 一、快速安装CarbonData

* 准备1台Linux弹性云服务器

* 下载快速安装脚本

```shell

curl -k -O http://carbondata-publish.obs.myhuaweicloud.com/quick_start_carbondata.sh

```

* 启动sparksql和carbondata

```shell

source quick_start_carbondata.sh

```

## 二、CarbonData索引和物化视图

CarbonData 2.0 提供了丰富的索引能力,笔者总结了CarbonData提供的不同索引能力和适用场景。如下表所示。

索引类型 | 适用场景 | 效果

-|-|-

排序索引 | 带有排序键过滤的查询 | 秒级主键精确查询

二级索引 | 带有二级索引键过滤的查询 | 秒级非主键精确查询

物化视图  | Join、GroupBy、OrderBy等复杂查询 | 复杂查询秒级响应

时序索引  | 时序聚合 | 秒级时序聚合

空间索引  | 空间检索 | 秒级空间精确过滤

BloomFilter索引  | 带有高基数列过滤的查询 | 高基数列快速过滤

Lucene索引  | 多维检索 | 秒级多维索引

下面我们给出在CarbonData中构建索引的语法示例。

* 构建排序键索引,语法举例如下:

```sql

CREATE TABLE person(id STRING, age INT, country STRING, timestamp timestamp, address STRING, skill STRING)

STORED AS carbondata

TBLPROPERTIES('sort_scope'='GLOBAL_SORT','sort_columns'='id, age');

```

* 构建二级索引,语法举例如下:

```sql

CREATE index person_si_country_age on table person(country, age) AS 'carbondata';

```

* 构建物化视图,基于复杂查询构建物化视图的语法举例如下:

```sql

CREATE MATERIALIZED VIEW person_countid_gb_country

AS SELECT country,count(id) FROM person GROUP BY country;

```

* 时序索引,基于时间键的复杂查询构建时序索引的语法举例如下:

```sql

CREATE MATERIALIZED VIEW person_countid_gb_timeseries AS

SELECT timeseries(timestamp, 'minute'),count(id)

FROM person

GROUP BY timeseries(timestamp, 'minute');

```

* BloomFilter索引,语法举例如下:

```sql

CREATE INDEX person_bf_address

ON TABLE person (address)

AS 'bloomfilter'

PROPERTIES ('BLOOM_SIZE'='640000', 'BLOOM_FPP'='0.00001');

```

* Lucene索引,语法举例如下:

```sql

CREATE INDEX person_luc_skill

ON TABLE person (skill)

AS 'lucene';

```

* 加载数据

```sql

INSERT INTO person VALUES

('c001', '23', 'china', '2016-02-23 09:01:30','china sz','computer design'),

('c003', '23', 'japan', '2016-02-23 08:01:30','japan to','sport speech'),

('c002', '23', 'india', '2016-02-23 07:01:30','india mm','draw write');

```

* 查询数据

利用排序索引查询

```sql

SELECT * FROM person WHERE id = 'c001';

```

利用二级索引查询

```sql

SELECT * FROM person WHERE country = 'china' and age = 23;

```

利用物化视图进行查询

```sql

SELECT country,count(id) FROM person GROUP BY country;

```

利用时序索引进行查询

```sql

SELECT timeseries(timestamp, 'minute'),count(id)

FROM person

GROUP BY timeseries(timestamp, 'minute');

```

利用BloomFilter索引进行查询

```sql

SELECT * FROM person WHERE address = 'china sz';

```

利用Lucene索引进行查询

```sql

SELECT * FROM person WHERE TEXT_MATCH('skill:*computer*')

```

## 三、数据湖

CarbonData在体现性能优势的下一步,就需要回答如何将历史数据搬迁到CarbonData的问题,CarbonData 2.0交出了如下的答卷:

> 1)历史Parquet、ORC数据如何导入CarbonData;

>

> **支持通过"add segment"的方式,实现CarbonData对Parquet、ORC数据进行统一纳管。实现PB级别历史数据秒级迁移。**

>

> 2)如何对历史Parquet、ORC数据构建索引;

>

> **支持对CarbonData、Parquet、ORC构建统一物化视图。实现PB级别数据复杂查询秒级响应。**

下面主要通过示例演示以上两个功能:1.Parquet文件如何无缝导入CarbonData; 2.如何对Parquet数据构建物化视图。

* Parquet文件导入CarbonData

首先构建一张Parquet表,并写入数据。

```sql

CREATE TABLE parquet_table(id STRING, age INT, country STRING, timestamp timestamp, address STRING, skill STRING)

STORED AS parquet;

INSERT INTO parquet_table VALUES

('c004', '23', 'kor', '2016-02-22 09:01:30','kor ab','design'),

('c005', '23', 'russia', '2016-02-21 08:01:30','russia mo','game'),

('c006', '23', 'india', '2016-02-23 07:01:30','india sc','travel');

```

将Parquet文件元数据导入CarbonData,语法示例如下。这里path需要替换为真实parquet表路径,路径信息可以通过describe formatted parquet_table查询得到

```sql

ALTER TABLE person ADD SEGMENT options('path'='{$parquet_table_location}','format'='parquet');

```

查询CarbonData表。最终可以发现CarbonData表中已经可以查询到Parquet表的数据。

```sql

SELECT * FROM person;

```

* 为Parquet表构建物化视图、时序索引

```sql

CREATE MATERIALIZED VIEW parquet_table_countid_gb_country

AS SELECT country,count(id) FROM parquet_table GROUP BY country;

```

利用物化视图进行查询

```sql

SELECT country,count(id) FROM parquet_table GROUP BY country;

```

## 三、ACID

CarbonData 2.0中深度优化了UPDATE、DELETE性能,并支持了Merge语法。

数据更新,语法示例如下:

```sql

UPDATE Person SET age = '24' WHERE id = c001;

```

数据删除,语法示例如下:

```sql

DELETE FROM Person WHERE id = c002;

```

数据Merge,支持批量查询、更新、删除。语法可参考:

```sql

https://github.com/apache/carbondata/blob/master/examples/spark/src/main/scala/org/apache/carbondata/examples/CDCExample.scala

```

## 结语

CarbonData提供了一种新的融合数据存储方案,以一份数据同时支持多种应用场景,EB级别数据规模,查询性能秒级响应。可以看出CarbonData目前的架构和想法都十分先进,在体验了CarbonData 2.0 RC2的强大功能后,笔者也更加期待5月中CarbonData 2.0的正式版本发布了,大家一起拭目以待。

相关文章

网友评论

      本文标题:CarbonData 2.0 RC2预览版正式发布,在数据湖+索

      本文链接:https://www.haomeiwen.com/subject/xhpdghtx.html