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設定プロパティ

プロパティ名

説明

デフォルト

hive.metastore.uri

Thriftプロトコルを使用して接続するHiveメタストアのURI。複数のURIが提供されている場合、デフォルトでは最初のURIが使用され、残りのURIはフォールバックメタストアになります。このプロパティは必須です。例:thrift://192.0.2.3:9083またはthrift://192.0.2.3:9083,thrift://192.0.2.4:9083

hive.metastore.username

PrestoがHiveメタストアへのアクセスに使用するユーザー名。

hive.config.resources

HDFS設定ファイルのオプションのコンマ区切りリスト。これらのファイルは、Prestoを実行しているマシンに存在する必要があります。HDFSにアクセスするために絶対に必要な場合にのみ指定してください。例:/etc/hdfs-site.xml

hive.storage-format

新しいテーブルを作成する際に使用されるデフォルトのファイル形式。

ORC

hive.compression-codec

ファイルの書き込み時に使用する圧縮コーデック。

GZIP

hive.force-local-scheduling

分割を、分割データを提供するHadoop DataNodeプロセスのノードと同じノードでスケジュールするように強制します。これは、PrestoがすべてのDataNodeと配置されているインストールに役立ちます。

false

hive.order-based-execution-enabled

順序ベースの実行を有効にします。有効にすると、Hiveファイルは分割できなくなり、テーブルの順序付けプロパティがプランオプティマイザに公開されます。

false

hive.respect-table-format

新しいパーティションを既存のテーブル形式で記述するか、デフォルトのPresto形式で記述するか?

true

hive.immutable-partitions

既存のパーティションに新しいデータを追加できますか?

false

hive.create-empty-bucket-files

データがないバケットに対して空のファイルを作成する必要がありますか?

true

hive.max-partitions-per-writers

ライターあたりの最大パーティション数。

100

hive.max-partitions-per-scan

単一テーブルスキャンに対する最大パーティション数。

100,000

hive.dynamic-split-sizes-enabled

クエリによってスキャンされたデータに基づいて、分割の動的なサイズ変更を有効にします。

false

hive.metastore.authentication.type

Hiveメタストアの認証タイプ。可能な値はNONEまたはKERBEROSです。

NONE

hive.metastore.service.principal

HiveメタストアサービスのKerberosプリンシパル。

hive.metastore.client.principal

PrestoがHiveメタストアサービスに接続する際に使用するKerberosプリンシパル。

hive.metastore.client.keytab

Hiveメタストアクライアントのkeytabの場所。

hive.hdfs.authentication.type

HDFS認証タイプ。可能な値はNONEまたはKERBEROSです。

NONE

hive.hdfs.impersonation.enabled

HDFSエンドユーザーのインパーソネーションを有効にします。

false

hive.hdfs.presto.principal

PrestoがHDFSに接続する際に使用するKerberosプリンシパル。

hive.hdfs.presto.keytab

HDFSクライアントのkeytabの場所。

hive.security

Hiveセキュリティ設定を参照してください。

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

書き込み時の自動カラムレベル統計収集を有効にします。テーブル統計で詳細を参照してください。

false

hive.s3select-pushdown.enabled

AWS S3 Selectサービスへのクエリプッシュダウンを有効にします。

false

hive.s3select-pushdown.max-connections

S3SelectPushdownに対するS3への同時オープン接続の最大数。

500

hive.metastore.load-balancing-enabled

複数のメタストアインスタンス間のロードバランシングを有効にします。

hive.skip-empty-files

空のファイルをスキップすることを有効にします。そうでない場合、空のファイルの反復処理中にエラーが発生します。

false

hive.file-status-cache.max-retained-size

ディレクトリ一覧キャッシュの最大サイズ(バイト単位)。

0KB

メタストア設定プロパティ

必要なHiveメタストアは、多くのプロパティで設定できます。

プロパティ名

説明

デフォルト

hive.metastore-timeout

Hiveメタストアリクエストのタイムアウト。

10秒

hive.metastore-cache-ttl

キャッシュされたメタストアデータが有効と見なされる期間。

0秒

hive.metastore-cache-maximum-size

Hiveメタストアキャッシュの最大サイズ。

10000

hive.metastore-refresh-interval

アクセス後に、キャッシュされたメタストアデータがこれよりも古い場合、まだ期限切れでない場合は非同期で更新し、後続のアクセスで新しいデータが表示されるようにします。

0秒

hive.metastore-refresh-max-threads

キャッシュされたメタストアデータの更新に使用される最大スレッド数。

100

AWS Glueカタログ設定プロパティ

プロパティ名

説明

hive.metastore.glue.region

GlueカタログのAWSリージョン。EC2で実行されていない場合、またはカタログが別のリージョンにある場合は必須です。例:us-east-1

hive.metastore.glue.pin-client-to-current-region

Glueリクエストを、Prestoが実行されているEC2インスタンスと同じリージョンに固定します(デフォルトはfalse)。

hive.metastore.glue.max-connections

Glueへの同時接続の最大数(デフォルトは5)。

hive.metastore.glue.max-error-retries

Glueクライアントのエラー再試行の最大回数(デフォルトは10)。

hive.metastore.glue.default-warehouse-dir

Hive Glueメタストアのデフォルトのウェアハウスディレクトリ。

hive.metastore.glue.aws-access-key

Glueカタログへの接続に使用するAWSアクセスキー。hive.metastore.glue.aws-secret-keyと合わせて指定した場合、このパラメータはhive.metastore.glue.iam-roleよりも優先されます。

hive.metastore.glue.aws-secret-key

Glueカタログへの接続に使用するAWSシークレットキー。hive.metastore.glue.aws-access-keyと合わせて指定した場合、このパラメータはhive.metastore.glue.iam-roleよりも優先されます。

hive.metastore.glue.catalogid

メタデータデータベースが存在するGlueカタログのID。

hive.metastore.glue.endpoint-url

Glue APIエンドポイントURL(オプション)。例:https://glue.us-east-1.amazonaws.com

hive.metastore.glue.partitions-segments

パーティション化されたGlueテーブルのセグメント数。

hive.metastore.glue.get-partition-threads

Glueからの並列パーティションフェッチのスレッド数。

hive.metastore.glue.iam-role

Glueカタログに接続するときに想定するIAMロールのARN。

Amazon S3設定

Hiveコネクタは、S3に保存されているテーブルを読み書きできます。これは、HDFSプレフィックスではなくS3プレフィックスを使用するテーブルまたはデータベースの場所を持つことで実現されます。

Prestoは、独自のS3ファイルシステムをURIプレフィックスs3://s3n://s3a://に使用します。

S3設定プロパティ

プロパティ名

説明

hive.s3.use-instance-credentials

EC2メタデータサービスを使用してAPIクレデンシャルを取得します(デフォルトはfalse)。これは、EC2のIAMロールで機能します。

注:このプロパティは非推奨です。

hive.s3.aws-access-key

使用するデフォルトのAWSアクセスキー。

hive.s3.aws-secret-key

使用するデフォルトのAWSシークレットキー。

hive.s3.iam-role

想定するIAMロール。

hive.s3.endpoint

S3ストレージエンドポイントサーバー。これは、AWSの代わりにS3互換のストレージシステムに接続するために使用できます。v4署名を使用する場合は、AWSリージョン固有のエンドポイント(例:http[s]://<bucket>.s3-<AWS-region>.amazonaws.com)に設定することをお勧めします。

hive.s3.storage-class

データを書き込む際に使用するS3ストレージクラス。現在、STANDARDINTELLIGENT_TIERINGのストレージクラスのみがサポートされています。デフォルトのストレージクラスはSTANDARDです。

hive.s3.signer-type

S3互換ストレージに異なる署名タイプを指定します。例:v2署名タイプの場合はS3SignerType

hive.s3.path-style-access

S3互換ストレージへのすべてのリクエストにパススタイルアクセスを使用します。これは、仮想ホストスタイルアクセスをサポートしていないS3互換ストレージ用です。(デフォルトはfalse

hive.s3.staging-directory

S3に書き込まれたデータのローカルステージングディレクトリ。これは、JVMシステムプロパティjava.io.tmpdirによって指定されたJavaテンポラリディレクトリにデフォルト設定されます。

hive.s3.pin-client-to-current-region

S3リクエストを、Prestoが実行されているEC2インスタンスと同じリージョンに固定します(デフォルトはfalse)。

hive.s3.ssl.enabled

HTTPSを使用してS3 APIと通信します(デフォルトはtrue)。

hive.s3.sse.enabled

S3サーバーサイド暗号化を使用します(デフォルトはfalse)。

hive.s3.sse.type

S3サーバーサイド暗号化のキー管理のタイプ。S3マネージドの場合はS3、KMSマネージドキーの場合はKMSを使用します(デフォルトはS3)。

hive.s3.sse.kms-key-id

KMSマネージドキーを使用してS3サーバーサイド暗号化に使用するKMSキーID。設定されていない場合、デフォルトキーが使用されます。

hive.s3.kms-key-id

設定されている場合、S3クライアントサイド暗号化を使用し、AWS KMSを使用して暗号化キーを保存し、このプロパティの値を新しく作成されたオブジェクトのKMSキーIDとして使用します。

hive.s3.encryption-materials-provider

設定されている場合、S3クライアントサイド暗号化を使用し、このプロパティの値をAWS SDKのEncryptionMaterialsProviderインターフェースを実装するJavaクラスの完全修飾名として使用します。このクラスがHadoop APIのConfigurableも実装している場合、オブジェクトの作成後にHadoop設定が渡されます。

hive.s3.upload-acl-type

S3にファイルをアップロードする際に使用する事前定義されたACL(デフォルトはPrivate)。

hive.s3.skip-glacier-objects

クエリを失敗させるのではなく、Glacierオブジェクトを無視します。これにより、テーブルまたはパーティションの一部であると予想されるデータがスキップされます。デフォルトはfalseです。

S3クレデンシャル

EMRまたはその他の機能を使用してAmazon EC2でPrestoを実行している場合は、IAMロールfor EC2を使用してS3へのアクセスを管理することをお勧めします。これを使用するには、EC2インスタンスに、使用したいS3バケットに保存されているデータへの適切なアクセス権限を付与するIAMロールを割り当てる必要があります。hive.s3.iam-roleでIAMロールを設定して、S3バケットへのアクセスを想定することもできます。これは、hive.s3.aws-access-keyhive.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つ以上の設定を提供する必要があります。

  • accessKeysecretKey: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"
    }
  ]
}

プロパティ名

説明

hive.aws.security-mapping.type

AWSセキュリティマッピングタイプ。可能な値:S3またはLAKEFORMATION

hive.aws.security-mapping.config-file

AWS IAMセキュリティマッピングを含むJSON設定ファイル

hive.aws.security-mapping.refresh-period

AWS IAMセキュリティマッピング設定が更新される時間間隔

チューニングプロパティ

以下のチューニングプロパティは、Presto S3ファイルシステムがS3と通信する際に使用するクライアントの動作に影響します。これらのパラメーターのほとんどは、AmazonS3Clientに関連付けられたClientConfigurationオブジェクトの設定に影響します。

プロパティ名

説明

デフォルト

hive.s3.max-error-retries

S3クライアントに設定された、エラー再試行の最大回数。

10

hive.s3.max-client-retries

再試行する読み取り試行の最大回数。

5

hive.s3.max-backoff-time

S3との通信時に、1秒からこの最大値まで指数バックオフを使用します。

10

hive.s3.max-retry-time

S3との通信の再試行の最大時間。

10

hive.s3.connect-timeout

TCP接続タイムアウト。

5

hive.s3.socket-timeout

TCPソケット読み取りタイムアウト。

5

hive.s3.max-connections

S3への同時オープン接続の最大数。

500

hive.s3.multipart.min-file-size

S3へのマルチパートアップロードを使用する前の最小ファイルサイズ。

16 MB

hive.s3.multipart.min-part-size

最小マルチパートアップロードパートサイズ。

5 MB

S3データ暗号化

Prestoは、S3マネージドキーを使用したサーバーサイド暗号化と、Amazon KMSまたはAES暗号化キーを管理するソフトウェアプラグインを使用したクライアントサイド暗号化の両方を使用して、S3内の暗号化データの読み書きをサポートしています。

S3サーバーサイド暗号化(Amazonのドキュメントでは *SSE-S3* と呼ばれます)では、S3インフラストラクチャがすべての暗号化と復号化の作業(クライアントへのSSLを除く、hive.s3.ssl.enabledtrueに設定されていると仮定)を処理します。S3はすべての暗号化キーも管理します。これを有効にするには、hive.s3.sse.enabledtrueに設定します。

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でサポートされているデータ型を持つ列を使用します。TIMESTAMPREAL、および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.xmlhdfs-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 操作で基本統計(numFilesnumRowsrawDataSizetotalSize)を自動的に収集します。

Hive コネクタは、列レベルの統計も収集できます。

列タイプ

収集可能な統計

TINYINT

NULL の数、異なる値の数、最小値/最大値

SMALLINT

NULL の数、異なる値の数、最小値/最大値

INTEGER

NULL の数、異なる値の数、最小値/最大値

BIGINT

NULL の数、異なる値の数、最小値/最大値

DOUBLE

NULL の数、異なる値の数、最小値/最大値

REAL

NULL の数、異なる値の数、最小値/最大値

DECIMAL

NULL の数、異なる値の数、最小値/最大値

DATE

NULL の数、異なる値の数、最小値/最大値

TIMESTAMP

NULL の数、異なる値の数、最小値/最大値

VARCHAR

NULL の数、異なる値の数

CHAR

NULL の数、異なる値の数

VARBINARY

NULL の数

BOOLEAN

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 が実行されていないパーティションの一時的な統計情報源として機能します。

これらのクイック統計の構築方法を制御するには、次のプロパティを使用できます。

プロパティ名

説明

デフォルト

hive.quick-stats.enabled

クイック統計プロバイダーによる統計収集を有効にします。quick_stats_enabled セッションプロパティでも切り替えることができます。

false

hive.quick-stats.max-concurrent-calls

クイック統計は、複数のパーティションで同時に構築されます。このプロパティは、行うことができる同時構築の最大数を設定します。

100

hive.quick-stats.inline-build-timeout

パーティションのクイック統計の構築を開始するクエリが、タイムアウトして空の統計を返す前に待つ時間です。クイック統計をバックグラウンドでのみ構築し、クエリプランニングをブロックしない場合は、これを 0s に設定します。quick_stats_inline_build_timeout セッションプロパティでも切り替えることができます。

60s

hive.quick-stats.background-build-timeout

クエリが別のクエリによってパーティションのクイック統計が構築されていることを検出した場合、空の統計を返す前に、これらの統計が構築されるまで待つ時間です。1つのクエリだけがクイック統計の構築を待つようにする場合は(特定のパーティションの場合)、これを 0s に設定します。

0秒

hive.quick-stats.cache-expiry

クイック統計のインメモリキャッシュに統計を保持する時間です。

24h

hive.quick-stats.reaper-expiry

パーティションのクイック統計の構築がスタックしている場合(たとえば、長時間実行される IO 操作のため)、リーパージョブはすべてのバックグラウンド構築スレッドを終了するため、新しいフェッチを新しくトリガーできます。このプロパティは、バックグラウンド構築スレッドが開始された後、リーパーが終了を実行する時間を制御します。

5m

hive.quick-stats.parquet.max-concurrent-calls

複数の Parquet ファイルフッターが同時に読み取られ、処理されます。このプロパティは、行うことができる同時呼び出しの最大数を設定します。

500

hive.quick-stats.parquet.file-metadata-fetch-timeout

Parquet クイック統計ビルダーが失敗して空の統計を返すまでの時間です。

60s

スキーマの進化

Hive では、テーブルのパーティションのスキーマをテーブルとは異なるものにすることができます。これは、パーティションが既に存在する(元の列タイプを使用する)後にテーブルの列タイプが変更された場合に発生します。Hive コネクタは、Hive と同じ変換を許可することでこれをサポートしています。

  • varchartinyintsmallintintegerbigint の間

  • real から double

  • tinyint から smallint へのような、整数型の拡張変換

上記の変換に加えて、Hive コネクタは Parquet ファイル形式を使用する場合、次の変換もサポートします。

  • integer から bigintrealdouble

  • bigint から realdouble

変換失敗はすべて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_0PARQUET_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:メタストアには存在するがファイルシステムには存在しないパーティションを削除します。

    • FULLADDDROPの両方を実行します。

    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句がパーティション全体に一致する場合にのみサポートされます。