Apache CarbonData1.3簡介
CarbonData是一種高性能大數據存儲方案,支持快速過濾查找和即席OLAP分析,已在20+企業生產環境上部署應用,其中最大的單一集群數據規模達到幾萬億。針對當前大數據領域分析場景需求各異而導致的存儲冗余問題,業務驅動下的數據分析靈活性要求越來越高,CarbonData提供了一種新的融合數據存儲方案,以一份數據同時支持多種應用場景,並通過多級索引、字典編碼、預聚合、動態Partition、準實時數據查詢等特性提升了IO掃描和計算性能,實現萬億數據分析秒級響應。主要適用於查詢場景(以空間換時間),尤其是分組聚合比較快
CarbonData 1.3.0的主要特性:
1、支持與Spark 2.2.1集成
CarbonData 1.3.0支持與最新Spark穩定版Spark 2.2.1版本集成。
2、支持預聚合,靈活高性能多維分析,無需預先數據建模
在1.3.0中,CarbonData的預聚合特性,與傳統BI系統的CUBE方案最大區別是,用戶不需要預先進行Cube建模以及修改任何SQL語句,既可加速OLAP分析性能,又可查詢明細數據,做到一份數據滿足多種應用場景。具體的用法如下:
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查詢語句,仍然使用主表進行查詢。當收到查詢請求後,CarbonData會對SQL做基於代價的自動優化,將SQL改寫為預聚合表上的查詢,例如下列語句會命中預聚合表,顯著提升查詢性能:
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) 在1.3.0版本中,支持的預聚合表達式有:SUM、AVG、MAX、MIN、COUNT
e) 在1億數據量上實測性能可提升10+倍以上,數據越大,性能提升效果越好。大家可以參考例子:/apache/carbondata/examples/PreAggregateTableExample.scala
3、 針對時間序列數據內置時間維的預聚合,支持自動上卷
對於時間序列數據,CarbonData內置了對時間維度的理解,為用戶提供了易用語法創建預聚合表。具體用法如下:
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’) 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’)
此特性為Alpha特性,當前時間粒度支持設置為1,比如:支持按1天聚合,暫不支持指定3天,5天的粒度進行聚合,下個版本將支持。支持自動上卷(Year,Month,Day,Hour,Minute)
4、 流式準實時入庫,提升數據時效性同時避免小文件問題
在許多業務場景中,數據時效性是一個非常重要的指標,即數據產生多久後可被查詢。而在現有的開源大數據方案中,能做實時入庫和實時查詢的方案非常少,而且實時入庫常常伴隨著小文件的產生,所以一般都需要多個存儲系統組合使用,如HBase做實時入庫,每天導出為Parquet文件後用Impala做分析,數據時效性延遲了一天,而且需要管理多個集群,維護非常困難。
在CarbonData1.3.0中,通過行列混合存儲並與Spark的Structured Streaming集成,支持用戶準實時導入數據到CarbonData表,並立即可查詢這些數據。因為實時導入的表格和歷史表是同一張表,所以也不需要在多個表格間來回切換,只需對一張表進行查詢即可同時查詢實時數據和歷史數據。
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、 支持標準Hive分區,兼容Spark、Hive的分區使用方法
Hive靜態分區和動態分區經過多年的應用,已經為大多數開發人員熟悉,CarbonData 1.3.0中支持標準Hive分區,可以使大數據應用更容易地遷移到CarbonData方案上來。
因為CarbonData具備索引能力,用戶在建立分區的同時,可以選擇與SORT_COLUMNS組合使用,在分區數據裏建立MDK索引,起到多級索引的效果,滿足任意維度組合的快速過濾查詢,做到一份數據滿足多種應用場景
例如創建下面表,設置productDate作為partition字段,數據按天進行分區;再通過SORT_COLUMNS建立多維索引。這樣即可按照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語法
CTAS (CREATETABLE AS SELECT) 允許用戶從Parquet/Hive/CarbonData表中SELECT來創建新的CarbonData表, 方便用戶把Parquet、Hive格式數據轉成CarbonData格式數據。
CREATE TABLE carbon_table STORED BY ‘carbondata‘ AS SELECT * FROM parquet_table
7、支持指定導入批次進行查詢
CarbonData每批次導入的數據,會產生一個segment,在1.3.0裏用戶可以指定Segment ID對某個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官網:carbondata.apache.org
1.3.0下載地址:https://dist.apache.org/repos/dist/release/carbondata/1.3.0
Apache CarbonData1.3簡介