

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Hive のパフォーマンスの向上
<a name="emr-hive-s3-performance"></a>

Amazon EMR には、Hive を使用して Amazon S3 に保存されたデータのクエリ、読み取り、および書き込みを行うときのパフォーマンスを最適化するのに役立つ機能が用意されています。

S3 Select では、Amazon S3 に処理を「プッシュダウン」することで一部のアプリケーションの CSV および JSON ファイルのクエリパフォーマンスを向上させることができます。

EMRFS S3 向けに最適化されたコミッターは [OutputCommitter](https://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapreduce/OutputCommitter.html) クラスに代わるものであり、これによりリスト操作と名前変更操作が不要になり、EMRFS を使用して Amazon S3 にファイルを書き込むときのパフォーマンスが向上します。

**Topics**
+ [Hive EMRFS S3 向けに最適化されたコミッターを有効にする](hive-optimized-committer.md)
+ [S3 Select と Hive を使用してパフォーマンスを向上させる](emr-hive-s3select.md)
+ [MSCK の最適化](emr-msck-optimization.md)

# Hive EMRFS S3 向けに最適化されたコミッターを有効にする
<a name="hive-optimized-committer"></a>

Hive EMRFS S3 向けに最適化されたコミッターは、EMRFS を使用するときに EMR Hive が挿入クエリ用のファイルを書き込む代替方法です。コミッターは Amazon S3 で行うリスト操作と名前変更操作を不要にし、アプリケーションのパフォーマンスを向上させます。この機能は EMR 5.34 および EMR 6.5 以降で利用可能です。

## コミッターを有効にする
<a name="enabling-hive-committer"></a>

EMR Hive が `HiveEMRFSOptimizedCommitter` を使用してすべての Hive 管理テーブルと外部テーブルのデフォルトとしてデータをコミットできるようにするには、EMR 6.5.0 または EMR 5.34.0 クラスターで次の `hive-site` 設定を使用してください。

```
[
   {
      "classification": "hive-site",
      "properties": {
         "hive.blobstore.use.output-committer": "true"
      }
   }
]
```

**注記**  
`hive.exec.parallel` が `true` に設定されているときは、この機能をオンにしないでください。

## 制限事項
<a name="hive-committer-limitations"></a>

タグには以下のベーシックな制限があります。
+ Hive で小さなファイルを自動的にマージできるようにすることはサポートされていません。最適化されたコミッターが有効になっている場合でも、デフォルトの Hive コミットロジックが使用されます。
+ Hive ACID テーブルはサポートされていません。最適化されたコミッターが有効になっている場合でも、デフォルトの Hive コミットロジックが使用されます。
+ 書き込まれるファイルのファイル命名法が Hive の `<task_id>_<attempt_id>_<copy_n>` から `<task_id>_<attempt_id>_<copy_n>_<query_id>` に変更されました。例えば、次の名前のファイルがあるとします。

  `s3://warehouse/table/partition=1/000000_0` は `s3://warehouse/table/partition=1/000000_0-hadoop_20210714130459_ba7c23ec-5695-4947-9d98-8a40ef759222-1` に変更されます。`query_id` はここでは、ユーザー名、タイムスタンプ、UUID を組み合わせたものです。
+ カスタムパーティションが異なるファイルシステム (HDFS、S3) にある場合、この機能は自動的に無効になります。有効にすると、デフォルトの Hive コミットロジックが使用されます。

# S3 Select と Hive を使用してパフォーマンスを向上させる
<a name="emr-hive-s3select"></a>

**重要**  
新規のお客様への Amazon S3 Select の提供は終了しました。Amazon S3 Select をご利用の既存のお客様は、今後も通常どおり使用できます。[詳細はこちら](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon EMR リリースバージョン 5.18.0 以降では、Amazon EMR での Hive を使用した [S3 Select](https://aws.amazon.com/blogs/aws/s3-glacier-select/) を使用できます。S3 Select では、アプリケーションはオブジェクトに含まれるデータのサブセットのみを取得できます。Amazon EMR では、大量のデータセットをフィルタリングして処理する計算作業をクラスターから Amazon S3 に「プッシュダウン」することにより、一部のアプリケーションのパフォーマンスを高めることができます。また、Amazon EMR と Amazon S3 の間で転送されるデータの量も削減されます。

S3 Select では、Hive セッション中に `s3select.filter` 設定変数を `true` に設定することで、CSV ファイルと JSON ファイルに基づいて Hive テーブルがサポートされています。詳細な説明と例については、[コードで S3 Select を指定する](#emr-hive-s3select-specify) を参照してください。

## S3 Select が使用するアプリケーションに適しているかどうかを確認する
<a name="emr-hive-s3select-apps"></a>

S3 Select が使用するアプリケーションに適しているかどうかを確認するために、S3 Select を使用した場合と使用しない場合のアプリケーションのベンチマークを行うことをお勧めします。

アプリケーションが S3 Select を使用する候補となるかどうかを判断するには、次のガイドラインを使用します。
+ クエリは元のデータセットの半分以上を除外する。
+ クエリのフィルター述語では、Amazon S3 Select がサポートするデータ型を持つ列が使用される。詳細については、「*Amazon Simple Storage Service ユーザーガイド*」の「[データ型](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-data-types.html)」を参照してください。
+ Amazon S3 と Amazon EMR クラスター間のネットワーク接続は、転送速度と使用可能な帯域幅が良好です。Amazon S3 は、HTTP 応答を圧縮しないため、応答サイズは圧縮された入力ファイルと比較して増加する可能性があります。

## 考慮事項と制限事項
<a name="emr-hive-s3select-considerations"></a>
+ お客様が用意した暗号化キーを使用した Amazon S3 サーバー側の暗号化 (SSE-C) とクライアント側の暗号化はサポートされていません。
+ `AllowQuotedRecordDelimiters` プロパティはサポートされていません。このプロパティを指定した場合、クエリは失敗します。
+ UTF-8 形式の CSV ファイルと JSON ファイルのみがサポートされています。複数行の CSV と JSON はサポートされません。
+ 圧縮されていないファイルか gzip ファイルまたは bzip2 ファイルのみがサポートされます。
+ 最後の行のコメント文字はサポートされていません。
+ ファイルの末尾にある空の行は処理されません。
+ Amazon EMR の Hive では、S3 Select がサポートするプリミティブデータ型がサポートされています。詳細については、「*Amazon Simple Storage Service ユーザーガイド*」の「[データ型](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-data-types.html)」を参照してください。

## コードで S3 Select を指定する
<a name="emr-hive-s3select-specify"></a>

Hive テーブルで S3 Select を使用するには、`INPUTFORMAT` クラス名として `com.amazonaws.emr.s3select.hive.S3SelectableTextInputFormat` を指定してテーブルを作成し、`TBLPROPERTIES` 句を使用して `s3select.format` プロパティの値を指定します。

デフォルトでは、S3 Select はクエリの実行時に無効になっています。次に示すように Hive セッションで `s3select.filter` を `true` に設定して S3 Select を有効にします。以下の例では、基盤となる CSV ファイルと JSON ファイルからテーブルを作成するときに S3 Select を指定して、シンプルな SELECT ステートメントを使用してテーブルをクエリする方法を説明しています。

**Example CSV ベースのテーブルの CREATE TABLE ステートメント**  

```
CREATE TABLE mys3selecttable (
col1 string,
col2 int,
col3 boolean
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS
INPUTFORMAT
  'com.amazonaws.emr.s3select.hive.S3SelectableTextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://path/to/mycsvfile/'
TBLPROPERTIES (
  "s3select.format" = "csv",
  "s3select.headerInfo" = "ignore"
);
```

**Example JSON ベースのテーブルの CREATE TABLE ステートメント**  

```
CREATE TABLE mys3selecttable (
col1 string,
col2 int,
col3 boolean
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS
INPUTFORMAT
  'com.amazonaws.emr.s3select.hive.S3SelectableTextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://path/to/json/'
TBLPROPERTIES (
  "s3select.format" = "json"
);
```

**Example SELECT TABLE ステートメント**  

```
SET s3select.filter=true;
SELECT * FROM mys3selecttable WHERE col2 > 10;
```

# MSCK の最適化
<a name="emr-msck-optimization"></a>

Hive は各テーブルのパーティションのリストをメタストアに保存します。ただし、パーティションがファイルシステムに直接追加されたり、ファイルシステムに削除されたりしても、Hive メタストアはこれらの変更を認識しません。[MSCK コマンド](https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#LanguageManualDDL-RecoverPartitions(MSCKREPAIRTABLE))は、ファイルシステムに直接追加または削除されたパーティションの Hive メタストア内のパーティションメタデータを更新します。コマンドの構文は次のとおりです。

```
MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];
```

Hive はこのコマンドを以下のように実装しています。

1. Hive はテーブルのすべてのパーティションをメタストアから取得します。次に、ファイルシステムに存在しないパーティションパスのリストから、メタストアから削除するパーティションのリストを作成します。

1. Hive はファイルシステムに存在するパーティションパスを収集し、メタストアにあるパーティションのリストと比較し、メタストアに追加する必要のあるパーティションのリストを生成します。

1. Hive は、`ADD`、`DROP`、または `SYNC` モードを使用してメタストアを更新します。

**注記**  
メタストアに多数のパーティションがある場合、ファイルシステムの `exists` API 呼び出しはパーティションごとに行う必要があるため、ファイルシステムにパーティションが存在しないかどうかを確認するステップの実行には時間がかかります。

Amazon EMR 6.5.0 では、Hive に `hive.emr.optimize.msck.fs.check` というフラグが導入されました。このフラグを有効にすると、Hive はファイルシステム API 呼び出しを行う代わりに、上記のステップ 2 で生成されたファイルシステムのパーティションパスのリストからパーティションの有無を確認します。Amazon EMR 6.8.0 では、Hive はこの最適化をデフォルトで有効にしたため、フラグ `hive.emr.optimize.msck.fs.check` を設定する必要がなくなりました。