Azure HDInsight で Apache Ambari を使用して Apache Hive を最適化するOptimize Apache Hive with Apache Ambari in Azure HDInsight

Apache Ambari は、HDInsight クラスターを管理および監視するための Web インターフェイスです。Apache Ambari is a web interface to manage and monitor HDInsight clusters. Ambari Web UI の概要については、「Ambari Web UI を使用した HDInsight クラスターの管理」を参照してください。For an introduction to Ambari Web UI, see Manage HDInsight clusters by using the Apache Ambari Web UI.

以下のセクションでは、Apache Hive の全体的なパフォーマンスを最適化するための構成オプションについて説明します。The following sections describe configuration options for optimizing overall Apache Hive performance.

  1. Hive 構成パラメーターを変更するには、[Services](サービス) サイドバーで [Hive] を選択します。To modify Hive configuration parameters, select Hive from the Services sidebar.
  2. [Configs](構成) タブに移動します。Navigate to the Configs tab.

Hive 実行エンジンを設定するSet the Hive execution engine

Hive は、Apache Hadoop MapReduce と Apache TEZ の 2 つの実行エンジンを提供します。Hive provides two execution engines: Apache Hadoop MapReduce and Apache TEZ. Tez は MapReduce より高速です。Tez is faster than MapReduce. HDInsight Linux クラスターでは、既定の実行エンジンとして Tez を使用します。HDInsight Linux clusters have Tez as the default execution engine. 実行エンジンを変更するには、次の手順を実行します。To change the execution engine:

  1. Hive の [Configs](構成) タブで、フィルター ボックスに「execution engine」と入力します。In the Hive Configs tab, type execution engine in the filter box.

    Apache Ambari の実行エンジンの検索

  2. [Optimization](最適化) プロパティの既定値は Tez です。The Optimization property's default value is Tez.

    最適化 - Apache Tez エンジン

マッパーを調整するTune mappers

Hadoop では、1 つのファイルを複数のファイルに分割 ( "マップ" ) し、分割されたファイルの並列処理を試みます。Hadoop tries to split (map) a single file into multiple files and process the resulting files in parallel. マッパーの数は分割数によって異なります。The number of mappers depends on the number of splits. 次の 2 つの構成パラメーターは、Tez 実行エンジンの分割数を制御します。The following two configuration parameters drive the number of splits for the Tez execution engine:

  • tez.grouping.min-size:グループ化された分割のサイズの下限であり、既定値は 16 MB (16,777,216 バイト) です。tez.grouping.min-size: Lower limit on the size of a grouped split, with a default value of 16 MB (16,777,216 bytes).
  • tez.grouping.max-size:グループ化された分割のサイズの上限であり、既定値は 1 GB (1,073,741,824 バイト) です。tez.grouping.max-size: Upper limit on the size of a grouped split, with a default value of 1 GB (1,073,741,824 bytes).

パフォーマンスの目安として、これらのパラメーターの両方を減らすと待機時間が改善され、増やすとスループットが向上します。As a performance guideline, lower both of these parameters to improve latency, increase for more throughput.

たとえば、128 MB のデータ サイズに対して 4 つのマッパー タスクを設定するには、これらのパラメーターをそれぞれ 32 MB (33,554,432バイト) に設定します。For example, to set four mapper tasks for a data size of 128 MB, you would set both parameters to 32 MB each (33,554,432 bytes).

  1. 制限パラメーターを変更するには、Tez サービスの [Configs](構成) タブに移動します。To modify the limit parameters, navigate to the Configs tab of the Tez service. [General](全般) パネルを展開し、tez.grouping.max-size パラメーターと tez.grouping.min-size パラメーターを見つけます。Expand the General panel, and locate the tez.grouping.max-size and tez.grouping.min-size parameters.

  2. 両方のパラメーターを 33,554,432 バイト(32 MB) に設定します。Set both parameters to 33,554,432 bytes (32 MB).

    Apache Ambari の Tez のグループ化サイズ

これらの変更は、サーバーのすべての Tez ジョブに影響します。These changes affect all Tez jobs across the server. 最適な結果を得るために、適切なパラメーター値を選択してください。To get an optimal result, choose appropriate parameter values.

レジューサーを調整するTune reducers

Apache ORC と Snappy は、どちらもハイ パフォーマンスを提供します。Apache ORC and Snappy both offer high performance. ただし、Hive は既定でレジューサーの数が少なすぎるため、ボトルネックが発生する可能性があります。However, Hive may have too few reducers by default, causing bottlenecks.

たとえば、入力データ サイズが 50 GB であるとします。For example, say you have an input data size of 50 GB. このデータを ORC 形式にして Snappy で圧縮すると 1 GB になります。That data in ORC format with Snappy compression is 1 GB. Hive では、(マッパーに入力されたバイト数/hive.exec.reducers.bytes.per.reducer) で必要なレジューサーの数を見積もります。Hive estimates the number of reducers needed as: (number of bytes input to mappers / hive.exec.reducers.bytes.per.reducer).

既定の設定を使用した場合、この例は 4 レジューサーになります。With the default settings, this example is four reducers.

hive.exec.reducers.bytes.per.reducer パラメーターは、レジューサーごとに処理されるバイト数を指定します。The hive.exec.reducers.bytes.per.reducer parameter specifies the number of bytes processed per reducer. 既定値は 64 MB です。The default value is 64 MB. この値を調整して並列処理を増やすと、パフォーマンスが向上する場合があります。Tuning this value down increases parallelism and may improve performance. また、値を小さくしすぎると、生成されるレジューサーが多すぎ、パフォーマンスに悪影響を及ぼす可能性があります。Tuning it too low could also produce too many reducers, potentially adversely affecting performance. このパラメーターは、特定のデータ要件、圧縮設定、その他の環境要因に基づきます。This parameter is based on your particular data requirements, compression settings, and other environmental factors.

  1. パラメーターを変更するには、Hive の [Configs](構成) タブに移動し、[Settings](設定) ページで [Data per Reducer](レジューサーごとのデータ) パラメーターを見つけます。To modify the parameter, navigate to the Hive Configs tab and find the Data per Reducer parameter on the Settings page.

    Apache Ambari のレジューサーごとのデータ

  2. [Edit](編集) を選択して値を 128 MB (134,217,728 バイト) に変更し、Enter キーを押して保存します。Select Edit to modify the value to 128 MB (134,217,728 bytes), and then press Enter to save.

    Ambari のレジューサーごとのデータ - 編集済み

    入力サイズが 1,024 MB、レジューサーごとのデータが 128 MB とすると、8 レジューサー (1024/128) になります。Given an input size of 1,024 MB, with 128 MB of data per reducer, there are eight reducers (1024/128).

  3. [Data per Reducer](レジューサーごとのデータ) パラメーターの値が正しくない場合、多数のレジューサーが生成され、クエリのパフォーマンスに悪影響を及ぼす可能性があります。An incorrect value for the Data per Reducer parameter may result in a large number of reducers, adversely affecting query performance. レジューサーの最大数を制限するには、hive.exec.reducers.max を適切な値に設定します。To limit the maximum number of reducers, set hive.exec.reducers.max to an appropriate value. 既定値は 1009 です。The default value is 1009.

並列実行を有効にするEnable parallel execution

Hive クエリは、1 つ以上のステージで実行されます。A Hive query is executed in one or more stages. 独立したステージを並列実行できれば、クエリのパフォーマンスが向上します。If the independent stages can be run in parallel, that will increase query performance.

  1. クエリの並列実行を有効にするには、Hive の [Configs](構成) タブに移動し、hive.exec.parallel プロパティを検索します。To enable parallel query execution, navigate to the Hive Config tab and search for the hive.exec.parallel property. 既定値は false です。The default value is false. 値を true に変更し、Enter キーを押して値を保存します。Change the value to true, and then press Enter to save the value.

  2. 並列実行するジョブの数を制限するには、hive.exec.parallel.thread.number プロパティを変更します。To limit the number of jobs to run in parallel, modify the hive.exec.parallel.thread.number property. 既定値は 8 です。The default value is 8.

    Apache Hive の実行の並列表示

ベクター化を有効にするEnable vectorization

Hive では行単位でデータを処理します。Hive processes data row by row. ベクター化では、1 行ずつではなく、1,024 行のブロック単位でデータを処理するよう Hive に指示します。Vectorization directs Hive to process data in blocks of 1,024 rows rather than one row at a time. ベクター化は、ORC ファイル形式にのみ適用されます。Vectorization is only applicable to the ORC file format.

  1. ベクター化されたクエリ実行を有効にするには、Hive の [Configs](構成) タブに移動し、hive.vectorized.execution.enabled パラメーターを検索します。To enable a vectorized query execution, navigate to the Hive Configs tab and search for the hive.vectorized.execution.enabled parameter. Hive 0.13.0 以降では、既定値は true です。The default value is true for Hive 0.13.0 or later.

  2. クエリの Reduce 側でベクター化された実行を有効にするには、hive.vectorized.execution.reduce.enabled パラメーターを true に設定します。To enable vectorized execution for the reduce side of the query, set the hive.vectorized.execution.reduce.enabled parameter to true. 既定値は false です。The default value is false.

    Apache Hive のベクター化された実行

コストベースの最適化 (CBO) を有効にするEnable cost-based optimization (CBO)

既定では、Hive は一連のルールに従って、1 つの最適なクエリ実行プランを見つけます。By default, Hive follows a set of rules to find one optimal query execution plan. コストベースの最適化 (CBO) は、クエリを実行するために複数のプランを評価します。Cost-based optimization (CBO) evaluates multiple plans to execute a query. また、各プランにコストが割り当てられ、クエリの実行にかかるコストが最も低いプランが決定されます。And assigns a cost to each plan, then determines the cheapest plan to execute a query.

CBO を有効にするには、 [Hive] > [Configs](構成) > [Settings](設定) に移動し、 [Enable Cost Based Optimizer](コスト ベースのオプティマイザー を有効にする) を探して、トグル ボタンを [オン] に切り替えます。To enable CBO, navigate to Hive > Configs > Settings and find Enable Cost Based Optimizer, then switch the toggle button to On.

HDInsight のコストベースのオプティマイザー

CBO を有効にすると、次の追加の構成パラメーターによって Hive クエリのパフォーマンスが向上します。The following additional configuration parameters increase Hive query performance when CBO is enabled:

  • hive.compute.query.using.stats

    true に設定すると、Hive はその metastore に保存されている統計を使用して、count(*) のような単純なクエリに応答します。When set to true, Hive uses statistics stored in its metastore to answer simple queries like count(*).

    Apache Hive の統計を使用したクエリのコンピューティング

  • hive.stats.fetch.column.stats

    CBO を有効にすると、列統計が作成されます。Column statistics are created when CBO is enabled. Hive は metastore に保存されている列統計を使用して、クエリを最適化します。Hive uses column statistics, which are stored in metastore, to optimize queries. 列数が多い場合、各列の列統計のフェッチに時間がかかります。Fetching column statistics for each column takes longer when the number of columns is high. false に設定すると、metastore からの列統計のフェッチが無効になります。When set to false, this setting disables fetching column statistics from the metastore.

    Apache Hive の統計セットの列統計

  • hive.stats.fetch.partition.stats

    基本的なパーティション統計 (行数、データ サイズ、ファイル サイズなど) は metastore に保存されています。Basic partition statistics such as number of rows, data size, and file size are stored in metastore. true に設定すると、metastore からパーティション統計がフェッチされます。If set to true, the partition stats are fetched from metastore. false の場合、ファイルのサイズはファイル システムからフェッチされます。When false, the file size is fetched from the file system. 行の数は、行スキーマからフェッチされます。And the number of rows is fetched from the row schema.

    Hive 統計セットのパーティション統計

中間圧縮を有効にするEnable intermediate compression

マップ タスクによって、レジューサー タスクで使用される中間ファイルが作成されます。Map tasks create intermediate files that are used by the reducer tasks. 中間圧縮により、中間ファイルのサイズが縮小されます。Intermediate compression shrinks the intermediate file size.

通常、Hadoop ジョブでは I/O ボトルネックが発生します。Hadoop jobs are usually I/O bottlenecked. データを圧縮することで、I/O を高速化し、全体的なネットワーク転送速度を向上させることができます。Compressing data can speed up I/O and overall network transfer.

使用可能な圧縮の種類は次のとおりです。The available compression types are:

FormatFormat ツールTool アルゴリズムAlgorithm ファイル拡張子File Extension 分割可能かどうかSplittable?
GzipGzip GzipGzip DEFLATEDEFLATE .gz いいえNo
Bzip2Bzip2 Bzip2Bzip2 Bzip2Bzip2 .bz2 はいYes
LZOLZO Lzop LZOLZO .lzo はい (インデックス付きの場合)Yes, if indexed
SnappySnappy 該当なしN/A SnappySnappy SnappySnappy いいえNo

原則として、分割可能な圧縮方法を使用することが重要です。そうしないと、作成されるマッパーが少数になります。As a general rule, having the compression method splittable is important, otherwise few mappers will be created. 入力データがテキストの場合は、bzip2 が最適なオプションです。If the input data is text, bzip2 is the best option. ORC 形式の場合、Snappy が最速の圧縮オプションです。For ORC format, Snappy is the fastest compression option.

  1. 中間圧縮を有効にするには、Hive の [Configs](構成) タブに移動し、hive.exec.compress.intermediate パラメーターを true に設定します。To enable intermediate compression, navigate to the Hive Configs tab, and then set the hive.exec.compress.intermediate parameter to true. 既定値は false です。The default value is false.

    'Hive exec compress intermediate'

    注意

    中間ファイルを圧縮する場合、コーデックに高圧縮の出力がなくても、CPU コストが低い圧縮コーデックを選択します。To compress intermediate files, choose a compression codec with lower CPU cost, even if the codec doesn't have a high compression output.

  2. 中間圧縮コーデックを設定するには、mapred.map.output.compression.codec カスタム プロパティを hive-site.xml ファイルまたは mapred-site.xml ファイルに追加します。To set the intermediate compression codec, add the custom property mapred.map.output.compression.codec to the hive-site.xml or mapred-site.xml file.

  3. カスタム設定を追加するには、次の手順を実行します。To add a custom setting:

    a.a. [Hive] > [Configs](構成) > [Advanced](詳細) > [Custom hive-site](カスタム hive-site) に移動します。Navigate to Hive > Configs > Advanced > Custom hive-site.

    b.b. [Custom hive-site](カスタム hive-site) ウィンドウの下部にある [Add Property...](プロパティの追加...) を選択します。Select Add Property... at the bottom of the Custom hive-site pane.

    c.c. [Add Property](プロパティの追加) ウィンドウで、キーとして mapred.map.output.compression.codec、値として org.apache.hadoop.io.compress.SnappyCodec を入力します。In the Add Property window, enter mapred.map.output.compression.codec as the key and org.apache.hadoop.io.compress.SnappyCodec as the value.

    d.d. [追加] を選択します。Select Add.

    'Apache Hive のカスタム プロパティの追加'

    この設定により、Snappy 圧縮を使用して中間ファイルが圧縮されます。This setting will compress the intermediate file using Snappy compression. プロパティが追加されると、[Custom hive-site](カスタム hive-site) ウィンドウに表示されます。Once the property is added, it appears in the Custom hive-site pane.

    注意

    この手順により、$HADOOP_HOME/conf/hive-site.xml ファイルが変更されます。This procedure modifies the $HADOOP_HOME/conf/hive-site.xml file.

最終出力を圧縮するCompress final output

Hive の最終出力を圧縮することもできます。The final Hive output can also be compressed.

  1. Hive の最終出力を圧縮するには、Hive の [Configs](構成) タブに移動し、hive.exec.compress.output パラメーターを true に設定します。To compress the final Hive output, navigate to the Hive Configs tab, and then set the hive.exec.compress.output parameter to true. 既定値は false です。The default value is false.

  2. 出力圧縮コーデックを選択するには、前のセクションの手順 3. で説明したように、[Custom hive-site](カスタム hive-site) ウィンドウに mapred.output.compression.codec カスタム プロパティを追加します。To choose the output compression codec, add the mapred.output.compression.codec custom property to the Custom hive-site pane, as described in the previous section's step 3.

    Apache Hive のカスタム プロパティの追加 2

予測実行を有効にするEnable speculative execution

予測実行では、実行速度の遅いタスクトラッカーを検出して拒否一覧に登録するために、特定の数の重複タスクが起動されます。Speculative execution launches a certain number of duplicate tasks to detect and deny list the slow-running task tracker. 個々のタスクの結果を最適化することで、全体的なジョブの実行を改善します。While improving the overall job execution by optimizing individual task results.

大量の入力を伴う実行時間の長い MapReduce タスクでは、予測実行を有効にしないでください。Speculative execution shouldn't be turned on for long-running MapReduce tasks with large amounts of input.

  • 予測実行を有効にするには、Hive の [Configs](構成) タブに移動し、hive.mapred.reduce.tasks.speculative.execution パラメーターを true に設定します。To enable speculative execution, navigate to the Hive Configs tab, and then set the hive.mapred.reduce.tasks.speculative.execution parameter to true. 既定値は false です。The default value is false.

    Hive mapred reduce tasks speculative execution

動的パーティションを調整するTune dynamic partitions

Hive では、個々のパーティションを事前に定義せずに、レコードをテーブルに挿入するときに動的パーティションを作成できます。Hive allows for creating dynamic partitions when inserting records into a table, without predefining every partition. これは強力な機能です。This ability is a powerful feature. ただし、これにより多数のパーティションが作成される可能性があります。Although it may result in the creation of a large number of partitions. また、各パーティションには多数のファイルが含まれます。And a large number of files for each partition.

  1. Hive で動的パーティションを実行するには、hive.exec.dynamic.partition パラメーターの値が true (既定値) である必要があります。For Hive to do dynamic partitions, the hive.exec.dynamic.partition parameter value should be true (the default).

  2. 動的パーティション モードを strict に変更します。Change the dynamic partition mode to strict. strict モードでは、少なくとも 1 つのパーティションが静的である必要があります。In strict mode, at least one partition has to be static. この設定により、WHERE 句にパーティション フィルターがないクエリを防ぐことができます。つまり、strict はすべてのパーティションをスキャンするクエリを防ぎます。This setting prevents queries without the partition filter in the WHERE clause, that is, strict prevents queries that scan all partitions. Hive の [Configs](構成) タブに移動し、hive.exec.dynamic.partition.modestrict に設定します。Navigate to the Hive Configs tab, and then set hive.exec.dynamic.partition.mode to strict. 既定値は nonstrict です。The default value is nonstrict.

  3. 作成する動的パーティションの数を制限するには、hive.exec.max.dynamic.partitions パラメーターを変更します。To limit the number of dynamic partitions to be created, modify the hive.exec.max.dynamic.partitions parameter. 既定値は 5000 です。The default value is 5000.

  4. ノードあたりの動的パーティションの総数を制限するには、hive.exec.max.dynamic.partitions.pernode を変更します。To limit the total number of dynamic partitions per node, modify hive.exec.max.dynamic.partitions.pernode. 既定値は 2000 です。The default value is 2000.

ローカル モードを有効にするEnable local mode

Hive のローカル モードでは、1 台のコンピューター上のジョブのすべてのタスクを実行できます。Local mode enables Hive to do all tasks of a job on a single machine. または、場合によっては 1 つのプロセスで実行されます。Or sometimes in a single process. この設定により、入力データが小さい場合にクエリのパフォーマンスが向上します。This setting improves query performance if the input data is small. また、クエリのタスクを開始するオーバーヘッドがクエリの全体的な実行のかなりの割合を消費する場合、クエリのパフォーマンスが向上します。And the overhead of launching tasks for queries consumes a significant percentage of the overall query execution.

ローカル モードを有効にするには、「中間圧縮を有効にする」の手順 3. で説明したように、[Custom hive-site](カスタム hive-site) ウィンドウに hive.exec.mode.local.auto パラメーターを追加します。To enable local mode, add the hive.exec.mode.local.auto parameter to the Custom hive-site panel, as explained in step 3 of the Enable intermediate compression section.

Apache Hive の実行モードのローカル オート

単一の MapReduce の MultiGROUP BY を設定するSet single MapReduce MultiGROUP BY

このプロパティを true に設定すると、共通の group-by キーを使用する MultiGROUP BY クエリによって、単一の MapReduce ジョブが生成されます。When this property is set to true, a MultiGROUP BY query with common group-by keys generates a single MapReduce job.

この動作を有効にするには、「中間圧縮を有効にする」の手順 3. で説明したように、[Custom hive-site](カスタム hive-site) ウィンドウに hive.multigroupby.singlereducer パラメーターを追加します。To enable this behavior, add the hive.multigroupby.singlereducer parameter to the Custom hive-site pane, as explained in step 3 of the Enable intermediate compression section.

Hive で単一の MapReduce の MultiGROUP BY を設定

Hive のその他の最適化Additional Hive optimizations

以下のセクションでは、設定可能な Hive 関連のその他の最適化について説明します。The following sections describe additional Hive-related optimizations you can set.

結合の最適化Join optimizations

Hive の既定の結合の種類は "シャッフル結合" です。The default join type in Hive is a shuffle join. Hive では、特別なマッパーが入力を読み取り、中間ファイルに結合キーと値のペアを生成します。In Hive, special mappers read the input and emit a join key/value pair to an intermediate file. Hadoop は、シャッフル ステージでこれらのペアを並べ替えてマージします。Hadoop sorts and merges these pairs in a shuffle stage. このシャッフル ステージはコストがかかります。This shuffle stage is expensive. データに基づいて適切な結合を選択すると、パフォーマンスを大幅に向上させることができます。Selecting the right join based on your data can significantly improve performance.

結合の種類Join Type タイミングWhen 方法How Hive の設定Hive settings 説明Comments
シャッフル結合Shuffle Join
  • 既定の選択肢Default choice
  • 常に動作Always works
  • テーブルの 1 つの一部から読み取るReads from part of one of the tables
  • 結合キーをバケット処理して並べ替えるBuckets and sorts on Join key
  • 各 Reduce にバケットを 1 つ送信するSends one bucket to each reduce
  • 結合は Reduce 側で実行されるJoin is done on the Reduce side
Hive の重要な設定は不要No significant Hive setting needed 毎回動作するWorks every time
マップ結合Map Join
  • 1 つのテーブルがメモリに収まるOne table can fit in memory
  • 小さなテーブルをメモリ ハッシュ テーブルに読み込むReads small table into memory hash table
  • 大きなファイルの一部からストリーミングするStreams through part of the large file
  • ハッシュ テーブルの各レコードを結合するJoins each record from hash table
  • 結合はマッパーが単独で実行するJoins are by the mapper alone
hive.auto.confvert.join=true 高速だが制限があるFast, but limited
並べ替え/マージ/バケット処理Sort Merge Bucket 両方のテーブルが次の状態の場合:If both tables are:
  • 同様に並べ替えられているSorted the same
  • 同様にバケット処理されているBucketed the same
  • 並べ替え/バケット処理が行われた列で結合しているJoining on the sorted/bucketed column
各プロセス:Each process:
  • 各テーブルからバケットを読み取るReads a bucket from each table
  • 最小値を含む行を処理するProcesses the row with the lowest value
hive.auto.convert.sortmerge.join=true 効率性Efficient

実行エンジンの最適化Execution engine optimizations

Hive 実行エンジンの最適化に関するその他の推奨事項を次に示します。Additional recommendations for optimizing the Hive execution engine:

設定Setting 推奨Recommended HDInsight の既定値HDInsight Default
hive.mapjoin.hybridgrace.hashtable True = 安全性は高いが低速、false = 高速True = safer, slower; false = faster falsefalse
tez.am.resource.memory.mb ほとんどの場合、上限は 4 GB4-GB upper bound for most Auto-TunedAuto-Tuned
tez.session.am.dag.submit.timeout.secs 300+300+ 該当なし300
tez.am.container.idle.release-timeout-min.millis 20000+20000+ 1000010000
tez.am.container.idle.release-timeout-max.millis 40000+40000+ 2000020000

次のステップNext steps