全部產品
Search
文件中心

:Hive連接器

更新時間:Jul 01, 2024

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

背景資訊

Hive數倉系統由以下三部分內容組成:
  • 不同格式的資料檔案,通常儲存在HadoopDistributed File System(HDFS)或Object Storage Service系統(例如,阿里雲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.uriHive Metastore使用Thrift協議串連的URI。

預設值格式thrift://<主節點名稱>.cluster-24****:9083

hive.config.resourcesHDFS設定檔的列表,多個設定檔時以逗號(,)分隔。這些設定檔必須存在於Presto啟動並執行所有主機上。
重要 僅在必須訪問HDFS的情況下配置此項。
hive.delta-table-enabled是否支援Presto讀取Delta Lake表。取值如下:
  • true(預設值):Presto可以讀取Delta Lake表。
  • false:Presto不可以讀取Delta Lake表。
hive.delta-compatible-mode-enabledDelta 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視圖。

LegacyHive視圖的簡單實現,可以讀取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_datecurrent_timestamp,及其它若干類似的語句。
  • translate()、視窗函數以及其他若干類似的Hive函數調用。
  • 通用資料表運算式和簡單的Case運算式。
  • 設定時間戳記精度。
  • 將全部Hive資料類型正確映射到Presto類型。
  • 處理自訂UDF的能力。

配置屬性

Hive配置屬性

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

下表列出了Hive連接器的各項配置屬性。
屬性名稱描述
hive.config.resourcesHDFS設定檔的列表,多個檔案時以逗號(,)分隔。這些檔案必須存在於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.typeHDFS身分識別驗證類型。取值如下:
  • NONE(預設值):表示普通模式,不進行Kerberos認證。
  • KERBEROS:表示使用安全模式,進行Kerberos認證。
hive.hdfs.impersonation.enabled是否啟用HDFS端使用者類比。取值如下:
  • true:啟用HDFS端使用者類比。
  • false(預設值):不啟用HDFS端使用者類比。
hive.hdfs.trino.principalPresto串連HDFS時使用的Kerberos主體。
hive.hdfs.trino.keytabHDFS用戶端密鑰檔案的位置。
hive.dfs.replicationHDFS副本因子。
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或外部位置的無序表。寫入排序表時會在排序操作期間使用此路徑暫存臨時檔案。設定為禁用時,目標儲存將用於在寫入排序表時進行暫存,此方式在寫入Object Storage Service時效率低下。

預設值為true。

hive.temporary-staging-directory-path控制用於寫操作的臨時臨時目錄的位置。
預設值為/tmp/presto-${USER}
說明 ${USER}預留位置可用於讓每個使用者使用不同的位置。
hive.translate-hive-views啟用Hive視圖的變換操作。

預設值為false。

hive.legacy-hive-view-translation使用傳統演算法轉換Hive視圖。可以將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.metastoreHive Metastore使用的類型。Presto支援預設的Hive Thrift metastore(thrift)及其衍生產品。

預設值為thrift。

hive.metastore-cache-ttlHive Metastore緩衝的Metastore資料被視為可用的期間。

預設值為0s。

hive.metastore-cache-maximum-sizeHive Metastore緩衝的Metastore資料對象的最大個數。

預設值為10000。

hive.metastore-refresh-interval訪問後非同步重新整理緩衝的Metastore資料。如果緩衝的資料是尚未到期的舊資料,則允許後續訪問查看新資料。
hive.metastore-refresh-max-threads重新整理Metastore資料緩衝的最大線程數。

預設值為10。

hive.metastore-timeoutHive Metastore請求的逾時時間。

預設值為10s。

Thrift Metastore配置屬性

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

如果提供了多個URI,則會預設使用第一個,其餘的當作備用Metastore。此屬性是必填項。樣本:thrift://192.0.**.**:9083thrift://192.0.**.**:9083,thrift://192.0.**.**:9083

hive.metastore.usernamePresto用於訪問Hive Metastore的使用者名稱。
hive.metastore.authentication.typeHive Metastore身分識別驗證的方式類型。取值如下:
  • NONE(預設值):表示普通模式,不進行Kerberos認證。
  • KERBEROS:表示使用安全模式,進行Kerberos認證。
hive.metastore.thrift.impersonation.enabled啟用Hive Metastore端使用者類比。
hive.metastore.thrift.delegation-token.cache-ttlMetastore Delegation Token緩衝的有效期間限。

預設值為1h。

hive.metastore.thrift.delegation-token.cache-maximum-sizeDelegation 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.principalHive Metastore服務的Kerberos規則。
hive.metastore.client.principalPresto串連Hive Metastore服務時使用的Kerberos規則。
hive.metastore.client.keytabHive 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值數量