全部產品
Search
文件中心

Data Lake Analytics - Deprecated:Presto FAQ

更新時間:Jul 06, 2024

本文匯總了使用DLA Presto的常見問題及解決方案。

高頻問題

在哪些情況下,共用叢集(Public)不計費?

DDL是不收費的,其它情況按照掃描量收費,詳情請參見按掃描量付費

共用叢集(Public)的算力是多大?

共用叢集(Public)是一個所有使用者共用使用的叢集,每個使用者的算力大致等價於一個10Core的叢集。

在控制台執行SELECT語句為什麼會有Limit 500的限制?能夠突破這個限制嗎?

原因:太多的資料展示導致頁面崩潰,為了保障控制台頁面的穩定性,設定了行數500的限制。

解決方案:您可以通過MySQL用戶端串連DLA來突破這個限制。

RAM使用者可以在哪裡執行SQL?

當前DLA控制台都是使用主帳號執行SQL的。RAM使用者只能通過在DLA控制台產生DLA的子帳號(使用者名稱+密碼),使用DMS執行SQL。

什麼是非同步執行?如何使用?

非同步執行主要針對ETL類SQL(INSERT...SELECT....), 這種SQL耗時較長,如果使用同步執行,那麼這段時間用戶端與伺服器端之間的串連會始終被佔用,如果有網路異常還會導致查詢失敗。而非同步執行則是提交SQL之後立即返回一個ID,後續只需使用SHOW QUERY_TASK語句去監控這個查詢的狀態即可。

非同步查詢的提交:

/*+ run-async=true*/ SELECT * FROM tbl;

非同步查詢的狀態查詢:

SHOW QUERY_TASK WHERE ID = '.....'

控制台上非同步執行如何拿到執行結果?

先執行非同步執行,控制台會顯示ASYNC_TASK_ID,用這個ID在同步執行裡面運行show query_task where id = 'xxxx',返回結果裡面的result_file_oss_file欄位為結果所在OSS的路徑。

重要

只有當SQL執行完成後,result_file_oss_file才會有值。

多個Hint如何一起使用?

您可以參考如下代碼。

/*+ cluster=public,run-async=true */ 
SELECT * FROM tbl

虛擬叢集問題

如何設定DLA Presto預設叢集?

如果需要所有的查詢預設都提交到某個指定的叢集,那麼您可以通過以下菜單路徑進行設定:系統設定 > 設定Presto引擎的預設叢集

如何設定連結層級的預設虛擬叢集?

您可以通過在使用者名稱後面加上@<叢集標識>的方法來指定連結的叢集。

如何把DLA Presto提交到指定的虛擬叢集?

當您建立虛擬叢集後(假設命名為dladw),您可以通過如下方式把SQL提交到指定的虛擬叢集。

  • 通過在SQL中指定hint的方式把SQL提交到指定的虛擬叢集執行,例如:/*+cluster=dladw*/SELECT * FROM tbl;

  • 通過連結使用者名稱指定虛擬叢集:支援在使用者名稱後面加上@<叢集標識>的方法來指定連結的叢集。

說明

您可以在叢集詳情頁面查看叢集標識。

  • 設定預設叢集為dladw。

中繼資料/DDL相關問題

為什麼執行MSCK REPAIR TABLE載入不了分區?

MSCK的命令只能對目錄名字元合XXX=XXX的格式載入分區。例如:oss://abc/yyy/action/year=2018/。

如何處理建庫報錯:Generate vpc reverse access mapping ip & mapping port failed, please check your vpc_id(vpc-xxxx) and instance_id(rm-xxx)!?

此時報錯的可能原因和解決方案如下。

  • 原因:您的VPC ID和Instance ID填寫錯誤。
    解決方案:請正確進行填寫。
  • 原因:您的RDS執行個體做過資料移轉,頁面顯示的執行個體ID不是真實的ID。

    解決方案:您可以添加一個屬性USE_VPC_CLOUD_INSTANCE_ID = 'true'。範例程式碼如下。

    CREATE SCHEMA `test_db` WITH DBPROPERTIES (   
    CATALOG = 'mysql',   
    LOCATION = 'jdbc:mysql://rm-xxx.mysql.rds.aliyuncs.com:3306/dla_test',  
    USER='dla_test',   PASSWORD='xxxxx',   INSTANCE_ID = 'rm-xxx',   
    VPC_ID = 'vpc-xxxx',   
    USE_VPC_CLOUD_INSTANCE_ID = 'true' );

如何查看錶的分區數目?

您可以通過如下命令查看錶的分區數目。

select count(distinct <partition_key>) from tbl;

OSS/Hive資料來源相關問題

如何通過SQL查詢一個OSS表裡面的檔案數?

您可以通過如下命令進行查詢。

select count(distinct `$path`) from tbl;
重要

上面的SQL語句中您只需要修改tbl為您真實的表名,其它部分不用修改。

如何查詢CSV檔案的中文出現亂碼問題?

原因:在Linux中使用file命令查看檔案編碼,之後建表的時候使用LazySimpleSerDe作為Serde

解決方案:如果原始編碼為ISO-8859,您可以進行如下配置serialization.encoding=gbk

使用Insert類型的SQL文法時,如何減小輸出的檔案數?

您可以通過Hint調整以下兩個參數的取值。

  • table_write_worker_count:輸出Task的並行度。

  • task_writer_count:每個Task寫檔案的並行度。

輸出檔案數一般等於table_write_worker_count*task_writer_count。如果需要減小輸出檔案數,您可以把table_write_worker_count取值調整為10,task_writer_count取值調整為2。

說明
  • 由於叢集規模、實際資料分布等因素都會影響輸出的檔案數,因此控制輸出的檔案數比較複雜。

  • 只有CU版本才支援輸出檔案數的相關配置。

支援基於.gz壓縮的資料嗎?

支援。目前支援GZIP和SNAPPY兩種壓縮演算法。

能同時處理相同目錄下的壓縮檔和非壓縮檔嗎?

可以。

DLA的表預設會遞迴讀取表目錄下的所有子目錄和檔案嗎?

是的。

為什麼同一個SQL從HDFS同步資料到OSS,在DLA中查詢是11萬資料量,自建的叢集查詢是19萬資料量?

原因:大部分情況是同步資料到OSS存在問題。
解決方案:您可以查看自己的OSS的資料是否正常同步。

效能相關問題

如何解決查詢報錯:“Query exceeded distributed user memory limit of 2.00TB or Query exceeded per-node user memory limit of xxGB”?

DLA Presto中一個查詢能使用的單個節點的記憶體以及整個叢集的總記憶體是有限制的,您可以通過如下方式進行解決。

  • 最佳化JOIN以減少對於記憶體的需求。例如把資料量大的放在左邊,資料量小的放在右邊。

  • 對資料進行分區。

  • 分拆計算,把一個大SQL拆成多個小SQL。

檔案格式是ORC,為什麼看掃描量是掃描了整個檔案,而不是只掃描SQL裡面指定的列?

分析型的查詢往往只會擷取一個表裡面少數幾列的資料,這樣執行引擎比如Presto在實際掃描底層資料的時候只需要掃描需要的列的資料。而這種節省掃描量的效果只有當底層的資料是以列存的形式儲存才能達到。範例程式碼如下。
SELECT col1 FROM tbl1 WHERE col2 = 'hello;

但是在實際使用過程中,如果檔案不是很大,或者檔案不小但是表的列很多的情況,節省掃描量的效果會不起作用,因為ORC_TINY_STRIPE_THRESHOLD參數會控制Presto只掃描單個列還是整個檔案。範例程式碼如下。

dataSizeSessionProperty(         
    ORC_TINY_STRIPE_THRESHOLD,         
    "ORC: Threshold below which an ORC stripe or file will read in its entirety",           
    hiveClientConfig.getOrcTinyStripeThreshold(),         
    false);

ORC_TINY_STRIPE_THRESHOLD參數的預設值是8MB,所以如果您的Stripe太小,Presto會讀取整個檔案,而不是讀取一個個Stripe。如果每個Stripe太小,一次次地讀取Stripe花費在網路上的開銷可能比直接讀取整個檔案的開銷還要大。

如何開啟大查詢功能?

當您查詢的資料需要消耗比較多的記憶體導致一直失敗時,您可以開啟虛擬叢集的大查詢功能。開啟方法,在查詢中添加HINT,樣本如下。

/*+big_query=true*/insertintotable1SELECT*FROMtable2;
說明
  • 大查詢功能只支援CU版本,不支援掃描量版本。

  • 大查詢功能並不能讓您查詢任意大小的資料量和任意複雜的SQL,如果big_query還解決了不了您的問題請聯絡DLA答疑同學。

  • Schema的Catalog類型必須是Hive,否則會出現如下報錯:big_query only support hive catalog ...。

如何調整查詢RDS類資料來源的並發度?

以RDS為例,使用DLA掃描線上資料時,如果RDS執行個體規格比較小,可能無法支撐預設的JDBC Connector並發度。您可以在DLA中引入Hint/*+jdbc-scan-splits=2*/,指定掃描一個資料表時的JDBC Connector並發度。
mysql> /*+jdbc-scan-splits=2*/select count(*) from customer; 
+----------+ 
| count(*) | 
+----------+ 
| 15000002 |

上述customer表對應RDS MySQL資料庫中的customer表。DLA掃描RDS MySQL的customer表時,會使用兩個線程同時掃描資料。

重要
  • 待掃描目標表必須有一個自增主鍵,否則無法使用Hint調整查詢並發度。對於有自增主鍵的表,您可以按照自增主鍵把一個查詢切分成多個子查詢提高查詢並發度。範例程式碼如下。

-- 原始SQL   
select * from customer;   
-- 切分成如下的子查詢   
select * from customer where id >=0 and id <=10000;   
select * from customer where id >=10000 and id <=20000;
  • DLA最大並發度是500,預設並發度是1,對於一些規格配置較低或者複雜資料庫,可以將預設並發度適當調低。

其它問題

如何處理報錯:because '3.00199E9' in colum n '4' is outside valid range for the datatype INTEGER?

原因:底層對應的資料超出了DLA中INT類型能表示的最大範圍。

解決方案:您可以使用BIGINT類型來映射。

如何處理報錯:Application was streaming results when the connection failed. Consider raising value of ‘net_write_timeout’ on the server.?

原因:讀取MySQL資料來源的資料時,由於預設的net_write_timeout取值設定較小,資料還沒有讀取完畢,MySQL資料來源就關閉了串連。

解決方案:您可以在MySQL資料來源把net_write_timeout參數的取值適當調高。

如何處理向OTS寫資料時報錯:Code: OTSParameterInvalid, Message: Invalid update row request: missing cells in request?

原因:OTS屬性列為空白。

解決方案:您需要手動過濾掉屬性列為空白的記錄。