使用Hive連接器可以查詢和分析存儲在Hive數據倉庫中的數據。

背景信息

Hive數倉系統由以下三部分內容組成:
  • 不同格式的數據文件,通常存儲在Hadoop分布式文件系統(HDFS)或對象存儲系統(例如,阿里云OSS)中。
  • 存儲著數據文件到Schema和Table映射的元數據。該元數據存儲在數據庫(例如,MySQL)中,并通過Hive Metastore Service(HMS)訪問。
  • 一種稱為HiveQL的查詢語言。該查詢語言在分布式計算框架(例如,MapReduce或Tez)上執行。
本文為您介紹Hive連接器相關的內容和操作,具體如下:

前提條件

已創建DataLake集群或Hadoop集群,并選擇了Presto服務,詳情請參見創建集群。

使用限制

  • 配置Hive連接器需要配置Hive Metastore Service。
  • Hive連接器支持多種分布式存儲系統,包括HDFS、阿里云OSS或OSS的兼容系統,都可以使用Hive連接器查詢。Coordinator節點和所有worker節點必須能夠通過網絡訪問Hive Metastore以及存儲系統。通過Thrift協議訪問Hive Metastore的默認端口是9083。

修改Hive連接器配置

修改Hive連接器配置,詳情請參見配置連接器。

連接器默認配置

進入EMR控制臺的Presto服務的配置頁面,在服務配置區域,單擊hive.properties頁簽。您可以看到以下參數,參數值請根據您實際情況修改。
參數 描述
hive.recursive-directories 允許從表或分區所在位置的子目錄讀取數據,類似Hive的hive.mapred.supports.subdirectories屬性。
hive.metastore.uri Hive Metastore使用Thrift協議連接的URI。

默認值格式thrift://<主節點名稱>.cluster-24****:9083。

hive.config.resources HDFS配置文件的列表,多個配置文件時以逗號(,)分隔。這些配置文件必須存在于Presto運行的所有主機上。
注意 僅在必須訪問HDFS的情況下配置此項。
hive.delta-table-enabled 是否支持Presto讀取Delta Lake表。取值如下:
  • true(默認值):Presto可以讀取Delta Lake表。
  • false:Presto不可以讀取Delta Lake表。
hive.delta-compatible-mode-enabled Delta Lake表是否啟用兼容模式。取值如下:
  • true(默認值):Delta Lake表啟用兼容模式。
  • false:Delta Lake表不啟用兼容模式。
hive.hdfs.impersonation.enabled 是否啟用用戶代理。取值如下:
  • true:啟用用戶代理。
  • false(默認值):不啟用用戶代理。

多個Hive集群配置

如果您有多個Hive集群,可以在etc/catalog路徑下增加相應數量的Catalog文件,確保文件后綴名為.properties。

例如,如果屬性文件名為sales.properties,則Presto將使用其中配置的連接器創建一個叫sales的Catalog。

HDFS配置

通常情況下,Presto會自動配置HDFS客戶端,不需要任何配置文件。在某些情況下,例如啟用聯合HDFS或NameNode高可用時,需要額外指定HDFS客戶端選項才能訪問HDFS集群,此時需要添加hive.config.resources屬性以引用所需的HDFS配置文件。
注意
  • 僅在需要配置時,才需要額外指定配置文件。建議減少配置文件以包含所需的最少屬性集,防止屬性間不兼容。
  • 配置文件必須存在于Presto運行的所有主機上。如果要引用現有的Hadoop配置文件,請確保將其拷貝到任何未運行Hadoop的Presto節點上。

HDFS用戶名與權限

在Presto中為Hive表運行任何CREATE TABLECREATE TABLE AS語句之前,都需要檢查Presto用于訪問HDFS的用戶是否有權訪問Hive的倉庫目錄。 Hive倉庫目錄由hive-site.xml中的配置變量hive.metastore.warehouse.dir指定,默認值為/user/hive/warehouse。

支持的文件類型

Hive連接器支持下列文件類型。
文件類型 備注
ORC
Parquet
Avro
RCText 使用ColumnarSerDe的RCFile。
RCBinary 使用LazyBinaryColumnarSerDe的RCFile。
SequenceFile
JSON 使用org.apache.hive.hcatalog.data.JsonSerDe。
CSV 使用org.apache.hadoop.hive.serde2.OpenCSVSerde。
TextFile

支持的表類型

Hive連接器支持下列表類型。
表類型 描述
ACID表 在連接3.x版本的Hive Metastore時,Hive連接器支持insert-only和ACID表的讀寫,且完全支持分區和分桶。

對ACID表支持行級的DELETE與UPDATE,不支持分區鍵列和桶列的UPDATE,不支持使用Hive Streaming Ingest創建的ACID表,詳情Streaming Data Ingest。

物化視圖 Hive連接器支持從Hive的物化視圖中讀取數據。在Presto中,這些視圖將以常規的、只讀表的形式展示。

Hive視圖

Hive視圖由HiveQL定義,存儲在Hive Metastore Service中。

Hive連接器包含以下三種不同模式的Hive視圖。
模式 描述
Disabled 視圖中編碼的業務邏輯和數據在Presto中是不可見的。

默認行為是忽略Hive視圖。

Legacy Hive視圖的簡單實現,可以讀取Presto中的數據。

可以通過配置hive.translate-hive-views=truehive.legacy-hive-view-translation=true啟用此模式。

如果想為特定的Catalog臨時啟用此傳統訪問方式,可以將Catalog Session屬性legacy_hive_view_translation設置為true。

由于HiveQL與SQL非常相似,因此Legacy方式可以通過SQL語言解釋任何定義了視圖的HiveQL查詢,不做任何轉換。

此方式適用于簡單的Hive視圖,但可能會導致復雜的查詢出現問題。例如,如果HiveQL函數具有與SQL相同的簽名,但具有不同行為,則返回的結果可能會有所不同。在更極端的情況下,查詢可能會失敗,甚至無法解析和執行。

Experimental 可以分析、處理與重寫Hive視圖,包括其包含的表達式和語句。

可以通過配置hive.translate-hive-views=true啟用此模式。

使用此模式時,暫不支持以下功能:
  • HiveQL的current_date、current_timestamp,及其它若干類似的語句。
  • translate()、窗口函數以及其他若干類似的Hive函數調用。
  • 公用表表達式和簡單的Case表達式。
  • 設置時間戳精度。
  • 將全部Hive數據類型正確映射到Presto類型。
  • 處理自定義UDF的能力。

配置屬性

Hive配置屬性

Hive連接器支持使用Jindo Table加速。EMR集群中內置了兩個Hive連接器,分別為hive.propertieshive-acc.properties。hive-acc.properties內置了JindoTable Native Engine,對ORC或Parquet格式的文件進行加速優化,請根據您SmartData的版本查看相應的文檔,詳情請參見開啟native查詢加速。

下表列出了Hive連接器的各項配置屬性。
屬性名 描述
hive.config.resources HDFS配置文件的列表,多個文件時以逗號(,)分隔。這些文件必須存在于Presto運行的所有主機上。
說明 僅在必須訪問HDFS的情況下配置該屬性。
hive.recursive-directories 允許從表或分區所在位置的子目錄讀取數據,類似Hive的hive.mapred.supports.subdirectories屬性。
hive.ignore-absent-partitions 當文件系統位置不存在時,忽略該分區而不是報查詢失敗,但也有可能會跳過原本可能屬于表的一部分數據。

默認值為false。

hive.storage-format 建表時的默認文件格式。

默認值為ORC。

hive.compression-codec 寫文件時使用的文件編碼方式。取值可以為NONE、SNAPPY、LZ4、ZSTD或GZIP。

默認值為GZIP。

hive.force-local-scheduling 強制將分片規劃到與處理該分片數據的Hadoop DataNode服務相同的節點上。此配置方式對于Presto與每個DataNode并置的安裝很有用,可以提升并置安裝的效率。

默認值為false。

hive.respect-table-format 新分區應使用現有的表格式還是Presto的格式。取值如下:
  • true(默認值):使用現有的表格式。
  • false:使用Presto的格式。
hive.immutable-partitions 新數據能否插入到現存的分區中。

設置為true時,hive.insert-existing-partitions-behavior將不允許設置為APPEND。

默認值為false。

hive.insert-existing-partitions-behavior 數據插入現有分區時的行為。取值如下:
  • APPEND(默認值):在現有分區追加數據。
  • OVERWRITE:覆蓋現有分區。
  • ERROR:不允許修改現有分區。
hive.create-empty-bucket-files 是否應為沒有數據存儲的桶創建空文件。取值如下:
  • true:創建空文件。
  • false(默認值):不創建空文件。
hive.max-partitions-per-writers 每個writer的最大分區數。

默認值為100。

hive.max-partitions-per-scan 一次表掃描的最大分區數。

默認值為100,000。

hive.hdfs.authentication.type HDFS身份驗證類型。取值如下:
  • NONE(默認值):表示普通模式,不進行Kerberos認證。
  • KERBEROS:表示使用安全模式,進行Kerberos認證。
hive.hdfs.impersonation.enabled 是否啟用HDFS端用戶模擬。取值如下:
  • true:啟用HDFS端用戶模擬。
  • false(默認值):不啟用HDFS端用戶模擬。
hive.hdfs.trino.principal Presto連接HDFS時使用的Kerberos主體。
hive.hdfs.trino.keytab HDFS客戶端密鑰文件的位置。
hive.dfs.replication HDFS副本因子。
hive.security 默認值為legacy。詳情請參見Hive connector security configuration。
security.config-file 當設置hive.security=file時使用的配置文件路徑。
hive.non-managed-table-writes-enabled 啟用對非托管(外部)Hive表的寫入。

默認值為false。

hive.non-managed-table-creates-enabled 啟用對非托管(外部)Hive表的創建。

默認值為true。

hive.collect-column-statistics-on-write 啟用在寫入時以列為單位自動收集統計信息。詳情請參見配置屬性。

默認值為true。

hive.file-status-cache-tables 特定表的緩存路徑列表。

例如,fruit.apple,fruit.orange表示僅緩存Schema fruit中的apple和orange表。fruit.*,vegetable.*表示緩存Schema fruit和vegetable中的所有表。*表示緩存所有Schema中的所有表。

hive.file-status-cache-size 緩存文件狀態條目的最大總數。

默認值為1000000。

hive.file-status-cache-expire-time 緩存路徑列表的有效時間。

默認值為1m。

hive.rcfile.time-zone 將時間戳的二進制編碼值調整到指定時區。

默認值為JVM default。

說明 Hive 3.1及后續版本,需要將此值設為UTC。
hive.timestamp-precision 指定Timestamp類型Hive列的精度。取值如下:
  • MILLISECONDS:毫秒。
  • MICROSECONDS:微秒。
  • NANOSECONDS:納秒。

默認值為MILLISECONDS。

說明 精度高于配置的值時將會四舍五入。
hive.temporary-staging-directory-enabled 控制是否將在hive.temporary-staging-directory-path中配置的臨時模擬目錄用于寫入操作。 臨時模擬目錄不會用于寫入OSS、加密HDFS或外部位置的無序表。寫入排序表時會在排序操作期間使用此路徑暫存臨時文件。設置為禁用時,目標存儲將用于在寫入排序表時進行暫存,此方式在寫入對象存儲時效率低下。

默認值為true。

hive.temporary-staging-directory-path 控制用于寫操作的臨時暫存目錄的位置。
默認值為/tmp/presto-${USER}
說明 ${USER}占位符可用于讓每個用戶使用不同的位置。
hive.translate-hive-views 啟用Hive視圖的變換操作。

默認值為false。

hive.legacy-hive-view-translation 使用傳統算法轉換Hive視圖??梢詫?code class="ph codeph" id="codeph-jbs-1hc-0pu">legacy_hive_view_translation catalog session 屬性用于特定的Catalog。

默認值為false。

hive.parallel-partitioned-bucketed-writes 提高分區表和分桶表寫入的并行性。

默認值為true。

說明 禁用時,寫入線程的數量將僅限于存儲桶的數量。

ORC格式配置屬性

以下屬性用于配置由Hive連接器執行ORC文件的讀寫操作。
屬性名 描述
hive.orc.time-zone 為未聲明時區的舊版ORC文件設置默認時區。

默認值為JVM default。

hive.orc.use-columns-names 按名稱訪問ORC列。

默認情況下,ORC文件中的列按它們在Hive表定義中的順序位置進行訪問。catalog session屬性和orc_use_column_names功能一樣。

默認值為false。

Parquet格式配置屬性

以下屬性用于配置由Hive連接器執行Parquet文件的讀寫操作。
屬性名 描述
hive.parquet.time-zone 將Timestamp的值調整到指定時區。

默認值為JVM default。

說明 Hive 3.1及后續版本,需要將此值設為UTC。
hive.parquet.use-columns-names 訪問Parquet列的方式。取值如下:
  • true(默認值):按名稱訪問Parquet列,無需保持列名順序與文件一致。
  • false:按列在Hive表定義中的順序位置訪問Parquet列。
catalog session屬性和parquet_use_column_names功能一樣。

Metastore配置屬性

Hive metastore可以使用下列屬性進行配置,使用特定的屬性可以進一步配置Thrift,詳情請參見Thrift Metastore配置屬性。
屬性名 描述
hive.metastore Hive Metastore使用的類型。Presto支持默認的Hive Thrift metastore(thrift)及其衍生產品。

默認值為thrift。

hive.metastore-cache-ttl Hive Metastore緩存的Metastore數據被視為可用的持續時間。

默認值為0s。

hive.metastore-cache-maximum-size Hive Metastore緩存的Metastore數據對象的最大個數。

默認值為10000。

hive.metastore-refresh-interval 訪問后異步刷新緩存的Metastore數據。如果緩存的數據是尚未過期的舊數據,則允許后續訪問查看新數據。
hive.metastore-refresh-max-threads 刷新Metastore數據緩存的最大線程數。

默認值為10。

hive.metastore-timeout Hive Metastore請求的超時時間。

默認值為10s。

Thrift Metastore配置屬性

下表介紹了Hive連接器的Thrift Metastore配置屬性。
屬性名 描述
hive.metastore.uri Hive Metastore使用Thrift協議連接的URI。

如果提供了多個URI,則會默認使用第一個,其余的當作備用Metastore。此屬性是必填項。示例:thrift://192.0.**.**:9083thrift://192.0.**.**:9083,thrift://192.0.**.**:9083

hive.metastore.username Presto用于訪問Hive Metastore的用戶名。
hive.metastore.authentication.type Hive Metastore身份驗證的方式類型。取值如下:
  • NONE(默認值):表示普通模式,不進行Kerberos認證。
  • KERBEROS:表示使用安全模式,進行Kerberos認證。
hive.metastore.thrift.impersonation.enabled 啟用Hive Metastore端用戶模擬。
hive.metastore.thrift.delegation-token.cache-ttl Metastore Delegation Token緩存的有效期限。

默認值為1h。

hive.metastore.thrift.delegation-token.cache-maximum-size Delegation Token緩存的最大值。

默認值為1000。

hive.metastore.thrift.client.ssl.enabled 連接到Metastore時是否啟用SSL。取值如下:
  • true:連接到Metastore時使用SSL。
  • false(默認值):連接到Metastore時不啟用SSL。
hive.metastore.thrift.client.ssl.key 私鑰和客戶端證書(keyStore)的路徑。
hive.metastore.thrift.client.ssl.key-password 私鑰的密碼。
hive.metastore.thrift.client.ssl.trust-certificate 服務器證書鏈(trustStore)的路徑。
說明 啟用SSL時必填。
hive.metastore.thrift.client.ssl.trust-certificate-password 服務器證書鏈的密碼。
hive.metastore.service.principal Hive Metastore服務的Kerberos規則。
hive.metastore.client.principal Presto連接Hive Metastore服務時使用的Kerberos規則。
hive.metastore.client.keytab Hive Metastore客戶端keytab文件的位置。

性能調優配置屬性

下表介紹了Hive連接器的性能調優配置屬性。
注意 更改下表屬性的默認值可能會導致不穩定和性能下降,請謹慎操作。
屬性名 描述
hive.max-outstanding-splits 在Scheduler嘗試暫停之前,一次查詢中每個表掃描的緩存split的目標數量。

默認值為1000。

hive.max-splits-per-second 每次表掃描每秒生成的最大split數,可用于減少存儲系統的負載。默認情況下沒有限制,即Presto將最大化數據訪問的并行度。
hive.max-initial-splits 對于每次表掃描,coordinator首先分配大小不超過max-initial-split-size的文件片段。在分配了max-initial-splits個片段之后,剩余split的最大值由max-split-size決定。

默認值為200。

hive.max-initial-split-size 在已分配的片段數不超過max-initial-splits時,分配給worker節點的單個文件片段的大小。較小的split會導致更高的并行度,從而加速小查詢。

默認值為32 MB。

hive.max-split-size 分配給worker節點的單個文件片段的最大值。較小的split會導致更高的并行度,從而可以減少延遲,但也會產生更大的開銷并增加系統負載。

默認值為64 MB。

表統計數據

Hive連接器支持收集和管理表統計數據以改進查詢過程的性能。

寫數據時,Hive連接器默認會收集基礎信息,例如,文件數、行數、原始數據大小和總大小,及下表的列級統計數據。
列類型 可收集信息
TINYINT 空值數量、不同的值數量、最大值或最小值
SMALLINT 空值數量、不同的值數量、最大值或最小值
INTEGER 空值數量、不同的值數量、最大值或最小值
BIGINT 空值數量、不同的值數量、最大值或最小值
DOUBLE 空值數量、不同的值數量、最大值或最小值
REAL 空值數量、不同的值數量、最大值或最小值
DECIMAL 空值數量、不同的值數量、最大值或最小值
DATE 空值數量、不同的值數量、最大值或最小值
TIMESTAMP 空值數量、不同的值數量、最大值或最小值
VARCHAR 空值數量、不同的值數量
CHAR 空值數量、不同的值數量
VARBINARY 空值數量
BOOLEAN 空值數量、true或false值數量