Hive 連接器¶
概觀¶
Hive 連接器允許查詢儲存在 Hive 資料倉儲中的資料。Hive 是三個元件的組合
各種格式的資料檔案,通常儲存在 Hadoop 分散式檔案系統 (HDFS) 或 Amazon S3 中。
關於資料檔案如何對應到結構描述和表格的中繼資料。此中繼資料儲存在 MySQL 等資料庫中,並透過 Hive metastore 服務存取。
一種稱為 HiveQL 的查詢語言。此查詢語言在分散式運算框架 (例如 MapReduce 或 Tez) 上執行。
Presto 僅使用前兩個元件:資料和中繼資料。它不使用 HiveQL 或 Hive 執行環境的任何部分。
支援的檔案類型¶
Hive 連接器支援下列檔案類型
ORC
Parquet
Avro
RCFile
SequenceFile
JSON
Text
組態¶
Hive 連接器支援 Apache Hadoop 2.x 和衍生發行版本,包括 Cloudera CDH 5 和 Hortonworks Data Platform (HDP)。
建立 etc/catalog/hive.properties
,其內容如下,以將 hive-hadoop2
連接器掛載為 hive
目錄,並以您的 Hive metastore Thrift 服務的正確主機和連接埠取代 example.net:9083
connector.name=hive-hadoop2
hive.metastore.uri=thrift://example.net:9083
多個 Hive 叢集¶
您可以根據需要擁有任意數量的目錄,因此如果您有其他 Hive 叢集,只需將另一個屬性檔案新增到 etc/catalog
並使用不同的名稱(確保其結尾為 .properties
)。例如,如果您將屬性檔案命名為 sales.properties
,Presto 將使用設定的連接器建立名為 sales
的目錄。
HDFS 組態¶
對於基本設定,Presto 會自動設定 HDFS 用戶端,並且不需要任何組態檔案。在某些情況下,例如使用聯合 HDFS 或 NameNode 高可用性時,有必要指定額外的 HDFS 用戶端選項,才能存取您的 HDFS 叢集。若要這麼做,請新增 hive.config.resources
屬性,以參考您的 HDFS 組態檔案
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
只有在您的設定絕對必要時,才指定其他組態檔案。我們也建議減少組態檔案,使其具有最少的一組必要屬性,因為其他屬性可能會導致問題。
組態檔案必須存在於所有 Presto 節點上。如果您要參考現有的 Hadoop 組態檔案,請務必將它們複製到任何未執行 Hadoop 的 Presto 節點。
HDFS 使用者名稱¶
當不將 Kerberos 與 HDFS 搭配使用時,Presto 將使用 Presto 程序的 OS 使用者存取 HDFS。例如,如果 Presto 以 nobody
執行,它將以 nobody
存取 HDFS。您可以藉由在 Presto JVM 設定中設定 HADOOP_USER_NAME
系統屬性來覆寫此使用者名稱,並以適當的使用者名稱取代 hdfs_user
-DHADOOP_USER_NAME=hdfs_user
存取受 Kerberos 驗證保護的 Hadoop 叢集¶
HDFS 和 Hive metastore 都支援 Kerberos 驗證。但是,目前尚不支援憑證快取的 Kerberos 驗證。
適用於 Hive 連接器安全性的屬性列在「Hive 組態屬性」表格中。請參閱「Hive 安全性組態」章節,以取得 Hive 連接器中安全性選項的更詳細討論。
Hive 組態屬性¶
屬性名稱 |
描述 |
預設值 |
---|---|---|
|
使用 Thrift 通訊協定連線的 Hive metastore 的 URI。如果提供多個 URI,預設會使用第一個 URI,而其餘 URI 則為回退 metastore。此屬性為必要屬性。範例: |
|
|
Presto 將用來存取 Hive metastore 的使用者名稱。 |
|
|
HDFS 組態檔案的選用逗號分隔清單。這些檔案必須存在於執行 Presto 的電腦上。僅在絕對必要時才指定此選項以存取 HDFS。範例: |
|
|
建立新表格時使用的預設檔案格式。 |
|
|
寫入檔案時要使用的壓縮編碼解碼器。 |
|
|
強制將分割區排程在與服務分割區資料的 Hadoop DataNode 程序相同的節點上。這對於 Presto 與每個 DataNode 共置的安裝很有用。 |
|
|
啟用基於順序的執行。啟用時,hive 檔案會變成不可分割,而表格排序屬性會公開給計畫最佳化工具 |
|
|
應該使用現有的表格格式還是預設的 Presto 格式寫入新的分割區? |
|
|
是否可將新資料插入現有的分割區? |
|
|
是否應為沒有資料的儲存區建立空白檔案? |
|
|
每個寫入器的最大分割區數。 |
100 |
|
單一表格掃描的最大分割區數。 |
100,000 |
|
根據查詢掃描的資料啟用分割區的動態調整大小。 |
|
|
Hive metastore 驗證類型。可能的值為 |
|
|
Hive metastore 服務的 Kerberos 主體。 |
|
|
Presto 連線至 Hive metastore 服務時將使用 Kerberos 主體。 |
|
|
Hive metastore 用戶端 keytab 位置。 |
|
|
HDFS 驗證類型。可能的值為 |
|
|
啟用 HDFS 終端使用者模擬。 |
|
|
Presto 連線到 HDFS 時將使用的 Kerberos principal。 |
|
|
HDFS 用戶端 keytab 位置。 |
|
|
請參閱 Hive 安全性設定。 |
|
|
當 |
|
|
啟用寫入非託管 (外部) Hive 表格。 |
|
|
啟用建立非託管 (外部) Hive 表格。 |
|
|
啟用寫入時自動收集欄位層級統計資料。詳細資訊請參閱 表格統計資料。 |
|
|
啟用將查詢下推至 AWS S3 Select 服務。 |
|
|
用於 S3SelectPushdown 的同時開啟至 S3 的最大連線數。 |
500 |
|
啟用多個 Metastore 執行個體之間的負載平衡 |
|
|
啟用略過空檔案。否則,迭代處理空檔案時會產生錯誤。 |
|
|
目錄清單快取的最大大小 (以位元組為單位) |
|
Metastore 設定屬性¶
所需的 Hive metastore 可以透過多個屬性進行設定。
屬性名稱 |
描述 |
預設值 |
---|---|---|
|
Hive metastore 請求的逾時時間。 |
|
|
快取的 metastore 資料應被視為有效的持續時間。 |
|
|
Hive metastore 快取的最大大小。 |
10000 |
|
如果快取的 metastore 資料比此時間舊但尚未過期,則在存取後非同步重新整理,讓後續存取看到最新的資料。 |
|
|
用於重新整理快取的 metastore 資料的最大執行緒數。 |
100 |
AWS Glue 目錄設定屬性¶
屬性名稱 |
描述 |
---|---|
|
Glue 目錄的 AWS 區域。當不在 EC2 中執行,或目錄位於不同區域時,這是必要項目。範例: |
|
將 Glue 請求固定到 Presto 執行的 EC2 執行個體所在的相同區域 (預設為 |
|
到 Glue 的最大並行連線數 (預設為 |
|
Glue 用戶端的最大錯誤重試次數,預設為 |
|
Hive Glue metastore 預設倉儲目錄 |
|
用於連線到 Glue 目錄的 AWS 存取金鑰。如果與 |
|
用於連線到 Glue 目錄的 AWS 私密金鑰。如果與 |
|
中繼資料資料庫所在的 Glue 目錄 ID。 |
|
Glue API 端點 URL (選用)。範例: |
|
分割的 Glue 表格的區段數。 |
|
從 Glue 平行擷取分割區的執行緒數。 |
|
連線到 Glue 目錄時要擔任的 IAM 角色 ARN。 |
Amazon S3 設定¶
Hive 連接器可以讀取和寫入儲存在 S3 中的表格。這是透過使用 S3 前置詞而不是 HDFS 前置詞的表格或資料庫位置來完成的。
Presto 會將 s3://
、s3n://
和 s3a://
URI 前置詞使用其自己的 S3 檔案系統。
S3 設定屬性¶
屬性名稱 |
描述 |
---|---|
|
使用 EC2 中繼資料服務來擷取 API 認證 (預設為
|
|
要使用的預設 AWS 存取金鑰。 |
|
要使用的預設 AWS 私密金鑰。 |
|
要擔任的 IAM 角色。 |
|
S3 儲存端點伺服器。這可用於連線到與 AWS 相容的 S3 儲存系統。當使用 v4 簽章時,建議將此設定為 AWS 區域特定的端點 (例如, |
|
寫入資料時要使用的 S3 儲存類別。目前僅支援 |
|
指定與 S3 相容之儲存空間的不同簽署者類型。範例:v2 簽署者類型的 |
|
對與 S3 相容的儲存空間的所有請求使用路徑樣式存取。這是用於不支援虛擬主機樣式存取的與 S3 相容的儲存空間。(預設為 |
|
寫入 S3 的資料的本機暫存目錄。預設為 JVM 系統屬性 |
|
將 S3 請求固定到 Presto 執行的 EC2 執行個體所在的相同區域 (預設為 |
|
使用 HTTPS 與 S3 API 通訊 (預設為 |
|
使用 S3 伺服器端加密 (預設為 |
|
S3 伺服器端加密的金鑰管理類型。對 S3 管理使用 |
|
用於使用 KMS 管理金鑰進行 S3 伺服器端加密的 KMS 金鑰 ID。如果未設定,則會使用預設金鑰。 |
|
如果設定,則使用 S3 用戶端加密,並使用 AWS KMS 來儲存加密金鑰,並使用此屬性的值作為新建立物件的 KMS 金鑰 ID。 |
|
如果設定,則使用 S3 用戶端加密,並使用此屬性的值作為實作 AWS SDK |
|
將檔案上傳到 S3 時要使用的 Canned ACL (預設為 |
|
略過 Glacier 物件,而不是使查詢失敗。這會略過可能預期為表格或分割區一部分的資料。預設為 |
S3 認證¶
如果您使用 EMR 或其他設施在 Amazon EC2 上執行 Presto,建議您使用 EC2 的 IAM 角色來管理對 S3 的存取權。若要啟用此功能,您的 EC2 執行個體需要指派一個 IAM 角色,該角色會授予對您想要使用的 S3 儲存貯體中所儲存資料的適當存取權。也可以使用 hive.s3.iam-role
設定 IAM 角色,以便在存取任何 S3 儲存貯體時擔任該角色。這比在 hive.s3.aws-access-key
和 hive.s3.aws-secret-key
設定中設定 AWS 存取金鑰和私密金鑰更簡潔,而且也允許 EC2 定期自動輪換認證,而無需您執行任何額外的工作。
在推出 DefaultAWSCredentialsProviderChain 之後,如果未設定 IAM 角色和 IAM 認證,則會使用執行個體認證,因為它們是 DefaultAWSCredentialsProviderChain 中的最後一個項目。
自訂 S3 認證提供者¶
您可以使用設定 Hadoop 組態屬性 presto.s3.credentials-provider
為自訂 AWS 憑證提供者實作的完整類別名稱,來設定自訂 S3 憑證提供者。此類別必須實作 AWSCredentialsProvider 介面,並提供一個帶有兩個引數的建構子,這兩個引數分別是 java.net.URI
和 Hadoop org.apache.hadoop.conf.Configuration
。自訂憑證提供者可用於從 STS 提供臨時憑證(使用 STSSessionCredentialsProvider
)、基於 IAM 角色的憑證(使用 STSAssumeRoleSessionCredentialsProvider
),或用於特定用例的憑證(例如,特定儲存貯體/使用者憑證)。此 Hadoop 組態屬性必須設定在 hive.config.resources
Hive 連接器屬性所參照的 Hadoop 組態檔案中。
AWS 安全性對應¶
Presto 支援 AWS Lake Formation 和 AWS S3 API 呼叫的彈性對應,允許為特定使用者使用不同的憑證或 IAM 角色。
對應可分為兩種型別:S3
或 LAKEFORMATION
。
對應項目會按照組態檔案中所列的順序處理。較具體的對應應在較不具體的對應之前指定。您可以透過不包含列表中最後一個項目的任何比對條件來設定預設組態。
當對應型別為 S3
時,每個對應項目可以指定一個比對條件。可用的比對條件為
user
:用於比對使用者名稱的正規表示式。範例:alice|bob
對應必須提供一或多個組態設定
accessKey
和secretKey
:AWS 存取金鑰和私密金鑰。這會覆寫任何全域設定的憑證,例如存取金鑰或執行個體憑證。iamRole
:要使用的 IAM 角色。這會覆寫任何全域設定的 IAM 角色。
S3 的 JSON 組態檔案範例
{
"mappings": [
{
"user": "admin",
"accessKey": "AKIAxxxaccess",
"secretKey": "iXbXxxxsecret"
},
{
"user": "analyst|scientist",
"iamRole": "arn:aws:iam::123456789101:role/analyst_and_scientist_role"
},
{
"iamRole": "arn:aws:iam::123456789101:role/default"
}
]
}
當對應型別為 LAKEFORMATION
時,每個對應項目可以指定一個比對條件。可用的比對條件為
user
:用於比對使用者名稱的正規表示式。範例:alice|bob
對應必須提供一個組態設定
iamRole
:要使用的 IAM 角色。這會覆寫任何全域設定的 IAM 角色。
Lake Formation 的 JSON 組態檔案範例
{
"mappings": [
{
"user": "admin",
"iamRole": "arn:aws:iam::123456789101:role/admin_role"
},
{
"user": "analyst",
"iamRole": "arn:aws:iam::123456789101:role/analyst_role"
},
{
"iamRole": "arn:aws:iam::123456789101:role/default_role"
}
]
}
屬性名稱 |
描述 |
---|---|
|
AWS 安全性對應型別。可能的值:S3 或 LAKEFORMATION |
|
包含 AWS IAM 安全性對應的 JSON 組態檔案 |
|
AWS IAM 安全性對應組態將會重新整理的時間間隔 |
調整屬性¶
下列調整屬性會影響 Presto S3 檔案系統在與 S3 通訊時使用的用戶端行為。這些參數中的大多數會影響與 AmazonS3Client
相關聯的 ClientConfiguration
物件上的設定。
屬性名稱 |
描述 |
預設值 |
---|---|---|
|
在 S3 用戶端上設定的最大錯誤重試次數。 |
|
|
要重試的最大讀取嘗試次數。 |
|
|
在與 S3 通訊時,使用從 1 秒開始的指數輪詢,直到達到此最大值為止。 |
|
|
與 S3 通訊的最大重試時間。 |
|
|
TCP 連線逾時。 |
|
|
TCP 通訊端讀取逾時。 |
|
|
與 S3 的最大同時開啟連線數。 |
|
|
使用多部分上傳到 S3 的最小檔案大小。 |
|
|
最小多部分上傳部分大小。 |
|
S3 資料加密¶
Presto 支援使用 S3 管理金鑰的伺服器端加密,以及使用 Amazon KMS 或軟體外掛程式來管理 AES 加密金鑰的用戶端加密,來讀取和寫入 S3 中的加密資料。
使用 S3 伺服器端加密(在 Amazon 文件中稱為 *SSE-S3*),S3 基礎結構會處理所有加密和解密工作(除了與用戶端的 SSL 之外,假設您已將 hive.s3.ssl.enabled
設定為 true
)。S3 也會為您管理所有加密金鑰。若要啟用此功能,請將 hive.s3.sse.enabled
設定為 true
。
使用 S3 用戶端加密,S3 會儲存加密資料,而加密金鑰會在 S3 基礎結構外部管理。資料會由 Presto 加密和解密,而不是在 S3 基礎結構中。在此情況下,可以使用 AWS KMS 或您自己的金鑰管理系統來管理加密金鑰。若要使用 AWS KMS 進行金鑰管理,請將 hive.s3.kms-key-id
設定為 KMS 金鑰的 UUID。您的 AWS 憑證或 EC2 IAM 角色也需要被授權使用給定的金鑰。
若要使用自訂加密金鑰管理系統,請將 hive.s3.encryption-materials-provider
設定為實作 AWS Java SDK 中的 EncryptionMaterialsProvider 介面的類別完整名稱。此類別必須可透過類別路徑供 Hive 連接器存取,且必須能夠與您的自訂金鑰管理系統通訊。如果此類別也實作 Hadoop Java API 中的 org.apache.hadoop.conf.Configurable
介面,則會在建立物件執行個體之後,且要求其佈建或擷取任何加密金鑰之前,將 Hadoop 組態傳入。
S3SelectPushdown¶
S3SelectPushdown 可將投影 (SELECT) 和述詞 (WHERE) 處理推送到 S3 Select。使用 S3SelectPushdown,Presto 只會從 S3 擷取必要的資料,而不是整個 S3 物件,從而減少延遲和網路使用量。
S3 Select 是否適合我的工作負載?¶
S3SelectPushdown 的效能取決於查詢篩選的資料量。篩選大量資料列應該會產生更好的效能。如果查詢未篩選任何資料,則推送可能不會增加任何額外價值,並且使用者將需要支付 S3 Select 請求的費用。因此,我們建議您對使用和不使用 S3 Select 的工作負載進行基準測試,以查看使用它是否適合您的工作負載。依預設,S3SelectPushdown 已停用,您應該在進行適當的基準測試和成本分析後,在生產環境中啟用它。如需有關 S3 Select 請求成本的詳細資訊,請參閱 Amazon S3 雲端儲存定價。
請使用下列準則來判斷 S3 Select 是否適合您的工作負載
您的查詢篩選掉超過一半的原始資料集。
您的查詢篩選述詞使用具有 Presto 和 S3 Select 支援的資料型別的欄。S3 Select Pushdown 不支援
TIMESTAMP
、REAL
和DOUBLE
資料型別。我們建議對數值資料使用十進位資料型別。如需有關 S3 Select 支援的資料型別的詳細資訊,請參閱資料型別文件。您的 Amazon S3 和 Amazon EMR 叢集之間的網路連線具有良好的傳輸速度和可用的頻寬。Amazon S3 Select 不會壓縮 HTTP 回應,因此壓縮輸入檔案的回應大小可能會增加。
考量事項和限制¶
僅支援以 CSV 格式儲存的物件。物件可以未壓縮,或選擇性地使用 gzip 或 bzip2 壓縮。
不支援「AllowQuotedRecordDelimiters」屬性。如果指定此屬性,查詢將會失敗。
不支援使用客戶提供的加密金鑰 (SSE-C) 和用戶端加密的 Amazon S3 伺服器端加密。
S3 Select Pushdown 無法取代使用欄狀或壓縮檔案格式,例如 ORC 和 Parquet。
啟用 S3 Select Pushdown¶
您可以使用 s3_select_pushdown_enabled
Hive 工作階段屬性或 hive.s3select-pushdown.enabled
組態屬性來啟用 S3 Select Pushdown。工作階段屬性會覆寫組態屬性,讓您可以根據每個查詢啟用或停用。不執行篩選的查詢(SELECT * FROM table
)不會推送到 S3 Select,因為它們會擷取整個物件內容。
對於未壓縮的檔案,使用支援的格式和 SerDes,S3 Select 會並行掃描位元組範圍。掃描範圍請求會跨推送到 S3 Select 的查詢片段的內部 Hive 分割的位元組範圍執行。並行處理由現有的 hive.max-split-size
屬性控制。
了解和調整最大連線數¶
Presto 可以使用其原生 S3 檔案系統或 EMRFS。使用原生 FS 時,最大連線數會透過 hive.s3.max-connections
組態屬性設定。使用 EMRFS 時,最大連線數會透過 fs.s3.maxConnections
Hadoop 組態屬性設定。
當存取 Amazon S3 進行述詞運算時,S3 Select Pushdown 會繞過檔案系統。在這種情況下,hive.s3select-pushdown.max-connections
的值決定了 worker 節點允許用於這些操作的最大用戶端連線數。
如果您的工作負載遇到錯誤「Timeout waiting for connection from pool」(等候集區連線逾時),請增加 hive.s3select-pushdown.max-connections
的值,以及您正在使用的檔案系統的最大連線設定。
Alluxio 設定¶
Presto 可以讀取和寫入儲存在 Alluxio 資料協調系統 Alluxio 中的表格,並利用 Alluxio 的分散式區塊級讀/寫快取功能。表格必須在 Hive Metastore 中建立,並使用 alluxio://
位置前綴(詳細資訊和範例請參閱在 Alluxio 上執行 Apache Hive)。然後,Presto 查詢將會透明地從各種不同的儲存系統(包括 HDFS 和 S3)中擷取和快取檔案或物件。
Alluxio 用戶端設定¶
若要在 Presto 上設定 Alluxio 用戶端屬性,請將 Alluxio 設定目錄 (${ALLUXIO_HOME}/conf
) 附加到 Presto JVM 類別路徑,以便可以將 Alluxio 屬性檔案 alluxio-site.properties
作為資源載入。更新 Presto JVM 設定 檔案 etc/jvm.config
以包含以下內容
-Xbootclasspath/a:<path-to-alluxio-conf>
這種方法的優點是,所有 Alluxio 屬性都設定在單一的 alluxio-site.properties
檔案中。詳細資訊請參閱自訂 Alluxio 使用者屬性。
或者,將 Alluxio 設定屬性新增至 Hadoop 設定檔案 (core-site.xml
、hdfs-site.xml
),並將 Hive 連接器設定為透過 hive.config.resources
連接器屬性使用Hadoop 設定檔案。
使用 Presto 部署 Alluxio¶
為了在使用 Alluxio 上執行 Presto 時達到最佳效能,建議將 Presto worker 與 Alluxio worker 並置。這樣可讓讀取和寫入繞過網路。有關詳細資訊,請參閱 在 Alluxio 上執行 Presto 的效能調整秘訣。
Alluxio 目錄服務¶
Presto 與 Alluxio 互動的另一種方式是透過 Alluxio 目錄服務。使用 Alluxio 目錄服務的主要優點是簡化了 Alluxio 與 Presto 的部署,並啟用了架構感知最佳化,例如透明快取和轉換。目前,目錄服務支援唯讀工作負載。
Alluxio 目錄服務是一個 Metastore,可以快取來自不同基礎 Metastore 的資訊。目前它支援 Hive Metastore 作為基礎 Metastore。為了讓 Alluxio 目錄管理其他現有 Metastore 的中繼資料,必須將其他 Metastore「附加」到 Alluxio 目錄。若要將現有的 Hive Metastore 附加到 Alluxio 目錄,只需使用 Alluxio CLI attachdb 命令。需要提供適當的 Hive Metastore 位置和 Hive 資料庫名稱。
./bin/alluxio table attachdb hive thrift://HOSTNAME:9083 hive_db_name
附加 Metastore 後,Alluxio 目錄即可管理資訊並將其提供給 Presto。若要為 Alluxio 目錄服務設定 Hive 連接器,只需將連接器設定為使用 Alluxio Metastore 類型,並提供 Alluxio 叢集的位置。例如,您的 etc/catalog/catalog_alluxio.properties
將包含以下內容(將 Alluxio 位址取代為適當的位置)
connector.name=hive-hadoop2
hive.metastore=alluxio
hive.metastore.alluxio.master.address=HOSTNAME:PORT
現在,Presto 查詢可以利用 Alluxio 目錄服務,例如透明快取和透明轉換,而無需修改現有的 Hive Metastore 部署。
表格統計資料¶
Hive 連接器會在 INSERT
和 CREATE TABLE AS
操作時自動收集基本統計資料 (numFiles'、 ``numRows
、rawDataSize
、totalSize
)。
Hive 連接器還可以收集欄位層級的統計資料
欄位類型 |
可收集的統計資料 |
---|---|
|
null 的數量、相異值的數量、最小值/最大值 |
|
null 的數量、相異值的數量、最小值/最大值 |
|
null 的數量、相異值的數量、最小值/最大值 |
|
null 的數量、相異值的數量、最小值/最大值 |
|
null 的數量、相異值的數量、最小值/最大值 |
|
null 的數量、相異值的數量、最小值/最大值 |
|
null 的數量、相異值的數量、最小值/最大值 |
|
null 的數量、相異值的數量、最小值/最大值 |
|
null 的數量、相異值的數量、最小值/最大值 |
|
null 的數量、相異值的數量 |
|
null 的數量、相異值的數量 |
|
null 的數量 |
|
null 的數量、true/false 值的數量 |
在寫入時自動收集欄位層級統計資料由 collect_column_statistics_on_write
目錄會期屬性控制。
收集表格和欄位統計資料¶
Hive 連接器支援透過 ANALYZE 陳述式收集表格和分割區統計資料。當分析分割區表格時,可以透過選用的 partitions
屬性指定要分析的分割區,該屬性是一個陣列,其中包含分割區鍵的值,其順序與表格架構中宣告的順序相同
ANALYZE hive.sales WITH (
partitions = ARRAY[
ARRAY['partition1_value1', 'partition1_value2'],
ARRAY['partition2_value1', 'partition2_value2']]);
此查詢將會收集具有下列鍵的 2 個分割區的統計資料
partition1_value1、 partition1_value2
partition2_value1、 partition2_value2
快速統計資料¶
Hive 連接器可以藉由檢查檔案或表格中繼資料,為缺少統計資料的分割區建立基本統計資料。例如,Parquet 頁尾可用於推斷列計數、null 數量和最小值/最大值。這些「快速」統計資料有助於查詢規劃,並且作為尚未對其執行 ANALYZE 的分割區的暫時統計資料來源。
可以使用以下屬性來控制這些快速統計資料的建立方式
屬性名稱 |
描述 |
預設值 |
---|---|---|
|
透過快速統計資料提供者啟用統計資料收集。也可以透過 |
|
|
會同時為多個分割區建立快速統計資料。此屬性會設定可以進行的最大並行建置數。 |
100 |
|
啟動分割區快速統計資料建置的查詢應在逾時並傳回空統計資料之前等待的時間長度。如果您希望快速統計資料僅在背景中建立,而不阻止查詢規劃,請將此設定為 |
|
|
如果查詢觀察到另一個查詢正在為分割區建立快速統計資料,則這是它等待建立這些統計資料的時間長度,然後才傳回空統計資料。如果您希望只有一個查詢等待快速統計資料建立(針對給定分割區),請將此設定為 |
|
|
在快速統計資料記憶體內快取中保留統計資料的時間長度。 |
|
|
如果分割區的快速統計資料建置停滯(例如,由於長時間執行的 IO 作業),reaper 工作會終止任何背景建置執行緒,以便可以重新觸發新的提取。此屬性控制啟動背景建置執行緒後,reaper 執行終止的時間長度。 |
|
|
會同時讀取和處理多個 Parquet 檔案頁尾。此屬性會設定可以進行的最大並行呼叫數。 |
500 |
|
Parquet 快速統計資料建立工具將失敗並傳回空統計資料的時間長度。 |
|
架構演進¶
Hive 允許表格中的分割區具有與表格不同的架構。當表格的欄位類型在已存在分割區(使用原始欄位類型)之後變更時,就會發生這種情況。Hive 連接器透過允許與 Hive 相同的轉換來支援此功能
varchar
與tinyint
、smallint
、integer
和bigint
之間互相轉換real
轉換為double
整數的擴展轉換,例如
tinyint
轉換為smallint
除了上述轉換之外,Hive 連接器在處理 Parquet 檔案格式時也支援以下轉換
integer
轉換為bigint
、real
和double
bigint
轉換為real
和double
任何轉換失敗都會導致 null,這與 Hive 的行為相同。例如,將字串 'foo'
轉換為數字,或將字串 '1234'
轉換為 tinyint
(其最大值為 127
)。
Avro 架構演進¶
Presto 支援查詢和操作具有 Avro 儲存格式的 Hive 表格,該格式的架構是根據 Avro 架構檔案/常值設定的。也可以在 Presto 中建立表格,該表格會從本機或遠端 HDFS/Web 伺服器中有效的 Avro 架構檔案推斷架構。
若要指定使用 Avro 綱要來解析表格的資料,必須使用 avro_schema_url
表格屬性。綱要可以放置在遠端的 HDFS (例如 avro_schema_url = 'hdfs://user/avro/schema/avro_data.avsc'
)、S3 (例如 avro_schema_url = 's3n:///schema_bucket/schema/avro_data.avsc'
)、網頁伺服器 (例如 avro_schema_url = 'http://example.org/schema/avro_data.avsc'
),以及本機檔案系統。這個綱要所在的 URL 必須可以從 Hive metastore 和 Presto 協調器/工作節點存取。
使用 avro_schema_url
在 Presto 中建立的表格,其行為與設定了 avro.schema.url
或 avro.schema.literal
的 Hive 表格相同。
範例
CREATE TABLE hive.avro.avro_data (
id bigint
)
WITH (
format = 'AVRO',
avro_schema_url = '/usr/local/avro_data.avsc'
)
如果指定了 avro_schema_url
,則 DDL 中列出的欄位(以上範例中的 id
)將會被忽略。表格綱要將與 Avro 綱要檔案中的綱要相符。在任何讀取操作之前,都會存取 Avro 綱要,因此查詢結果會反映綱要中的任何變更。因此,Presto 利用了 Avro 的向後相容能力。
如果表格的綱要在 Avro 綱要檔案中變更,仍然可以使用新的綱要來讀取舊資料。新加入或重新命名的欄位必須在 Avro 綱要檔案中具有預設值。
綱要演進的行為如下:
在新綱要中加入的欄位:使用舊綱要建立的資料,當表格使用新綱要時,將會產生一個預設值。
在新綱要中移除的欄位:使用舊綱要建立的資料,將不再輸出已移除的欄位中的資料。
在新綱要中重新命名的欄位:這相當於移除該欄位並加入一個新的欄位,而當表格使用新綱要時,使用舊綱要建立的資料將會產生一個預設值。
在新綱要中變更欄位的類型:如果 Avro 或 Hive 連接器支援類型強制轉換,則會發生轉換。對於不相容的類型,則會拋出錯誤。
限制¶
當設定了 avro_schema_url
時,不支援下列操作:
不支援
CREATE TABLE AS
。在
CREATE TABLE
中不支援使用分割(partitioned_by
) 或分桶(bucketed_by
) 欄位。不支援修改欄位的
ALTER TABLE
命令。
Parquet 寫入器版本¶
Presto 現在支援 Hive 目錄的 Parquet 寫入器版本 V1 和 V2。可以使用工作階段屬性 parquet_writer_version
和設定屬性 hive.parquet.writer.version
來切換。這些屬性的有效值為 PARQUET_1_0
和 PARQUET_2_0
。預設值為 PARQUET_1_0
。
程序¶
使用 CALL 陳述式來執行資料操作或管理任務。如果您的 Hive 目錄名為 web
,則程序必須包含完整的目錄名稱
CALL web.system.example_procedure()
下列程序可用:
system.create_empty_partition(schema_name, table_name, partition_columns, partition_values)
在指定的表格中建立一個空的分割區。
system.sync_partition_metadata(schema_name, table_name, mode, case_sensitive)
檢查並更新 metastore 中的分割區清單。有三種模式可用:
ADD
:加入檔案系統上存在但 metastore 中沒有的任何分割區。DROP
:刪除 metastore 中存在但檔案系統上沒有的任何分割區。FULL
:同時執行ADD
和DROP
。
case_sensitive
參數是可選的。預設值為true
,以便與 Hive 的MSCK REPAIR TABLE
行為相容,該行為預期檔案系統路徑中的分割區欄位名稱使用小寫(例如,col_x=SomeValue
)。除非將參數設定為false
,否則將忽略檔案系統上不符合此慣例的分割區。system.invalidate_directory_list_cache()
清除完整目錄清單快取。
system.invalidate_directory_list_cache(directory_path)
使指定 directory_path 的目錄清單快取失效。
額外的隱藏欄位¶
Hive 連接器會在 Hive 表格中公開額外的隱藏中繼資料欄位。在查詢中像查詢表格的其他欄位一樣查詢這些欄位。
$path
:給定資料列的檔案路徑$file_size
:給定資料列的檔案大小 (int64_t)$file_modified_time
:給定資料列的最後檔案修改時間 (int64_t),自 1970 年 1 月 1 日 UTC 以來的毫秒數
如何使 metastore 快取失效?¶
Hive 連接器會透過 JMX (com.facebook.presto.hive.metastore.CachingHiveMetastore#flushCache
) 公開一個程序,以使 metastore 快取失效。您可以透過 jconsole 或 jmxterm 連線呼叫此程序,以使 metastore 快取失效。
當 Hive metastore 在 Presto 外部更新,而您希望立即讓 Presto 看見這些變更時,這會很有用。
目前,此程序會清除所有綱要中所有表格的快取。這是一個已知的限制,未來將會加強。
如何使目錄清單快取失效?¶
Hive 連接器會透過 JMX (com.facebook.presto.hive.HiveDirectoryLister#flushCache
) 公開一個程序,以使目錄清單快取失效。您可以透過 jconsole 或 jmxterm 連線呼叫此程序,以使目錄清單快取失效。
當在快取目錄路徑中加入或刪除檔案,而您希望立即讓 Presto 看見這些變更時,這會很有用。
目前,此程序會清除所有快取項目。這是一個已知的限制,未來將會加強。
範例¶
Hive 連接器支援查詢和操作 Hive 表格和綱要(資料庫)。雖然某些不常見的操作需要直接使用 Hive 執行,但大多數操作可以使用 Presto 執行。
建立綱要¶
建立一個名為 web
的新 Hive 綱要,它會將表格儲存在名為 my-bucket
的 S3 儲存貯體中
CREATE SCHEMA hive.web
WITH (location = 's3://my-bucket/')
建立受管理的表格¶
在 web
綱要中建立一個名為 page_views
的新 Hive 表格,該表格使用 ORC 檔案格式儲存,並依日期和國家/地區進行分割,並依使用者分桶到 50
個儲存區中(請注意,Hive 要求分割區欄位必須是表格中的最後一欄)
CREATE TABLE hive.web.page_views (
view_time timestamp,
user_id bigint,
page_url varchar,
ds date,
country varchar
)
WITH (
format = 'ORC',
partitioned_by = ARRAY['ds', 'country'],
bucketed_by = ARRAY['user_id'],
bucket_count = 50
)
刪除分割區¶
從 page_views
表格中刪除一個分割區
DELETE FROM hive.web.page_views
WHERE ds = DATE '2016-08-09'
AND country = 'US'
加入一個空的分割區¶
將一個空的分割區加入到 page_views
表格中
CALL system.create_empty_partition(
schema_name => 'web',
table_name => 'page_views',
partition_columns => ARRAY['ds', 'country'],
partition_values => ARRAY['2016-08-09', 'US']);
查詢表格¶
查詢 page_views
表格
SELECT * FROM hive.web.page_views
列出分割區¶
列出 page_views
表格的分割區
SELECT * FROM hive.web."page_views$partitions"
建立外部表格¶
建立一個名為 request_logs
的外部 Hive 表格,該表格指向 S3 中現有的資料
CREATE TABLE hive.web.request_logs (
request_time timestamp,
url varchar,
ip varchar,
user_agent varchar
)
WITH (
format = 'TEXTFILE',
external_location = 's3://my-bucket/data/logs/'
)
刪除外部表格¶
刪除外部表格 request_logs
。這只會刪除表格的中繼資料。不會刪除參考的資料目錄
DROP TABLE hive.web.request_logs
刪除綱要¶
刪除綱要
DROP SCHEMA hive.web
Hive 連接器限制¶
只有當 WHERE
子句與整個分割區相符時,才支援 DELETE。