Amazon EMR 上の Hive の相違点と考慮事項 - Amazon EMR

Amazon EMR 上の Hive の相違点と考慮事項

Amazon EMR 上の Apache Hive と Apache Hive の相違点

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

Hive 認可

Amazon EMR は、EMRFS と Amazon S3 ではなく HDFS の Hive 認可をサポートします。Amazon EMR クラスターは、デフォルトで認可が無効な状態で実行されます。

Amazon S3 での Hive ファイルマージ動作

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

ACID トランザクションおよび Amazon S3

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)

デフォルトの Apach Hive のバージョン 2.0 で追加された LLAP 機能は、Amazon EMR リリース 5.0 の Hive 2.1.0 ではサポートされません。

Amazon EMR バージョン 6.0.0 以降では、Hive の Live Long and Process (LLAP) 機能をサポートしています。詳細については、「Hive LLAP の使用」を参照してください。

Amazon EMR リリースバージョン 4.x と 5.x の Hive の相違点

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

運用面での相違点と考慮事項

  • ACID (不可分性、整合性、分離性、耐久性) トランザクションのサポートの追加: 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 日などの短期間で削除されるように、ライフサイクルルールを調整します。詳細については、「ライフサイクル設定の指定」を参照してください。

  • Log4j は Log4j 2 に更新: Log4j を使用する場合、このアップグレードのためにログ設定を変更しなければならない場合があります。詳細については、Apache log4j 2 を参照してください。

パフォーマンスの相違点と考慮事項

  • Tez によるパフォーマンスの相違点: Amazon EMR リリース 5.x では、MapReduce ではなく Tez が Hive のデフォルトの実行エンジンです。Tez は、ほとんどのワークフローでパフォーマンスを向上させます。

  • 多くのパーティションを持つテーブル: 多数の動的パーティションを生成するクエリは失敗することがあり、多くのパーティションを持つテーブルから選択するクエリは予想されるより時間がかかる場合があります。たとえば、100,000 個のパーティションからの選択には 10 分以上かかる場合があります。

Amazon EMR での Hive の追加機能

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

Hive の変数

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

add jar ${LIB}/jsonserde.jar

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

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

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

コンソールを使用して Hive のステップに変数値を渡すには
  1. Amazon EMR コンソール (https://console.aws.amazon.com/emr) を開きます。

  2. [Create cluster] (クラスターを作成) を選択します。

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

  4. [Add Step] ダイアログで、次の表を参考にしながらパラメータを指定し、[Add] を選択します。

    フィールド アクション
    スクリプト S3 場所* Amazon S3 でスクリプトがある場所の URI を指定します。パスの値は BucketName/path/ScriptName という書式で指定する必要があります。例: s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q
    S3 の場所の入力 Amazon S3 で入力ファイルがある場所の URI を指定します (オプション)。値は BucketName/path という書式で指定する必要があります。指定すると、この値は INPUT という名前のパラメータとして Hive スクリプトに渡されます。例: s3://elasticmapreduce/samples/hive-ads/tables/
    S3 の場所の出力 Amazon S3 で出力を保存する場所の URI を指定します (オプション)。値は BucketName/path という書式で指定する必要があります。指定すると、この値は OUTPUT という名前のパラメータとして Hive スクリプトに渡されます。例: s3://mybucket/hive-ads/output/
    引数 引数のリスト(スペース区切りの文字列)を入力し、Hive に渡します(オプション)。${SAMPLE} という名前の Hive スクリプトでパス変数を定義した場合の例: )
    CREATE EXTERNAL TABLE logs (requestBeginTime STRING, requestEndTime STRING, hostname STRING) PARTITIONED BY (dt STRING) \ ROW FORMAT serde 'com.amazon.elasticmapreduce.JsonSerde' WITH SERDEPROPERTIES ( 'paths'='requestBeginTime, requestEndTime, hostname' ) LOCATION '${SAMPLE}/tables/impressions';

    変数の値を渡すには、[Arguments] ウィンドウに次のように入力します。

    -d SAMPLE=s3://elasticmapreduce/samples/hive-ads/.

    Action on Failure

    エラーに反応しているクラスターを判断します。この設定に使用できる値は次のとおりです。

    • Terminate cluster: ステップが失敗した場合、クラスターを停止します。クラスターの停止保護が有効で、キープアライブが有効な場合は、クラスターは停止されません。

    • Cancel and wait: ステップが失敗した場合、残りのステップをキャンセルします。クラスターのキープアライブが有効な場合、クラスターは停止されません。

    • Continue: ステップが失敗した場合、次のステップに進みます。

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

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

AWS CLI を使用して Hive のステップに変数値を渡すには、--steps パラメータを使用し、引数リストを含めます。

  • 注記

    読みやすくするために、Linux 行連続文字 (\) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

    aws emr create-cluster --name "Test cluster" --release-label emr-5.36.1 \ --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://mybucket/hive-ads/output/,-d,SAMPLE=s3://elasticmapreduce/samples/hive-ads/]

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

Java SDK を使用して Hive のステップに変数値を渡すには
  • 次の例は、SDK を使用してステップに変数を渡す方法を示しています。詳細については、「AWS SDK for Java API リファレンス」の「Class StepFactory」を参照してください。

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

部分 DynamoDB スキーマに対応するための Amazon EMR Hive クエリ

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 テーブル間でデータをコピーする

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 スループット値を設定する

Amazon EMR Hive では、テーブル定義で DynamoDB の readThroughputPercent および writeThroughputPercent をテーブルごとに設定できます。以下の Amazon EMR Hive スクリプトでは、スループット値の設定方法を示します。DynamoDB スループット値の詳細については、「Specifying Read and Write Requirements for Tables」を参照してください。

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");