ハイブチューニング操作

1. hive.fetch.task.conversion = more属性がmoreに変更された後、mapreduceはグローバル検索、フィールド検索、制限検索などで使用されなくなります。

2.入力データ量が少ない場合、クエリトリガータスクの実行時間は実際のジョブの実行時間より長くなる場合があります。Hiveはローカルモードで1台のマシン上のすべてのタスクを処理できます。小さなデータセットの場合、実行時間を大幅に短縮できます

//开启本地 mr
hive.exec.mode.local.auto=true 

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

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

3.結合タイムアウトは、一部のキーが多すぎるデータに対応し、同じキーに対応するデータが同じレデューサーに送信され、メモリが不足することが原因である場合があります。
したがって、これらの異常値は、最初に対処する必要があります。たとえば、null値でキーをフィルタリングするか、null値でキーに特別な識別子+乱数を追加してから、reduceステージで識別子を削除して実行します。集計操作。

4. MapJoin操作で、Reducer側で集約すると、キーのスキューが多すぎるために特定のキーの処理が遅くなる場合があります。MapJoinの場合、小さなテーブルが各Map側のメモリにブロードキャストされ、キャッシュから出て、Map側で結合操作を直接実行します。

// 开启Mapper端join,默认为 true
hive.auto.convert.join = true; 

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

5. GroupBY操作。デフォルトでは、マップフェーズの同じキーデータが1つのレデューサーに配布されます。キーデータが大きすぎると、傾斜します。

// 开启Map端join操作
hive.map.aggr = true

// 在 Map 端进行聚合操作的条目数目
hive.groupby.mapaggr.checkinterval = 100000

// 当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结
// 果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以
// 保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。
hive.groupby.skewindata = true


6.カウント(個別)重複排除統計

データ量が少ない場合は問題ありません。データ量が多い場合は、ReduceタスクでCOUNT DISTINCT操作を完了する必要があるため、このReduceが処理する必要のあるデータ量が多すぎます。これにより、ジョブ全体の完了が困難になり
ます通常、COUNT DISTINCTが使用され、最初にGROUP BYに置き換えてから、COUNTに置き換えます


7.デカルト積を避けるようにしてください。参加するときは、条件を追加したり、条件を無効にしたりしないでください。ハイブは、デカルト積を完成させるために1つのレデューサーしか使用できません。


8、ランクフィルタリング

列処理:SELECTでは、必要な列のみを取得し、必要な場合は可能な限りパーティションフィルタリングを使用し、SELECT * lessを使用します。

行処理:パーティションの調整で、外部関連付けが使用されている場合、2次テーブルのフィルター条件がWhereの後に書き込まれると、テーブル全体が最初に関連付けられ、次にフィルター処理されます。

9.動的パーティション調整 

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

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

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

// 在每个执行 MR 的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。
hive.exec.max.dynamic.partitions.pernode=100

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

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

10.マップタスクの数を調整します。HiveのマップはBlockSizeサイズのファイルに対応しているため、この値を変更することでマップデータを増減できます。

// 小文件合并
hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

// 修改每个切片的最大的大小
mapreduce.input.fileinputformat.split.maxsize=100;

11、 调整Reduce任务数目

// 每个 Reduce 处理的数据量默认是 256MB
hive.exec.reducers.bytes.per.reducer=256000000

// 每个任务最大的 reduce 数,默认为 1009
hive.exec.reducers.max=1009

11.並列実行

//打开任务并行执行
hive.exec.parallel=true; 

//同一个 sql 允许最大并行度,默认为 8。
hive.exec.parallel.thread.number=16; 


12. JVMの再利用、JVMの再利用により、JVMインスタンスを同じジョブでN回再利用できます。

<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の再利用を有効にすると、再利用のために使用済みのタスクスロットが常に占有され、タスクが完了するまで解放されないことです。「不均衡な」ジョブの場合、タスクの実行時間
を短縮するよりもはるかに時間のかかるタスクを削減する場合、予約済みのスロットはアイドル状態になり、他のジョブは使用できなくなります。すべてのタスクが終了するまで解放されません。 。


13.投機的実行

Hadoopは投機的実行メカニズムを採用しており、特定のルールに従って「再配置」されたタスクを推測し、そのようなタスクのバックアップタスクを開始して
、タスクが元のタスクと同時に同じデータを処理できるようにし、最後にほとんどタスクを正常に実行した場合の計算結果が最終結果です。

<property>
 <name>mapreduce.map.speculative</name>
 <value>true</value>
 <description>If true, then multiple instances of some map tasks may be executed in parallel.</description>
</property>

<property>
 <name>mapreduce.reduce.speculative</name>
 <value>true</value>
 <description>If true, then multiple instances of some reduce tasks may be executed in parallel.</description>
</property>

 

おすすめ

転載: blog.csdn.net/qq_32323239/article/details/114254655