簡體   English   中英

為什么插入hdfs hive分區表時速度太慢?

[英]why it is too slow when insert hdfs hive partitioned table?

我已經創建了這樣的表:(未分區)

create external table `ersin_db`.`DW_ETL`
  (
  `ID` INT, 
  `NAME` STRING
  )  
    stored as parquet
    LOCATION '/user/ers/ersyn61/'
    tblproperties('parquet.compression'='SNAPPY');

當我嘗試插入時它很快。

但是當我像這樣創建分區表時:

create external table `ersin_db`.`DW_ETL`
  (
  `ID` INT, 
  `NAME` STRING
  ) 
partitioned by(partition_etldate_string string )
    stored as parquet
    LOCATION '/user/ers/ersyn61/'
    tblproperties('parquet.compression'='SNAPPY');


SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.dynamic.partition=true;
set hive.optimize.sort.dynamic.partition=true;

插入速度慢?

我怎樣才能更快?

提前致謝

我想我可以回答這個問題。
您的第二個表是動態分區表。 在插入動態分區表時,hive 對最終數據進行排序並逐個寫入每個分區(默認行為)。 由於您在 partition_etldate_string 上進行了partition_etldate_string ,因此需要花費大量時間將其逐個插入每個分區。 這是一個典型的 SQL 總結,當它試圖在年、月插入動態分區表時。 注意, SORT操作需要 17 分鍾,而數據處理只需要 1 分鍾。

Operator       #Hosts  Avg Time  Max Time   #Rows  Est. #Rows  Peak Mem  Est. Peak Mem  Detail                                                                                          
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
02:SORT             2    17m16s    30m50s  55.05M          -1  25.60 GB       12.00 MB                                                                                                  
01:EXCHANGE         2   9s493ms  12s822ms  55.05M          -1  26.98 MB        2.90 MB  HASH(CAST(extract(ts, 'year') AS SMALLINT),CAST(extract(ts, 'month') AS TINYINT)) 
00:SCAN HDFS        2  51s958ms     1m10s  55.05M          -1  76.06 MB      704.00 MB  default.my_table

您的第一個表沒有分區,因此 hive 不會對數據進行排序並一次寫入一個分區,但它將所有數據一起寫入。

根據數據量,動態分區可能需要很長時間才能加載。 這是默認行為,我不確定如何解決此問題。 您可以使用 static 分區,但很難處理基於日期的分區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM