Hiveコネクタ¶
概要¶
Hiveコネクタを使用すると、Hiveデータウェアハウスに保存されているデータのクエリを実行できます。Hiveは3つのコンポーネントの組み合わせです。
通常はHadoop分散ファイルシステム(HDFS)またはAmazon S3に保存されている、さまざまな形式のデータファイル。
データファイルがスキーマとテーブルにどのようにマッピングされるかについてのメタデータ。このメタデータは、MySQLなどのデータベースに保存され、Hiveメタストアサービスを介してアクセスされます。
HiveQLと呼ばれるクエリ言語。このクエリ言語は、MapReduceやTezなどの分散コンピューティングフレームワークで実行されます。
Prestoは、データとメタデータの最初の2つのコンポーネントのみを使用します。HiveQLやHiveの実行環境の一部は使用しません。
サポートされているファイルの種類¶
Hiveコネクタでは、次のファイルの種類がサポートされています。
ORC
Parquet
Avro
RCFile
SequenceFile
JSON
テキスト
設定¶
Hiveコネクタは、Apache Hadoop 2.xおよびCloudera CDH 5やHortonworks Data Platform(HDP)などの派生ディストリビューションをサポートしています。
hive-hadoop2
コネクタをhive
カタログとしてマウントするには、次の内容でetc/catalog/hive.properties
を作成します。 example.net:9083
は、HiveメタストアThriftサービスの正しいホストとポートに置き換えてください。
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ユーザー名¶
HDFSでKerberosを使用していない場合、PrestoはPrestoプロセスのOSユーザーを使用してHDFSにアクセスします。たとえば、Prestoがnobody
として実行されている場合、nobody
としてHDFSにアクセスします。hdfs_user
を適切なユーザー名に置き換えて、PrestoのJVM設定でHADOOP_USER_NAME
システムプロパティを設定することにより、このユーザー名をオーバーライドできます。
-DHADOOP_USER_NAME=hdfs_user
Kerberos認証で保護されたHadoopクラスタへのアクセス¶
Kerberos認証は、HDFSとHiveメタストアの両方でサポートされています。ただし、チケットキャッシュによるKerberos認証はまだサポートされていません。
Hiveコネクタのセキュリティに適用されるプロパティは、Hive設定プロパティの表にリストされています。Hiveコネクタのセキュリティオプションの詳細については、Hiveセキュリティ設定セクションを参照してください。
Hive設定プロパティ¶
プロパティ名 |
説明 |
デフォルト |
---|---|---|
|
Thriftプロトコルを使用して接続するHiveメタストアのURI。複数のURIが提供されている場合、デフォルトでは最初のURIが使用され、残りのURIはフォールバックメタストアになります。このプロパティは必須です。例: |
|
|
PrestoがHiveメタストアへのアクセスに使用するユーザー名。 |
|
|
HDFS設定ファイルのオプションのコンマ区切りリスト。これらのファイルは、Prestoを実行しているマシンに存在する必要があります。HDFSにアクセスするために絶対に必要な場合にのみ指定してください。例: |
|
|
新しいテーブルを作成する際に使用されるデフォルトのファイル形式。 |
|
|
ファイルの書き込み時に使用する圧縮コーデック。 |
|
|
分割を、分割データを提供するHadoop DataNodeプロセスのノードと同じノードでスケジュールするように強制します。これは、PrestoがすべてのDataNodeと配置されているインストールに役立ちます。 |
|
|
順序ベースの実行を有効にします。有効にすると、Hiveファイルは分割できなくなり、テーブルの順序付けプロパティがプランオプティマイザに公開されます。 |
|
|
新しいパーティションを既存のテーブル形式で記述するか、デフォルトのPresto形式で記述するか? |
|
|
既存のパーティションに新しいデータを追加できますか? |
|
|
データがないバケットに対して空のファイルを作成する必要がありますか? |
|
|
ライターあたりの最大パーティション数。 |
100 |
|
単一テーブルスキャンに対する最大パーティション数。 |
100,000 |
|
クエリによってスキャンされたデータに基づいて、分割の動的なサイズ変更を有効にします。 |
|
|
Hiveメタストアの認証タイプ。可能な値は |
|
|
HiveメタストアサービスのKerberosプリンシパル。 |
|
|
PrestoがHiveメタストアサービスに接続する際に使用するKerberosプリンシパル。 |
|
|
Hiveメタストアクライアントのkeytabの場所。 |
|
|
HDFS認証タイプ。可能な値は |
|
|
HDFSエンドユーザーのインパーソネーションを有効にします。 |
|
|
PrestoがHDFSに接続する際に使用するKerberosプリンシパル。 |
|
|
HDFSクライアントのkeytabの場所。 |
|
|
Hiveセキュリティ設定を参照してください。 |
|
|
|
|
|
非管理型(外部)Hiveテーブルへの書き込みを有効にします。 |
|
|
非管理型(外部)Hiveテーブルの作成を有効にします。 |
|
|
書き込み時の自動カラムレベル統計収集を有効にします。テーブル統計で詳細を参照してください。 |
|
|
AWS S3 Selectサービスへのクエリプッシュダウンを有効にします。 |
|
|
S3SelectPushdownに対するS3への同時オープン接続の最大数。 |
500 |
|
複数のメタストアインスタンス間のロードバランシングを有効にします。 |
|
|
空のファイルをスキップすることを有効にします。そうでない場合、空のファイルの反復処理中にエラーが発生します。 |
|
|
ディレクトリ一覧キャッシュの最大サイズ(バイト単位)。 |
|
メタストア設定プロパティ¶
必要なHiveメタストアは、多くのプロパティで設定できます。
プロパティ名 |
説明 |
デフォルト |
---|---|---|
|
Hiveメタストアリクエストのタイムアウト。 |
|
|
キャッシュされたメタストアデータが有効と見なされる期間。 |
|
|
Hiveメタストアキャッシュの最大サイズ。 |
10000 |
|
アクセス後に、キャッシュされたメタストアデータがこれよりも古い場合、まだ期限切れでない場合は非同期で更新し、後続のアクセスで新しいデータが表示されるようにします。 |
|
|
キャッシュされたメタストアデータの更新に使用される最大スレッド数。 |
100 |
AWS Glueカタログ設定プロパティ¶
プロパティ名 |
説明 |
---|---|
|
GlueカタログのAWSリージョン。EC2で実行されていない場合、またはカタログが別のリージョンにある場合は必須です。例: |
|
Glueリクエストを、Prestoが実行されているEC2インスタンスと同じリージョンに固定します(デフォルトは |
|
Glueへの同時接続の最大数(デフォルトは |
|
Glueクライアントのエラー再試行の最大回数(デフォルトは |
|
Hive Glueメタストアのデフォルトのウェアハウスディレクトリ。 |
|
Glueカタログへの接続に使用するAWSアクセスキー。 |
|
Glueカタログへの接続に使用するAWSシークレットキー。 |
|
メタデータデータベースが存在するGlueカタログのID。 |
|
Glue APIエンドポイントURL(オプション)。例: |
|
パーティション化されたGlueテーブルのセグメント数。 |
|
Glueからの並列パーティションフェッチのスレッド数。 |
|
Glueカタログに接続するときに想定するIAMロールのARN。 |
Amazon S3設定¶
Hiveコネクタは、S3に保存されているテーブルを読み書きできます。これは、HDFSプレフィックスではなくS3プレフィックスを使用するテーブルまたはデータベースの場所を持つことで実現されます。
Prestoは、独自のS3ファイルシステムをURIプレフィックスs3://
、s3n://
、s3a://
に使用します。
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にファイルをアップロードする際に使用する事前定義されたACL(デフォルトは |
|
クエリを失敗させるのではなく、Glacierオブジェクトを無視します。これにより、テーブルまたはパーティションの一部であると予想されるデータがスキップされます。デフォルトは |
S3クレデンシャル¶
EMRまたはその他の機能を使用してAmazon EC2でPrestoを実行している場合は、IAMロールfor EC2を使用してS3へのアクセスを管理することをお勧めします。これを使用するには、EC2インスタンスに、使用したいS3バケットに保存されているデータへの適切なアクセス権限を付与するIAMロールを割り当てる必要があります。hive.s3.iam-role
でIAMロールを設定して、S3バケットへのアクセスを想定することもできます。これは、hive.s3.aws-access-key
とhive.s3.aws-secret-key
の設定でAWSアクセスキーとシークレットキーを設定するよりもはるかにクリーンで、EC2が追加の作業なしで定期的にクレデンシャルを自動的にローテーションすることもできます。
DefaultAWSCredentialsProviderChainの導入後、IAMロールとIAMクレデンシャルのどちらも設定されていない場合、インスタンスクレデンシャルが使用されます。これはDefaultAWSCredentialsProviderChainの最後の項目だからです。
カスタムS3クレデンシャルプロバイダ¶
カスタムS3認証プロバイダーを設定するには、Hadoop設定プロパティpresto.s3.credentials-provider
を、カスタムAWS認証プロバイダー実装の完全修飾クラス名に設定します。このクラスはAWSCredentialsProviderインターフェースを実装し、java.net.URI
とHadoopのorg.apache.hadoop.conf.Configuration
を引数とする2引数コンストラクタを提供する必要があります。カスタム認証プロバイダーは、STSからの一時的な認証情報(STSSessionCredentialsProvider
を使用)、IAMロールベースの認証情報(STSAssumeRoleSessionCredentialsProvider
を使用)、または特定のユースケース(例:バケット/ユーザー固有の認証情報)の認証情報を提供するために使用できます。このHadoop設定プロパティは、hive.config.resources
Hiveコネクタープロパティで参照されるHadoop設定ファイルに設定する必要があります。
AWSセキュリティマッピング¶
Prestoは、AWS Lake FormationとAWS S3 API呼び出しに対して柔軟なマッピングをサポートしており、特定のユーザーに対して個別の認証情報またはIAMロールを使用できます。
マッピングには、S3
またはLAKEFORMATION
の2つのタイプがあります。
マッピングエントリは、設定ファイルに記載されている順序で処理されます。より具体的なマッピングは、あまり具体的でないマッピングの前に指定する必要があります。リストの最後のエントリに一致基準を含めないことで、デフォルト設定を設定できます。
マッピングタイプがS3
の場合、各マッピングエントリは1つの一致基準を指定できます。使用可能な一致基準
user
:ユーザー名と照合する正規表現。例:alice|bob
マッピングは1つ以上の設定を提供する必要があります。
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
の場合、各マッピングエントリは1つの一致基準を指定できます。使用可能な一致基準
user
:ユーザー名と照合する正規表現。例:alice|bob
マッピングは1つの設定を提供する必要があります。
iamRole
:使用するIAMロール。これは、グローバルに設定されたIAMロールをオーバーライドします。
lakeformationの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インフラストラクチャの外部で管理されます。データはS3インフラストラクチャではなく、Prestoによって暗号化および復号化されます。この場合、暗号化キーは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を使用することがワークロードに適しているかどうかを確認するために、S3 Selectを使用する場合と使用しない場合のワークロードのベンチマークテストを行うことをお勧めします。デフォルトでは、S3SelectPushdownは無効になっており、適切なベンチマークテストとコスト分析を行った後に本番環境で有効にする必要があります。S3 Selectリクエストコストの詳細については、Amazon S3クラウドストレージの価格を参照してください。
S3 Selectがワークロードに適しているかどうかを判断するためのガイドラインを次に示します。
クエリは、元のデータセットの半分以上をフィルタリングします。
クエリのフィルタ述語は、PrestoとS3 Selectでサポートされているデータ型を持つ列を使用します。
TIMESTAMP
、REAL
、およびDOUBLE
データ型は、S3 Select Pushdownではサポートされていません。数値データには10進データ型を使用することをお勧めします。S3 Selectでサポートされているデータ型の詳細については、データ型に関するドキュメントを参照してください。Amazon S3とAmazon EMRクラスタ間のネットワーク接続は、転送速度と利用可能な帯域幅が良好です。Amazon S3 SelectはHTTPレスポンスを圧縮しないため、圧縮された入力ファイルの場合、レスポンスサイズが増加する可能性があります。
考慮事項と制限事項¶
CSV形式で保存されたオブジェクトのみがサポートされています。オブジェクトは圧縮されていないか、gzipまたはbzip2で圧縮することができます。
「AllowQuotedRecordDelimiters」プロパティはサポートされていません。このプロパティを指定すると、クエリは失敗します。
顧客が提供する暗号化キーを使用したAmazon S3サーバーサイド暗号化(SSE-C)とクライアントサイド暗号化はサポートされていません。
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設定プロパティで設定されます。
S3 Select Pushdown は、述語演算で Amazon S3 にアクセスする際にファイルシステムをバイパスします。この場合、hive.s3select-pushdown.max-connections
の値は、ワーカーノードからこれらの操作に対して許可されるクライアント接続の最大数を決定します。
ワークロードで *接続プールの接続待ち時間切れ* エラーが発生する場合は、hive.s3select-pushdown.max-connections
の値と、使用しているファイルシステムの最大接続数の設定の両方を増やしてください。
Alluxio の設定¶
Presto は、Alluxio の分散ブロックレベルの読み書きキャッシング機能を活用して、Alluxio データオーケストレーションシステム Alluxio に保存されたテーブルを読み書きできます。テーブルは、alluxio://
ロケーションプレフィックスを使用して Hive メタストアに作成する必要があります(詳細と例については、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.config.resources
コネクタプロパティを介して Hadoop 設定ファイル Hadoop 設定ファイル を使用するように Hive コネクタを設定します。
Presto を使用した Alluxio のデプロイ¶
Alluxio 上で Presto を実行する際の最適なパフォーマンスを得るには、Presto ワーカーと Alluxio ワーカーを同じ場所に配置することをお勧めします。これにより、ネットワークをバイパスした読み書きが可能になります。詳細については、Alluxio を使用した Presto のパフォーマンス調整に関するヒント を参照してください。
Alluxio カタログサービス¶
Presto が Alluxio とやり取りするもう1つの方法は、Alluxio カタログサービス を介することです。Alluxio カタログサービスを使用する主な利点は、Presto を使用した Alluxio のデプロイが簡素化され、透過的なキャッシングや変換などのスキーマ認識最適化が可能になることです。現在、カタログサービスは読み取り専用のワークロードをサポートしています。
Alluxio カタログサービスは、さまざまな基盤となるメタストアからの情報をキャッシュできるメタストアです。現在、基盤となるメタストアとして Hive メタストアをサポートしています。Alluxio カタログに他の既存のメタストアのメタデータを管理させるには、他のメタストアを Alluxio カタログに「接続」する必要があります。既存の Hive メタストアを Alluxio カタログに接続するには、Alluxio CLI attachdb コマンド を使用します。適切な Hive メタストアの場所と Hive データベース名を指定する必要があります。
./bin/alluxio table attachdb hive thrift://HOSTNAME:9083 hive_db_name
メタストアが接続されると、Alluxio カタログは情報を管理して Presto に提供できます。Alluxio カタログサービス用の Hive コネクタを設定するには、Alluxio メタストアタイプを使用するようにコネクタを設定し、Alluxio クラスタへの場所を指定します。たとえば、etc/catalog/catalog_alluxio.properties
には以下が含まれます(Alluxio アドレスを適切な場所に置き換えてください)。
connector.name=hive-hadoop2
hive.metastore=alluxio
hive.metastore.alluxio.master.address=HOSTNAME:PORT
これで、Presto クエリは、既存の Hive メタストアのデプロイを変更することなく、透過的なキャッシングや透過的な変換などの Alluxio カタログサービスを利用できます。
テーブル統計¶
Hive コネクタは、INSERT
および CREATE TABLE AS
操作で基本統計(numFiles
、numRows
、rawDataSize
、totalSize
)を自動的に収集します。
Hive コネクタは、列レベルの統計も収集できます。
列タイプ |
収集可能な統計 |
---|---|
|
NULL の数、異なる値の数、最小値/最大値 |
|
NULL の数、異なる値の数、最小値/最大値 |
|
NULL の数、異なる値の数、最小値/最大値 |
|
NULL の数、異なる値の数、最小値/最大値 |
|
NULL の数、異なる値の数、最小値/最大値 |
|
NULL の数、異なる値の数、最小値/最大値 |
|
NULL の数、異なる値の数、最小値/最大値 |
|
NULL の数、異なる値の数、最小値/最大値 |
|
NULL の数、異なる値の数、最小値/最大値 |
|
NULL の数、異なる値の数 |
|
NULL の数、異なる値の数 |
|
NULL の数 |
|
NULL の数、真/偽の値の数 |
書き込み時の列レベルの統計の自動収集は、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 |
|
パーティションのクイック統計の構築を開始するクエリが、タイムアウトして空の統計を返す前に待つ時間です。クイック統計をバックグラウンドでのみ構築し、クエリプランニングをブロックしない場合は、これを |
|
|
クエリが別のクエリによってパーティションのクイック統計が構築されていることを検出した場合、空の統計を返す前に、これらの統計が構築されるまで待つ時間です。1つのクエリだけがクイック統計の構築を待つようにする場合は(特定のパーティションの場合)、これを |
|
|
クイック統計のインメモリキャッシュに統計を保持する時間です。 |
|
|
パーティションのクイック統計の構築がスタックしている場合(たとえば、長時間実行される IO 操作のため)、リーパージョブはすべてのバックグラウンド構築スレッドを終了するため、新しいフェッチを新しくトリガーできます。このプロパティは、バックグラウンド構築スレッドが開始された後、リーパーが終了を実行する時間を制御します。 |
|
|
複数の 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スキーマファイル/リテラルに基づいてスキーマが設定されたAvroストレージ形式のHiveテーブルのクエリと操作をサポートしています。また、ローカルまたはHDFS/Webサーバーのリモートにある有効なAvroスキーマファイルからスキーマを推論するPrestoテーブルを作成することも可能です。
テーブルデータの解釈に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'
)、Webサーバー(例:avro_schema_url = 'http://example.org/schema/avro_data.avsc'
)、ローカルファイルシステムに配置できます。スキーマの場所を示すこのURLは、Hiveメタストアと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
はサポートされていません。パーティショニング(
partitioned_by
)またはバケット化(bucketed_by
)列はCREATE TABLE
ではサポートされていません。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)
メタストアのパーティションリストを確認して更新します。使用可能なモードは3つあります。
ADD
:ファイルシステムに存在するがメタストアには存在しないパーティションを追加します。DROP
:メタストアには存在するがファイルシステムには存在しないパーティションを削除します。FULL
:ADD
とDROP
の両方を実行します。
case_sensitive
引数はオプションです。HiveのMSCK REPAIR TABLE
動作との互換性のために、デフォルト値はtrue
です。これは、ファイルシステムパスのパーティション列名に小文字を使用することを想定しています(例: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からのミリ秒単位
メタストアキャッシュの無効化方法¶
Hiveコネクタは、JMX(com.facebook.presto.hive.metastore.CachingHiveMetastore#flushCache
)を介してプロシージャを公開し、メタストアキャッシュを無効にします。jconsoleまたはjmxtermを介して接続することで、このプロシージャを呼び出してメタストアキャッシュを無効にすることができます。
これは、Prestoの外部でHiveメタストアが更新され、変更をPrestoにすぐに反映させたい場合に役立ちます。
現在、このプロシージャはすべてのスキーマのすべてのテーブルのキャッシュをフラッシュします。これは既知の制限事項であり、将来は改善される予定です。
ディレクトリリストキャッシュの無効化方法¶
Hiveコネクタは、JMX(com.facebook.presto.hive.HiveDirectoryLister#flushCache
)を介してプロシージャを公開し、ディレクトリリストキャッシュを無効にします。jconsoleまたはjmxtermを介して接続することで、このプロシージャを呼び出してディレクトリリストキャッシュを無効にすることができます。
これは、キャッシュディレクトリパスにファイルが追加または削除され、変更をPrestoにすぐに反映させたい場合に役立ちます。
現在、このプロシージャはすべてのキャッシュエントリをフラッシュします。これは既知の制限事項であり、将来は改善される予定です。
例¶
Hiveコネクタは、Hiveテーブルとスキーマ(データベース)のクエリと操作をサポートしています。いくつかの特殊な操作はHiveで直接実行する必要がありますが、ほとんどの操作はPrestoを使用して実行できます。
スキーマの作成¶
my-bucket
という名前のS3バケットにテーブルを保存するweb
という名前の新しいHiveスキーマを作成します。
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"
外部テーブルの作成¶
S3の既存のデータを参照するrequest_logs
という名前の外部Hiveテーブルを作成します。
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コネクタの制限事項¶
DELETEは、WHERE
句がパーティション全体に一致する場合にのみサポートされます。