二、ハイブチューン

ハイブは、いくつかのチューニング戦略を使用している以下の

、フェッチクロール

手段をフェッチフェッチ、いくつかのケースのためのハイブクエリは必ずしもMapReduceの計算を使用することはできません。たとえば:;この場合には、ハイブは、単に従業員に対応するファイル格納ディレクトリを読み取ることができ、およびコンソールへのクエリ結果を出力し、従業員SELECT * FROM。
Hive.fetch.task.conversionデフォルトハイブ-default.xml.templateファイルに複数ある、古いバージョンのハイブのデフォルトは、プロパティは後でフィールド、限界値を見つける、グローバル検索では、より多くの修正されたので、MapReduceのを離れて見ていない最小限であります。

<property>
    <name>hive.fetch.task.conversion</name>
    <value>more</value>
    <description>
      Expects one of [none, minimal, more].
      Some select queries can be converted to single FETCH task minimizing latency.
      Currently the query should be single sourced not having any subquery and should not have
      any aggregations or distincts (which incurs RS), lateral views and joins.
      0. none : disable hive.fetch.task.conversion     禁用fetch抓取
      1. minimal : SELECT STAR, FILTER on partition columns, LIMIT 
                   只有select分区字段,以及limit时才能使用fetch(不走MapReduce)
      2. more  : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns)
                  字段查找,limit都不走MapReduce
    </description>
  </property>

また、一時的にコマンドラインハイブに、このパラメータの値を変更することができます:

hive (default)> set hive.fetch.task.conversion=more;

第二に、ローカルモード

時には、入力データハイブの量が非常に少ないです。この場合は、タスクを消費するクエリの実行時間のトリガは、実際のジョブの実行時間よりもはるかに多くのことがあります。これらのケースのほとんどのために、ハイブローカルモードでは、単一のマシン上のすべてのタスクを処理することができます。小さなデータセットの場合、実行時間を大幅に短縮することができます。つまり、唯一のマップを起動して作業を軽減し、単一のホスト上で実行されます。次のように関連するパラメータは次のとおりです。

//开启本地mr,自动根据下面的配置决定是否使用本地模式
set hive.exec.mode.local.auto=true;  

//设置local mr的最大输入数据量,当输入数据量小于这个值时采用local  mr的方式,默认为134217728bytes,即128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;

//设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4
set hive.exec.mode.local.auto.input.files.max=10;

第三に、最適化テーブル

3.1大きなテーブル小さなテーブルに参加

さらに、より小さな寸法のグループを使用することができ、左側のテーブルが最初に読み出されるので効果的に発生メモリオーバーフローエラーの可能性を低減することができる結合の左側のテーブルのキーは比較的分散され、少量のデータ、テーブルの高度なメモリ(1000以下のレコード番号)。マップを完了するために、終了を減らします。
ハイブの新しいバージョンは、小さなテーブルのJOIN JOINの小さなテーブルの上に大きなテーブルがあり、大きなテーブルが最適化されています。実際の試験は、ことがわかりました。左右の小さなテーブルには有意な差がありません。

3.2大きなテーブルには、大きなテーブルを結合します

この実験は、その実行時間とを含めて、ジョブの実行を確認するためにjobhistoryサーバーのHadoopのを開くことができます。

配置 mapred-site.xml
<property>
<name>mapreduce.jobhistory.address</name>
<value>bigdata111:10020</value>
</property>
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>bigdata111:19888</value>
</property>

启动历史服务器:
mr-jobhistory-daemon.sh start historyserver

进入historyserver 的web页面:
http://192.168.1.102:19888

二、ハイブチューン

図3.1ハイブ大チャート表は結果を結合します

あなたは、このような実行時間などの状態パラメータ、結果の実装の結果を見ることができる仕事がたくさんあります。

3.2.1空のキーフィルター

同じキーと対応するデータに対応する特定のキーデータのあまりがメモリに結果が十分ではありません、同じ減速に送信されますので、時々タイムアウトに参加。我々は慎重にこれらの珍しい鍵を分析する必要があり、この時点では、多くの場合、これらのデータに対応するキーデータが異常である、我々は、SQL文でフィルタリングする必要があります。例えば、キーは、データが異常である場合、それは除外されるべき、ヌルです。例えば:

 insert overwrite table jointable 
select n.* from (select * from nullidtable where id is not null ) n  left join ori o on n.id = o.id;
这里就事先对 nullidtable 表中 id 为null 的行过滤掉。
但是要注意,确定key是null的数据是无效数据时才过滤,如果是有效数据就不能采用这种方式了

3.2.2空のキー変換

時々、大量のデータに対応するキーブランクは、対応するデータが異常なデータではありませんが、ランダムな値を割り当てるようにされて参加し、この場合には、我々が一覧表示することができますキーブランクフィールドの結果に含まれなければならないデータ別の減速に一様にランダムに分割していません。例えば:

insert overwrite table jointable
select n.* from nullidtable n full join ori o on 
case when n.id is null then concat('hive', rand()) else n.id end = o.id;

使用 case when xxx then value1 else id end  语句判断id是否为空,为空则用随机数替代,否则直接

3.3オープン自動的に参加マップ

ステージに参加完了を削減:いいえMapJoin MapJoin場合、または条件を満たしていない、意志はその後、ハイブが共通に変換パーサは、すなわち、操作に参加しましょう。データが発生しやすいスキュー。MapJoin小さなテーブルには、すべての減速処理は避け、最後にメモリ・マップに参加ロードすることができます。
使用して小さなテーブルが参加減らしたときに我々はより多くのマップの使用に比べてはるかに少ないが参加する方法よりも、指定することができます

(1)设置自动选择Mapjoin
set hive.auto.convert.join = true; 默认为true

(2)大表小表的阈值设置(默认25M一下认为是小表):
set hive.mapjoin.smalltable.filesize=25000000;

自動負荷分散により、3.4グループ

データの傾きのキーが大きすぎると、削減に配布、同じデータの主な段階の地図、重合デフォルトを減らしてください。いないすべての重合操作は、最後の削減、重合操作の多くは、マップの端に部分的に重合最初に行うことが可能で行われる最後の削減という結論で最終的な結果を必要としています。

(1)是否在Map端进行聚合,默认为True
    hive.map.aggr = true
(2)在Map端进行聚合操作的条目数目
    hive.groupby.mapaggr.checkinterval = 100000
(3)有数据倾斜的时候进行负载均衡(默认是false)
    hive.groupby.skewindata = true
当这一项设置为true时,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。

再カウントすることにより第一のグループに3.5統計的重み

場合は、通常の状況選挙統計ので、我々は、重複排除後のデータの行数を数えます:

select count(distinct id) from bigtable;

それは全体の重量にあるので、この方法では、巨大な欠陥があり、そうするMapReduceは、複数のタスクの減速を使用することができないときに使用する場合には、重いの部分になりますが、全体的に重い行くことを保証するものではありません。この場合、負荷の減速が実際に素晴らしいですが、次のような方法を最適化するために使用することができます。

select count(id) from (select id from bigtable group by id) a;

まずによってIDグループに応じたMapReduceを開始し、このプロセスは、既にディエンファシスであり、それは減速タスクよりも多くのグループで使用することができますので、あなたは、単一の減速の圧力を減らすことができます。別のMapReduceを開始した後、統計によるデータグループの後の行数を数えます。だからここ2つのMapReduceのジョブが実行されるタスクになっているので、このように注意を払うときにのみ、大規模なデータのボリューム、またはマルチタスクスケジューリングが、より多くのリソースを占有し、効率が良くありません。

3.6フィルタの仲間入りをする前に実施

列フィルタ:*選択しても照会することが指定されたフィールドを使用しないようにしよう
ラインフィルタ:あなたは、いくつかの行をフィルタするために、テーブルをしたい場合は、当社の外部では、参加します。最初の前の元の増加よりデータが後に参加するので、より長いフィルタ処理するために、再度濾過した後2つのテーブルを結合するためにない、参加フィルタリングされなければなりません。
濾過後に参加:

select o.id from bigtable b
join ori o on o.id = b.id
where o.id <= 10;

所以where语句不要放在join之后,这是不好的,大数据量的时候耗时很长

フィルタリングの前に参加:

select b.id from bigtable b
join (select id from ori where id <= 10 ) o on b.id = o.id;

这里就是先对ori表进行id列的过滤,过滤后的数据再和bigtable表join

3.7動的パーティション調整を開き

ハイブは、テーブルのパーティションテーブルの場合は、通常の状況下では、我々はあなたがはっきりパーティションに挿入されているかを指定する必要があり、挿入時間を挿入します。オープンダイナミックパーティション、パーティションフィールドはパーティションが存在しない場合は、自動的に、指定されたパーティションにインポートし、インポートデータに基づいて行われます場合は、それが自動的に作成されます。

(1)开启动态分区功能(默认true,开启)
hive.exec.dynamic.partition=true

(2)设置为非严格模式(动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。)
hive.exec.dynamic.partition.mode=nonstrict

(3)在所有执行MR的节点上,最大一共可以创建多少个动态分区。
hive.exec.max.dynamic.partitions=1000

(4)在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。
hive.exec.max.dynamic.partitions.pernode=100

(5)整个MR Job中,最大可以创建多少个HDFS文件。
hive.exec.max.created.files=100000

(6)当有空分区生成时,是否抛出异常。一般不需要设置。
hive.error.on.empty.partition=false

例:
オンデマンド:時間データに従ってORI(例:20111230000008)、ターゲットテーブルori_partitioned_targetの対応するパーティション内に挿入

(1)创建分区表
create table ori_partitioned(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) 
partitioned by (p_time bigint) 
row format delimited fields terminated by '\t';
(2)加载数据到分区表中
hive (default)> load data local inpath '/opt/module/datas/ds1' into table ori_partitioned partition(p_time='20111230000010') ;
hive (default)> load data local inpath '/opt/module/datas/ds2' into table ori_partitioned partition(p_time='20111230000011') ;
(3)创建目标分区表
create table ori_partitioned_target(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) PARTITIONED BY (p_time STRING) row format delimited fields terminated by '\t';
(4)设置动态分区
set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.exec.max.dynamic.partitions = 1000;
set hive.exec.max.dynamic.partitions.pernode = 100;
set hive.exec.max.created.files = 100000;
set hive.error.on.empty.partition = false;

hive (default)> insert overwrite table ori_partitioned_target partition (p_time) 
select id, time, uid, keyword, url_rank, click_num, click_url, p_time from ori_partitioned;

第四に、データ・スキュー

マップの4.1合理的なセット数

小さな多数のファイルがマップの多数につながった4.1.1

この問題でのMapReduceは小さな多数のファイルは、マップタスクの多くを生成するためにバインドされている場合、デフォルトでは、ファイルには、少なくとも1つのスライスで、各スライスにファイル全体であると述べました。問題は、ハイブでも同じです。
ソリューション:
マップの数を減らし、小さなマップファイルの前に実行するためにマージ:CombineHiveInputFormatは、小さなファイルをマージする機能(デフォルトのフォーマット)を持っています。HiveInputFormatは小さなファイルのための機能をマージしません。
hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormatを設定します。

4.1.2単一マップの操作のオーバーロード

各マップの実行が非常に遅い場合、おそらく複雑な処理ロジックのため、この時間は、各マップの作業負荷を軽減するために、マップの数を増やし、スライスの小さなスポットサイズの設定とみなすことができます。
computeSliteSize(Math.max(に、minSize、Math.min(マップ法増加 maxSizeの、ブロックサイズ)))=ブロックサイズ= 128M 式maxSizeの最大調整。最大ブロックサイズは、マップの数を増やすことができるよりmaxSizeと低くしてみましょう。

设置最大切片值为100个字节
hive (default)> set mapreduce.input.fileinputformat.split.maxsize=100;

这里只是例子,具体设置为多大,根据具体情况决定

4.2合理的なセット減らすの数

調整:

(1)每个Reduce处理的数据量默认是256MB
hive.exec.reducers.bytes.per.reducer=256000000
(2)每个任务最大的reduce数,默认为1009
hive.exec.reducers.max=1009
(3)计算reducer数的公式
N=min(参数2,总输入数据量/参数1)

注:

1)起動と初期化時間とリソースを消費します過剰減らす;
2)また、数が削減、出力ファイルの数があるでしょう、あなたは小さなたくさんのファイルを生成する場合、そうであれば、次のタスクとしてこれらの小さなファイル入力ファイルには問題も発生する可能性が小さすぎると、
設定は数を減らすには、彼らはまた、これらの2つの原則を考慮する必要があります。数を減らし、適切なを使用して大量のデータを処理するために、シングルタスクに合うようにデータサイズの量を減らします。

第五に、開いている同時実行

ハイブ問合せは、一つまたは複数の段階に変換されます。この段階では、MapReduceのステージサンプリング位相、統合相、リミット舞台ことができます。またはプロセスハイブの実装の他の段階が必要になることがあります。デフォルトでは、ハイブ一度だけ実行ステージによります。しかし、特定のジョブがステージの数を含んでいてもよいし、これらの段階は、互いに完全に依存しないかもしれない、それは、全体のジョブの実行時間を短縮させることができるので、いくつかのステージは、並列に実行することができると言うことです。以上の段階を並列に実行することができますがある場合は、ジョブがより速く完了することができます。
パラメータを設定することにより、Hive.exec.parallelは、それが同時に開くことができ、本当です。しかし、共有クラスタ内で、我々は並列位相増加ジョブは、クラスタの利用率が増加した場合、次の注意を払う必要があります。

set hive.exec.parallel=true;              //打开任务并行执行
set hive.exec.parallel.thread.number=16;  //同一个sql允许最大并行度,默认为8。

第六に、strictモードをオン

ハイブは、あなたは悪ではない意思に影響を与えた可能性があるクエリを実行するユーザーを防ぐことができ、strictモードを提供します。厳密でモデルhive.mapred.modeの厳密でのデフォルトの属性値を設定することにより。strictモードをオンにすると、変更hive.mapred.modeが厳しい、厳格なモードを無効にすることができるクエリの3種類になっている必要があり。

<property>
    <name>hive.mapred.mode</name>
    <value>strict</value>
    <description>
      The mode in which the Hive operations are being performed. 
      In strict mode, some risky queries are not allowed to run. They include:
        Cartesian Product.
        No partition being picked up for a query.
        Comparing bigints and strings.
        Comparing bigints and doubles.
        Orderby without limit.
    </description>
  </property>

:次の3つの条件のSQL文の実行の制限
句を含むの範囲を限定する、または許可しないためのフィルタ条件ない限り、1)、パーティションテーブル、パーティションフィールド。言い換えれば、ユーザーはすべてのパーティションをスキャンすることが許可されています。この制限のためになる理由は、パーティションテーブルは通常、非常に大規模なデータセットを持っているということであり、データが急増します。いいえパーティションの制限クエリは、このテーブルに対処するために許容できないほど膨大なリソースを消費することはできません。
2)リミット文の使用を要求文により、クエリの順序のために。ソート処理を実行するためによる順序は同じリデューサーで処理されているすべての結果のデータに配布されるので、力のユーザーは、長い時間のために減速追加の実行を防ぐことができLIMIT文を増加させます。
3)クエリのデカルト積を制限します。リレーショナルデータベース・ユーザーの非常に理解は、クエリの実行中にON文のJOINが、文は、リレーショナルデータベース・オプティマイザが効率的にONステートメントWHERE句に変換することができ、実行場所を使用して使用しないことを期待することがあります。残念ながら、ハイブは、テーブルが十分に大きい場合は、クエリが手に負えない状況になり、そのため、この最適化を実行しません。

七のオープンJVMの再利用

JVM再利用コンテンツのHadoopチューニングパラメータ、ハイブのパフォーマンスは、小さなファイルの、特に多数のシーンやタスクシーンを回避することは困難である、特にために、非常に大きな影響を与え、シナリオの実行時間のこのタイプのほとんどは非常に短いです。
Hadoopののデフォルトの設定は、通常のマップを実行し、作業を軽減するためにJVMを使用して導出されます。この時点で、JVMの起動プロセスは、特にジョブの実行が数百タスクタスクの状況が含まれ、かなりのオーバーヘッドが発生する可能性があります。JVM JVMインスタンスは、そのような再利用は、同じジョブでN回再使用することができます。Nの値は、Hadoopのmapred-site.xmlファイルに配置されてもよいです。通常10〜20の間、特定の必要性は、特定のビジネス・シナリオに基づいて、どのくらいの星をテストします。

<property>
  <name>mapreduce.job.jvm.numtasks</name>
  <value>10</value>
  <description>How many tasks to run per jvm. If set to -1, there is
  no limit. 
  </description>
</property>

この電流はまた、欠点を持って、この欠点機能はジョブ全体が終了するのので、それが言う、常にタスクを解放するために完了するまで、再利用のためのスロットを使用するタスクを取り上げるJVMの再利用になって、すべてのJVMを占領しましたこれはリリースされます。「アンバランス」の仕事はいくつかある場合は、タスクを削減し、全体のジョブが予約されたスロットはなりませんが、他のアイドルの仕事よりも消費する他の多くの時間のタスクの実行時間を短縮すべてのタスクはリリース前に終わるまで使用しています。

八、投機的実行

投機のMapReduceのMapReduceの投機的実行は、ここでは繰り返さない、関連するコンテンツの実装の一部を参照してください。
ハイブ自体は投機減らす側の実行を制御するための構成アイテムを提供してきました。

<property>
    <name>hive.mapred.reduce.tasks.lative.execution</name>
    <value>true</value>
    <description>Whether speculative execution for reducers should be turned on. </description>
  </property>

これらの変数のチューニングの投機的実行は、特定の勧告を与えることは困難です。偏差は非常に敏感であるため、ユーザが実行している場合、機能は閉鎖することができます。ユーザ入力が長くマップを実行したり、タスクを削減するために必要な大量のデータから、その後、投機的実行によって引き起こされる廃棄物を起動すると、巨大な非常に大きいです。

九、圧縮を有効にします

これは、圧縮関連のコンテンツ「のhive--基本原則」を見ることができます。主に、データ伝送量を削減し、マップを低減し、低減された出力ファイルのサイズを低減するように最適化。

テンは、実行計画を表示します

sqlタスクを実行するときは、実行はポイントが最適化することができるかどうかを確認する方法の使用を説明するために期待されて見ることができます。

(1)查看下面这条语句的执行计划
hive (default)> explain select * from emp;

(2)查看详细执行计划
hive (default)> explain extended select * from emp;

おすすめ

転載: blog.51cto.com/kinglab/2447321