翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon での Hive の違いと考慮事項 EMR
Amazon の Apache Hive EMRと Apache Hive の違い
このセクションでは、Amazon での Hive EMR と、http://svn.apache.org/viewvc/hive/branches/
Hive 認可
Amazon EMRは および Amazon S3 の Hive 認可
Amazon S3 での Hive ファイルマージ動作
Apache Hive は hive.merge.mapfiles
が true の場合はマップのみジョブの最後に小さいファイルをマージし、マージはジョブの平均出力サイズが hive.merge.smallfiles.avgsize
設定未満の場合にのみトリガされます。最終的な出力パスが にある場合、Amazon EMR Hive の動作はまったく同じですHDFS。出力パスが Amazon S3 内の場合、hive.merge.smallfiles.avgsize
パラメータは無視されます。その場合、hive.merge.mapfiles
が true
に設定されているとマージタスクが常にトリガされます。
ACID トランザクションと Amazon S3
Amazon EMR 6.1.0 以降では、Hive ACID (不可分性、整合性、分離性、耐久性) トランザクションがサポートされているため、データベースのACIDプロパティに準拠しています。この機能を使用すると、Amazon Simple Storage Service (Amazon S3) INSERTのデータを使用してUPDATE、Hive マネージドテーブルで DELETE、、、および MERGEオペレーションを実行できます。Amazon S3
Hive Live Long and Process (LLAP)
バージョン 2.0 で追加されたデフォルトの Apache Hive のLLAP 機能は
Amazon EMRバージョン 6.0.0 以降では、Hive の Live Long and Process (LLAP) 機能がサポートされています。詳細については、「Hive の使用LLAP」を参照してください。
Amazon EMRリリースバージョン 4.x と 5.x の Hive の違い
このセクションでは、Amazon リリース 4.x の Hive バージョン 1.0.0 から Amazon EMRリリース 5.x の Hive 2.x に Hive EMR 実装を移行する前に考慮すべき相違点について説明します。
運用面での相違点と考慮事項
ACID (不可分性、一貫性、分離性、耐久性) トランザクション
のサポートが追加されました。Amazon 4.x の Hive 1EMR.0.0 とデフォルトの Apache Hive とのこの違いは排除されました。 Amazon S3 への直接書き込みが削除されました: Amazon の Hive 1.0.0 EMRとデフォルトの 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 では、Tez は Hive のデフォルトの実行エンジンではなく です MapReduce。Tez は、ほとんどのワークフローでパフォーマンスを向上させます。
多くのパーティションを持つテーブル: 多数の動的パーティションを生成するクエリは失敗することがあり、多くのパーティションを持つテーブルから選択するクエリは予想されるより時間がかかる場合があります。たとえば、100,000 個のパーティションからの選択には 10 分以上かかる場合があります。
Amazon での Hive の追加機能 EMR
Amazon は、Amazon Simple Storage Service (Amazon S3) や DynamoDB との間で読み書きする機能など、他の AWS サービスとの Hive 統合をサポートする新機能で Hive EMRを拡張します。
Hive の変数
Hive の引数スクリプト内で変数を使用するには、ドル記号と中括弧を使用します。
add jar ${LIB}/jsonserde.jar
これらの変数の値を Hive に渡すには、次の例で示すようにコマンドラインで -d
パラメータを使用します。
-d LIB=s3://elasticmapreduce/samples/hive-ads/lib
また、Hive スクリプトを実行するステップに値を渡すこともできます。
コンソールを使用して Hive のステップに変数値を渡すには
https://console.aws.amazon.com/emr
で Amazon EMRコンソールを開きます。 -
[クラスターを作成] を選択します。
-
[Steps] セクションの [Add Step] で、リストから [Hive Program] を選択し、[Configure and add] を選択します。
-
[Add Step] ダイアログで、次の表を参考にしながらパラメータを指定し、[Add] を選択します。
フィールド アクション スクリプト S3 場所* スクリプトURIが Amazon S3 に存在する を指定します。値は BucketName
/path
/ の形式である必要がありますScriptName
。例:s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q
。S3 の場所の入力 必要に応じて、URI入力ファイルが Amazon S3 に存在する を指定します。値は BucketName
/path
/ の形式である必要があります。指定すると、この値はINPUT
という名前のパラメータとして Hive スクリプトに渡されます。例:s3://elasticmapreduce/samples/hive-ads/tables/
。S3 の場所の出力 必要に応じて、出力を Amazon S3 に保存URIしたい を指定します。 Amazon S3 値は BucketName
/ の形式である必要がありますpath
。指定すると、この値はOUTPUT
という名前のパラメータとして Hive スクリプトに渡されます。例:s3://amzn-s3-demo-bucket/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: ステップが失敗した場合、クラスターを停止します。クラスターで終了保護が有効になっている場合、ANDキープアライブが有効になっていても、クラスターは終了しません。
-
Cancel and wait: ステップが失敗した場合、残りのステップをキャンセルします。クラスターのキープアライブが有効な場合、クラスターは停止されません。
-
Continue: ステップが失敗した場合、次のステップに進みます。
-
-
必要に応じて値を選択し、[Create cluster] を選択します。
を使用して Hive ステップに変数値を渡すには AWS CLI
を使用して Hive ステップに変数値を渡すには AWS CLI、 --steps
パラメータを使用して引数リストを含めます。
-
注記
読みやすくするために、Linux 行連続文字 (\) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。
aws emr create-cluster --name "
Test cluster
" --release-labelemr-7.5.0
\ --applications Name=Hive
Name=Pig
--use-default-roles --ec2-attributes KeyName=myKey
--instance-typem5.xlarge
--instance-count3
\ --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。
Java を使用して Hive ステップに変数値を渡すには SDK
-
次の例は、 を使用して変数をステップに渡す方法を示しています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://amzn-s3-demo-bucket/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");