ハイブの最適化



Hive Optimization



まず、ハイブテーブルが小さなファイルを再マージします

merge_file = '
mapreduce.input.fileinputformat.split.maxsize = 268435456を設定します
mapreduce.input.fileinputformat.split.minsize.per.node = 268435456を設定します
mapreduce.input.fileinputformat.split.minsize.per.rack = 268435456を設定します
テーブルapp.search_keyword_analyise_base_v1パーティションを変更します(dt = 'c u r r d a t e ')c o n c a t e n a t e&quot h i v e − e&quot curr_date&#x27)連結&quot hive -e&quotmerge_file '

第三に、Hiveクエリの最適化

/** First, the number of mapper settings ** / spark.sql('set mapred.min.split.size.per.node=256000000') spark.sql('set mapred.min.split.size.per.rack=256000000') spark.sql('set mapred.max.split.size=256000000')

説明:

その主なアイデアは、入力ディレクトリ内の大きなファイルを複数のマップ入力に分割し、小さなファイルをマップ入力にマージすることです。具体的な原則は、次の3つのステップです。



  1. 入力ディレクトリ内の各ファイルによると、その長さがmapred.max.split.sizeを超えると、ブロック単位で複数の分割に分割され(1つの分割はマップ入力です)、各分割はmapred.maxより長くなります。 Split.sizeはブロック内にあるため、blockSizeよりも大きくなります。このファイルの残りの長さがmapred.min.split.size.per.nodeより大きい場合、分割が生成されます。それ以外の場合は、一時的に予約されます。
  2. 残っているのは、長さがmapred.max.split.sizeを超えて分割にマージされる限り、そして最後に残りのピースがmapred.minよりも優れている場合に限り、各ラックの下のピースをマージする、いくつかの短命のピースです。スプリット。 Size.per.rackが大きい場合は、分割にマージされます。それ以外の場合は、一時的に予約されます。
  3. 長さがmapred.max.split.sizeを超える限り、異なるラックの下でフラグメントを結合し、それらを1つの分割にマージします。残りのフラグメントは、長さに関係なく1つの分割にマージされます。
    例:mapred.max.split.size = 1000
    mapred.min.split.size.per.node = 300
    mapred.min.split.size.per.rack = 100

ディレクトリに5つのファイルを入力します。rack1の下に3つのファイル、長さは2050、1499、10、rack2は2つのファイル、長さは1010、80です。他のblockSizeは500です。

最初のステップの後、5つの分割が生成されます:1000、1000、1000、499、1000。残りの部分はrack1の下にあります:50、10はrack2の下にあります10:80



2つのラックの下のフラグメントは100を超えないため、分割とフラグメントは2番目のステップの後で変更されません。

3番目のステップは、4つのフラグメントを150の長さの1つの分割にマージすることです。

マップの数を減らしたい場合は、mapred.max.split.sizeを増やすことができます。それ以外の場合は、調整できます。



その特徴は次のとおりです。最大でマップ入力としてのブロック、ファイルに複数のブロックがある場合、ブロックが複数に分割されているためファイルを別のマップ入力として使用する場合、マップが複数のブロックを処理する場合、複数のファイルを処理する場合があります。
// hive.map.aggr = trueマップ側で集計するかどうか、デフォルトはTrueです
// hive.groupby.mapaggr.checkinterval = 100000マップ側で集計するエントリの数

/** Second, the number of reducer settings ** / //1 The amount of data processed by each reduce task, the default is 1000^3=1G (in addition, mapred.reduce.tasks can force the number of tasks for reduce) spark.sql('set hive.exec.reducers.bytes.per.reducer=100000000') //2 hive.exec.reducers.max (the maximum number of reduce per task, default is 999) //spark.sql('set hive.exec.reducers.max=999') //So calculate the number of reducers N=min( hive.exec.reducers.max , total input data volume / hive.exec.reducers.bytes.per.reducer ) /** Third, set up small file merge ** / //map output file merge spark.sql('set hive.merge.mapfiles=true') //reduce output file merge spark.sql('set hive.merge.mapredfiles=true') / / Merge the size of the file spark.sql('set hive.merge.size.per.task=256000000') /** Fourth, solve the data skew: divided into two MR jobs ** / spark.sql('set hive.groupby.skewindata=true')