天天看點

DLA-Presto二月更新

大家過年好啊,阿裡雲資料湖分析DLA-Presto二月疊代輕磅釋出,請查收。

  • 分區投影: 幫您解決分區爆炸後查詢慢的問題。
  • Cassandra Connector: 針對小表的性能優化比目前開源版本提高60多倍。
  • 控制ETL結果檔案數: 解決您的小檔案多的問題。
  • CU支援指定預設Hint: 如果一個hint每個SQL都要寫,那麼我們配置到CU級别吧。

分區投影

在大資料中,提升性能的一個最常見的方式是對資料劃分合理的分區,分區粒度越細,我們進行細粒度查詢的時候性能就越好,但是如果分區數太多,分區中繼資料查詢本身性能也會下降。是以我們支援了一種叫做“分區映射”的功能,分區映射讓使用者指定分區的規則,然後具體每個SQL查詢的分區會直接通過SQL語句中的查詢條件結合使用者建立表時候指定的規則直接計算出來,進而不用去查詢中繼資料,避免中繼資料爆炸帶來的性能問題。比如我們建立如下的表:

create external table projection_test (
  field1 int
) 
partitioned by (
  a string, 
  b string
) 
LOCATION 'oss://oss-cn-hangzhou-xxx/xxx/projection_test' 
tblproperties(
  'projection.enabled' = 'true',
  'projection.a.type' = 'injected',
  'projection.a.miss' = 'LIST',
  'projection.b.type' = 'date',
  'projection.b.range' = '2021-02-01, NOW',
  'projection.b.format' = 'yyyy-MM-dd',
  'projection.b.interval.unit' = 'days',
  'projection.b.interval' = '1',
  'storage.location.template' = 'oss://oss-cn-hangzhou-xxx/xxx/projection_test/${a}/${b}/'
)           

然後我們去查詢如下的語句:

select * from projection_test where a = 'hello' and b = '2021-02-03'           

那麼引擎會去掃描的檔案路徑就是:

oss://oss-cn-hangzhou-xxx/xxx/projection_test/hello/2021-02-03/           

關于分區映射更詳細的資訊歡迎參見我們的官方文檔。

Cassandra Connector性能優化

Cassandra Connector預設的實作對于小表的查詢不優化,比如你表裡面隻有10條數,你去select需要花1分鐘時間,這背後的原因在于雖然資料量少,但是Cassandra還是會提前切分很多TokenRange,預設的TokenRange就有幾百個,而Presto就會發起幾百個Split去查詢資料,使得性能很差,是以我們支援了一個參數讓使用者可以指定split數,使得我們對于小表的查詢可以優化到1秒内,大大提升性能:

/*+ cluster=vc-test, cassandra.full-table-scan-split-count=1 */
select first_name, last_name from cassandra_it_db.test_user           

這裡我們隻用一個split去查詢資料。

同時我們對于Cassandra支援了

MSCK REPAIR DATABASE

 的指令,使得您可以一個指令把Cassandra中所有的中繼資料加載到DLA裡面來:

MSCK REPAIR DATABASE cassandra_it_db           

寫入資料的時候控制寫入的檔案個數

在DLA-Presto中,我們要往一個OSS表中寫入資料的時候會使用下面的語句:

INSERT into target_table SELECT * FROM source_table           

結果檔案的個數取決于兩個因素: 參與寫資料的Worker的個數(table_write_worker_count)以及每個Worker上參與寫資料的線程個數(task_writer_count), 之前這兩個參數是沒有辦法通過用戶端來設定的,現在我們把這兩個參數都暴露出來了。

比如我們如果想寫入

target_table

 時隻生成一個檔案,那麼可以用下面的語句:

/*+cluster=vc-test,table-write-worker-count=1,task-writer-count=1*/
INSERT into target_table SELECT * FROM source_table           
注意這裡我們指定了cluster的hint,因為這個特性隻在CU版本中才可以使用。

注意實際産生的檔案數還取決于其他一些因素,比如你的資料量,是以上面的參數可以大體控制檔案數的規模,但是有時候檔案數不完全是 table-write-worker-count * task-writer-count。

支援為CU指定預設的hint

CU中有一些場景我們想指定預設的hint,比如上面提到的針對Cassandra小表的性能優化,需要添加一個

cassandra.full-table-scan-split-count=1

 的hint,但是我們又不想每個SQL語句都寫這個,那麼我們可以把他配置在CU級别,目前這個功能還沒有完全界面化開放給使用者,如果有需要可以聯系我們,我們背景配置。如果這個功能大家使用的多,我們後續會考慮開放配置界面給使用者。

其他

我們還有其他一些更新包括:

  • 增加對AdbPG存儲彈性版本的支援。
  • 優化Alluxio對于多塊盤的支援,在重新開機的時候可以從多塊盤恢複緩存資料。
  • 修複表名為數字時查詢報錯的問題。

最後對于産品如果有更多的意見建議歡迎加入我們的釘釘使用者群。

DLA-Presto二月更新

如果對咱們底層的Presto這個開源軟體感興趣也歡迎關注我們的Presto News公衆号:

DLA-Presto二月更新