

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

# Amazon EMR 上の Hive の相違点と考慮事項
<a name="emr-hive-differences"></a>

## Amazon EMR 上の Apache Hive と Apache Hive の相違点
<a name="emr-hive-apache-diff"></a>

このセクションでは、Amazon EMR 上の Hive と [http://svn.apache.org/viewvc/hive/branches/](http://svn.apache.org/viewvc/hive/branches/) で入手できるデフォルトバージョンの Hive の相違点について説明します。

### Hive 認可
<a name="emr-hive-authorization"></a>

 Amazon EMR は、EMRFS と Amazon S3 ではなく HDFS の [Hive 認可](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization)をサポートします。Amazon EMR クラスターは、デフォルトで認可が無効な状態で実行されます。

### Amazon S3 での Hive ファイルマージ動作
<a name="emr-hive-filemerge"></a>

Apache Hive は `hive.merge.mapfiles` が true の場合はマップのみジョブの最後に小さいファイルをマージし、マージはジョブの平均出力サイズが `hive.merge.smallfiles.avgsize` 設定未満の場合にのみトリガされます。最終出力パスが HDFS 内にある場合は、Amazon EMR Hive でも動作はまったく同じです。出力パスが Amazon S3 内の場合、`hive.merge.smallfiles.avgsize` パラメータは無視されます。その場合、`hive.merge.mapfiles` が `true` に設定されているとマージタスクが常にトリガされます。

### ACID トランザクションおよび Amazon S3
<a name="emr-hive-acid"></a>

Amazon EMR 6.1.0 以降では、Hive ACID (不可分性、整合性、分離性、耐久性) トランザクションをサポートしているため、データベースの ACID プロパティに準拠しています。この機能を使用すると、Amazon Simple Storage Service (Amazon S3) のデータを使用して Hive マネージドテーブルで INSERT、UPDATE、DELETE および MERGE の各オペレーションを実行できます。

### Hive Live Long and Process (LLAP)
<a name="emr-hive-LLAP"></a>

デフォルトの Apach Hive のバージョン 2.0 で追加された [LLAP 機能](https://cwiki.apache.org/confluence/display/Hive/LLAP)は、Amazon EMR リリース 5.0 の Hive 2.1.0 ではサポートされません。

Amazon EMR バージョン 6.0.0 以降では、Hive の Live Long and Process (LLAP) 機能をサポートしています。詳細については、「[Hive LLAP の使用](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-llap.html)」を参照してください。

## Amazon EMR リリースバージョン 4.x と 5.x の Hive の相違点
<a name="emr-hive-diff"></a>

このセクションでは、Amazon EMR リリース 4.x 上の Hive バージョン 1.0.0 から Amazon EMR リリース 5.x 上の Hive 2.x に Hive の実装を移行する前に考慮すべき相違点について説明します。

### 運用面での相違点と考慮事項
<a name="emr-hive-diffs-ops"></a>
+ **[ACID (不可分性、整合性、分離性、耐久性) トランザクション](https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions)のサポートの追加:** Amazon EMR 4.x 上の Hive 1.0.0 とデフォルトの Apache Hive のこの相違点は排除されています。
+ **Amazon S3 への直接書き込みの排除:** Amazon EMR 上の Hive 1.0.0 とデフォルトの Apache Hive のこの相違点は排除されています。Amazon EMR リリース 5.x 上の Hive 2.1.0 は、現在、Amazon S3 に保存される一時ファイルの作成、読み取り、書き込みを行います。結果として、同じ表の読み取りと書き込みのために、対処法としてクラスターのローカル HDFS ファイルシステムに一時テーブルを作成する必要はなくなります。バージョニング対応バケットを使用する場合、これらの一時ファイルを必ず以下のように管理してください。
+ **Amazon S3 バージョニング対応バケットを使用する場合の一時ファイルの管理:** 生成されたデータの出力先が Amazon S3 である Hive クエリを実行すると、多くの一時ファイルとディレクトリが作成されます。これは、前述の新しい動作です。バージョニング対応 S3 バケットを使用する場合、これらの一時ファイルのために Amazon S3 が煩雑になり、削除されないならコストが発生します。`/_tmp` プレフィックスが付けられたデータが 5 日などの短期間で削除されるように、ライフサイクルルールを調整します。詳細については、「[ライフサイクル設定の指定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)」を参照してください。
+ **Log4j は Log4j 2 に更新:** Log4j を使用する場合、このアップグレードのためにログ設定を変更しなければならない場合があります。詳細については、[Apache log4j 2](http://logging.apache.org/log4j/2.x/) を参照してください。

### パフォーマンスの相違点と考慮事項
<a name="emr-hive-diffs-perf"></a>
+ **Tez によるパフォーマンスの相違点:** Amazon EMR リリース 5.x では、MapReduce ではなく Tez が Hive のデフォルトの実行エンジンです。Tez は、ほとんどのワークフローでパフォーマンスを向上させます。
+ **多くのパーティションを持つテーブル:** 多数の動的パーティションを生成するクエリは失敗することがあり、多くのパーティションを持つテーブルから選択するクエリは予想されるより時間がかかる場合があります。たとえば、100,000 個のパーティションからの選択には 10 分以上かかる場合があります。

## Amazon EMR での Hive の追加機能
<a name="emr-hive-additional-features"></a>

Amazon EMR は、Amazon Simple Storage Service (Amazon S3) や DynamoDB との間で読み書きする機能など、他の AWS サービスとの Hive 統合をサポートする新機能で Hive を拡張します。

### Hive の変数
<a name="emr-hive-variables"></a>

 Hive の引数スクリプト内で変数を使用するには、ドル記号と中括弧を使用します。

```
add jar ${LIB}/jsonserde.jar
```

 これらの変数の値を Hive に渡すには、次の例で示すようにコマンドラインで `-d` パラメータを使用します。

```
-d LIB=s3://elasticmapreduce/samples/hive-ads/lib
```

 また、Hive スクリプトを実行するステップに値を渡すこともできます。

**コンソールを使用して Hive のステップに変数値を渡すには**

1. [https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/) で Amazon EMR コンソールを開きます。

1. **[クラスターを作成]** を選択します。

1. [**Steps**] セクションの [**Add Step**] で、リストから [**Hive Program**] を選択し、[**Configure and add**] を選択します。

1.  [**Add Step**] ダイアログで、次の表を参考にしながらパラメータを指定し、[**Add**] を選択します。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-hive-differences.html)

1. 必要に応じて値を選択し、[**Create cluster**] を選択します。

**を使用して Hive ステップに変数値を渡すには AWS CLI**

を使用して Hive ステップに変数値を渡すには AWS CLI、 `--steps`パラメータを使用して引数リストを含めます。
+ 
**注記**  
読みやすくするために、Linux 行連続文字 (\\) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

  ```
  aws emr create-cluster --name "{{Test cluster}}" --release-label {{emr-7.13.0}} \
  --applications Name={{Hive}} Name={{Pig}} --use-default-roles --ec2-attributes KeyName={{myKey}} --instance-type {{m5.xlarge}} --instance-count {{3}} \
  --steps Type={{Hive}},Name="{{Hive Program}}",ActionOnFailure={{CONTINUE}},Args=[-f,{{s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q}},-d,INPUT={{s3://elasticmapreduce/samples/hive-ads/tables}},-d,OUTPUT={{s3://amzn-s3-demo-bucket/hive-ads/output/}},-d,{{SAMPLE}}={{s3://elasticmapreduce/samples/hive-ads/}}]
  ```

  での Amazon EMR コマンドの使用の詳細については AWS CLI、「」を参照してください[https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr)。

**Java SDK を使用して Hive のステップに変数値を渡すには**
+ 次の例は、SDK を使用してステップに変数を渡す方法を示しています。詳細については、「AWS SDK for Java API リファレンス」の「[Class StepFactory](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/util/StepFactory.html)」を参照してください。**

  ```
  StepFactory stepFactory = new StepFactory();
  
     StepConfig runHive = new StepConfig()
       .withName("Run Hive Script")
       .withActionOnFailure("TERMINATE_JOB_FLOW")
       .withHadoopJarStep(stepFactory.newRunHiveScriptStep(“s3://amzn-s3-demo-bucket/script.q”,
        Lists.newArrayList(“-d”,”LIB= s3://elasticmapreduce/samples/hive-ads/lib”));
  ```

### 部分 DynamoDB スキーマに対応するための Amazon EMR Hive クエリ
<a name="emr-hive-partial-schema"></a>

Amazon EMR Hive は、DynamoDB テーブルをクエリすると、すべての列をクエリに含める必要はなく、データをフィルターできる列のサブセットを指定できるので、柔軟性が最大になります。この部分スキーマクエリの手法は、スパースデータベーススキーマを使用し、タイムスタンプでのフィルタのように少数の列に基づいてレコードをフィルタする場合に効果的です。

 以下の例では、Hive クエリの使用方法を示します。
+ DynamoDB テーブルを作成する。
+ DynamoDB で項目 (行) のサブセットを選択し、データを特定の列までさらに絞り込む。
+ 結果のデータを Amazon S3 にコピーする。

```
DROP TABLE dynamodb; 
DROP TABLE s3;

CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, fullColumn map<String, String>)
    STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
    TBLPROPERTIES ( 
     "dynamodb.table.name" = "myTable",
     "dynamodb.throughput.read.percent" = ".1000", 
     "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey"); 

CREATE EXTERNAL TABLE s3(map<String, String>)
     ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
     LOCATION 's3://bucketname/path/subpath/';

INSERT OVERWRITE TABLE s3 SELECT item fullColumn FROM dynamodb WHERE recordTimeStamp < "2012-01-01";
```

次の表では、DynamoDB から項目の任意の組み合わせを選択するためのクエリ構文を示します。


| クエリの例 | 結果の説明 | 
| --- | --- | 
| SELECT \* FROM {{table\_name}}; | 特定のテーブルからすべての項目（行）を選択し、それらの項目で使用できるすべての列のデータを含めます。 | 
| SELECT \* FROM {{table\_name}} WHERE {{field\_name}} ={{value}}; | 特定のテーブルから一部の項目（行）を選択し、それらの項目で使用できるすべての列のデータを含めます。 | 
| SELECT {{column1\_name}}, {{column2\_name}}, {{column3\_name}} FROM {{table\_name}}; | 特定のテーブルからすべての項目（行）を選択し、それらの項目で使用できる一部の列のデータを含めます。 | 
| SELECT {{column1\_name}}, {{column2\_name}}, {{column3\_name}} FROM {{table\_name}} WHERE {{field\_name}} ={{value}}; | 特定のテーブルから一部の項目（行）を選択し、それらの項目で使用できる一部の列のデータを含めます。 | 

### 異なる AWS リージョンの DynamoDB テーブル間でデータをコピーする
<a name="emr-hive-cross-region-ddb-copy"></a>

Amazon EMR Hive には、DynamoDB テーブルごとに設定できる `dynamodb.region` プロパティがあります。2 つのテーブルで `dynamodb.region` の設定が異なると、指定されたリージョンの間でテーブル間のデータのコピーが自動的に行われます。

 次の例では、`dynamodb.region` プロパティが設定された Hive スクリプトを含む DynamoDB テーブルの作成方法を示します。

**注記**  
テーブルリージョンごとのプロパティは、グローバル Hive プロパティをオーバーライドします。

```
CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn)
    STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
    TBLPROPERTIES ( 
     "dynamodb.table.name" = "myTable",
     "dynamodb.region" = "eu-west-1", 
     "dynamodb.throughput.read.percent" = ".1000", 
     "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");
```

### テーブルごとに DynamoDB スループット値を設定する
<a name="emr-hive-set-ddb-throughput"></a>

Amazon EMR Hive では、テーブル定義で DynamoDB の readThroughputPercent および writeThroughputPercent をテーブルごとに設定できます。以下の Amazon EMR Hive スクリプトでは、スループット値の設定方法を示します。DynamoDB スループット値の詳細については、「[Specifying Read and Write Requirements for Tables](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithDDTables.html#ProvisionedThroughput)」を参照してください。

```
CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn)
    STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
    TBLPROPERTIES ( 
     "dynamodb.table.name" = "myTable",
     "dynamodb.throughput.read.percent" = ".4",
     "dynamodb.throughput.write.percent" = "1.0",
     "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");
```