Grundlagen der Bienenstockoptimierung 1

1. Grundlagen der Hive-Optimierung 1

Bucketing aktivieren set hive.enforce.bucketing=true;
Anzahl der Reduzierungen festlegen set mapreduce.job.reduces=3;

  1. Hive Table -> Orc und Parquet -> ZLIB oder Snappy Parquet ist ein spaltenorientiertes Speicherformat für analytische Unternehmen

  2. Abruferfassung: Mapreduce wird nicht für die globale Suche, Feldsuche, Grenzsuche usw. verwendet. Setzen Sie hive.fetch.task.conversion=more; der Standardwert ist „none“.

  3. Lokaler Modus:
    a. hive.exec.mode.local.auto=true festlegen;
    b. Schwellenwert für lokalen Modus anpassen, hive.exec.mode.local.auto.inputbytes.max=51234560 festlegen; Standardwert ist 128 MB.
    c. Lokalen mr festlegen Die maximale Anzahl der Eingabedateien ist auf hive.exec.mode.local.auto.input.files.max=10 festgelegt; der Standardwert ist 4.

  4. Optimierung des Joins großer Tabellen und kleiner Tabellenkarten
    a. set hive.auto.convert.join = true; – der Standardwert ist true
    b. Schwellenwerteinstellung für kleine Tabellen: set hive.mapjoin.smalltable.filesize= 25000000; Standard 25M.

  5. Große Tabellenverknüpfung Große Tabelle:
    a. Nullschlüsselfilterung
    Vor der Optimierung: SELECT a.* FROM nullidtable a JOIN ori b ON a.id = b.id;
    Nach der Optimierung: SELECT a.* FROM (SELECT * FROM nullidtable WHERE id IS NOT NULL ) a JOIN ori b ON a.id = b.id;
    b. Konvertierung eines leeren Schlüssels
    Manchmal gibt es zwar einen leeren Schlüssel, aber viele entsprechende Daten entsprechen ihm, aber die entsprechenden Daten sind keine abnormalen Daten und müssen enthalten sein im Join-Ergebnis. Zu diesem Zeitpunkt können wir dem Feld, in dem der Schlüssel in Tabelle a leer ist, einen Zufallswert zuweisen, sodass die Daten zufällig und gleichmäßig auf verschiedene Reduzierer ohne Zufallsverteilung verteilt werden: SELECT a.*
    FROM
    nullidtable
    a
    LEFT JOIN ori b ON CASE, WENN a. id NULL IST, DANN 'hive' ELSE a.id END = b.id;
    Zufallsverteilung:
    SELECT a.*
    FROM nullidtable a
    LEFT JOIN ori b ON CASE, WENN a.id NULL IST, DANN concat ('hive', rand()) ELSE a.id END = b.id;

  6. SQL-Optimierung
    1. Spaltenbereinigung hive.optimize.cp=true (der Standardwert ist true) Lesen Sie nur die für die Abfrage erforderlichen Spalten.
    2. Partitionsbereinigung: Der Partitionsparameter lautet: hive.optimize.pruner=true (der Standardwert ist true)
    3. group by Wenn die Daten eines Schlüssels zu groß sind, sind die Daten verzerrt.
    (1) Ob eine Aggregation auf der Kartenseite durchgeführt werden soll, der Standardwert ist True
    set hive.map.aggr = true;
    (2) Die Anzahl der Einträge zum Durchführen von Aggregationsvorgängen auf der Kartenseite
    set hive.groupby .mapaggr.checkinterval = 100000;
    4. Count(distinct) (Denken Sie daran, dass es keine Rolle spielt, ob die Datenmenge klein ist und nicht verwendet werden darf (wenn die Datenmenge groß ist) Da der COUNT DISTINCT-Vorgang mit einer Reduzierungsaufgabe abgeschlossen werden muss, ist die Datenmenge
    , die diese Reduzierung verarbeiten muss,

  7. Lastausgleich: Generieren Sie zwei MR-Jobpläne. Im ersten MR-Job im ersten Job werden die
    Ausgabeergebnisse der Karte zufällig an die Reduzierung verteilt, und jede Reduzierung führt teilweise Aggregationsvorgänge durch,
    sodass die verarbeiteten Ergebnisse gleich sind Group By Keys können auf verschiedene Reduces verteilt werden, um den Zweck des Lastausgleichs zu erreichen. Der
    zweite MR-Job. Dieser Prozess kann sicherstellen, dass derselbe Group By Key auf denselben Reduce verteilt wird
    , und schließlich den endgültigen Aggregationsvorgang abschließen
    (3). mit Daten Lastausgleich bei Neigung (Standard ist falsch)
    set hive.groupby.skewindata = true;

  8. Kartesisches Produkt vermeiden (Join ohne Ein-Bedingung oder ungültige Bedingung vermeiden, Hive kann nur 1 Reduzierung verwenden, um das kartesische Produkt zu vervollständigen)

  9. Dynamische Partitionsanpassung
    (1) Aktivieren Sie die dynamische Partitionsfunktion (Standard true, open) set hive.exec.dynamic.partition=true;
    (2) Stellen Sie den Modus der dynamischen Partition auf den nicht strengen Modus ein, der Standardwert ist streng, was bedeutet dass mindestens eine Partition als statische Partition angegeben werden muss
    . Der nicht strikte Modus bedeutet, dass alle Partitionsfelder eine dynamische Partition verwenden können. set hive.exec.dynamic.partition.mode=nonstrict;
    (3) Die maximale Anzahl dynamischer Partitionen, die auf allen Knoten erstellt werden können, die MR ausführen. set hive.exec.max.dynamic.partitions=1000;
    (4) Die maximale Anzahl dynamischer Partitionen, die auf jedem Knoten erstellt werden können, der MR ausführt.
    Dieser Parameter muss entsprechend den tatsächlichen Daten eingestellt werden. set hive.exec.max.dynamic.partitions.pernode=100
    (5) Die maximale Anzahl von HDFS-Dateien, die im gesamten MR-Job erstellt werden können. set hive.exec.max.created.files=100000;
    (6) Ob eine Ausnahme ausgelöst werden soll, wenn eine leere Partition generiert wird. Im Allgemeinen ist keine Einstellung erforderlich. set hive.error.on.empty.partition=false;

  10. Datenverzerrung

    1. Ist es besser, mehr Karten zu haben? Viele kleine Dateien, jede kleine Datei wird als Block betrachtet und mit einer Karte vervollständigt, und die Start- und Initialisierungszeit einer Kartenaufgabe ist viel länger als die Logikverarbeitungszeit, was zu einer großen Ressourcenverschwendung führt. Lösung :
      Map-Nummer reduzieren
      set mapred.max.split.size=112345600;
      set mapred.min.split.size.per.node=112345600;
      set mapred.min.split.size.per.rack=112345600;
      drei Parameter bestimmen die Größe Größe des zusammengeführten Dateiblocks, größer als die Dateiblockgröße von 128 m, getrennt durch 128 m,
      kleiner als 128 m, größer als 100 m, getrennt durch 100 m und solche, die kleiner als 100 m sind (einschließlich kleiner Dateien und der übrigen getrennten großen Dateien) werden zusammengeführt
      set
      hive.input .format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
      Dieser Parameter gibt an, dass kleine Dateien vor der Ausführung zusammengeführt werden.

    Ist garantiert, dass jede Karte einen Dateiblock von etwa 128 m verarbeitet, sodass Sie sich zurücklehnen und entspannen können? 127 Millionen, nur zwei Felder, aber zig Millionen Datensätze, eine zu erledigende Kartenaufgabe, sehr zeitaufwändige
    Lösung: Erhöhen Sie die Anzahl der Karten, die auf
    mapred.reduce.tasks = 10 festgelegt sind; die Verarbeitung jeder Kartenaufgabe ist größer als 12 Millionen (mehrere Millionen). Wenn Sie Daten aufzeichnen, wird die Effizienz auf jeden Fall viel besser sein.
    Zusammenfassung: Um die Anzahl der Karten zu steuern, müssen Sie zwei Prinzipien befolgen: Sorgen Sie dafür, dass große Datenmengen die entsprechende Anzahl von Karten verwenden, und sorgen Sie dafür, dass eine einzelne Kartenaufgabe eine angemessene Datenmenge verarbeitet ; 2. Die Anzahl der Reduzierungen
    1.
    Hive selbst So bestimmen Sie die Anzahl der Reduzierungen:
    Legen Sie die von jeder Reduzierungsaufgabe verarbeitete Datenmenge fest.
    hive.exec.reducers.bytes.per.reducer=524288000; die von jeder Reduzierungsaufgabe verarbeitete Datenmenge Jede Reduzierungsaufgabe ist standardmäßig auf 1 GB eingestellt: Wenn die Gesamtgröße der Quelldatei mehr als 9 GB beträgt, gibt es dieses Mal 20 Reduzierungen.
    Die maximale Anzahl von Reduzierungen für jede Aufgabe
    ist auf hive.exec.reducers.max = 999 festgelegt. Der Standardwert ist 999.
    Die Formel zur Berechnung der Anzahl der Reduzierer lautet N = min (Gesamteingabedatenvolumen/Parametereinstellung reduzieren das Verarbeitungsdatenvolumen )
    .
    Zeit und Ressourcen; außerdem gibt es so viele Ausgabedateien, je weniger sie vorhanden sind. Wenn viele kleine Dateien generiert werden, dann gibt es auch
    ein Problem, wenn diese kleinen Dateien als Eingabe für die nächste Aufgabe dienen viele kleine Dateien;
    2. Unter welchen Umständen gibt es nur eine Reduzierung? In
    vielen Fällen werden Sie feststellen, dass unabhängig von der Datenmenge in der Aufgabe und unabhängig davon, ob Sie die Anzahl der Reduzierungsparameter angepasst haben,
    Es gibt immer nur eine Reduzierungsaufgabe in der Aufgabe. Tatsächlich gibt es nur eine Reduzierungsaufgabe, außer dass die Datenmenge
    geringer ist als der Parameterwert hive.exec.reducers.bytes.per.reducer. Dafür gibt es die folgenden Gründe :
    Es gibt kein zusammenfassendes Beispiel für die Gruppierung nach
    : select pt,count(1) from tab_info where pt = '2020-07-04' group by pt;
    select count(1) from tab_info where pt = '2020-07-04' ;
    Order by wird verwendet
    , um ein kartesisches Produkt zu erhalten.
     Hinweis: Wenn Sie die Anzahl der Reduzierungen festlegen, müssen Sie auch diese beiden Prinzipien berücksichtigen: Verwenden Sie die entsprechende Anzahl von Reduzierungen für große Datenmengen. Verarbeiten Sie die entsprechende Datenmenge für eine einzelne Reduzierungsaufgabe. 11. Legen Sie hive.exec für die parallele Ausführung
    fest
    . parallel=true; --Aktiviert die parallele Ausführung von Aufgaben.
    Set hive.exec.parallel.thread.number=16; --Die gleiche SQL erlaubt die maximale Parallelität, der Standardwert ist 8.
    Hive wandelt eine Abfrage in eine oder mehrere Phasen um. Solche Stufen können MapReduce-Stufe, Sampling-Stufe, Merge-Stufe, Limit-Stufe sein.
    Standardmäßig führt Hive jeweils nur eine Stufe aus.
    Ein bestimmter Job kann jedoch viele Phasen enthalten, und diese Phasen sind möglicherweise nicht vollständig voneinander abhängig, was bedeutet, dass einige Phasen parallel ausgeführt werden können,
    was die Ausführungszeit des gesamten Jobs verkürzen kann
    . In einem gemeinsam genutzten Cluster sollte dies jedoch der Fall sein Beachten Sie, dass sich die Clusterauslastung erhöht, wenn es mehr parallele Phasen im Job gibt.

  11. Strikter Modus
    set hive.mapred.mode = strict; --Enable strict mode
    set hive.mapred.mode = nostrict; --Enable non-strict mode
    Durch die Aktivierung des strikten Modus können drei Arten von Abfragen verhindert werden.
    1) Für eine partitionierte Tabelle muss die where-Anweisung ein Partitionsfeld als Filterbedingung enthalten, um den Bereich einzuschränken, andernfalls ist die Ausführung nicht zulässig. 2)
    Für Abfragen, die die order by-Anweisung verwenden, muss die limit-Anweisung verwendet werden.
    Denn „Order by“ verteilt alle Ergebnisdaten zur Verarbeitung an denselben Reduzierer, um den Sortiervorgang durchzuführen.
    3) Begrenzen Sie kartesische Produktabfragen.
    13. JVM-Wiederverwendung Durch
    die JVM-Wiederverwendung kann die JVM-Instanz N-mal im selben Job wiederverwendet werden. Der Wert von N kann in der Datei „mapred-site.xml“ von Hadoop konfiguriert werden.
    set mapred.job.reuse.jvm.num.tasks=10; manuell festgelegt. Das Standardunternehmen ist konfiguriert

  12. Spekulative Ausführung
    set mapred.map.tasks.speculative.execution=true
    set mapred.reduce.tasks.speculative.execution=true
    set hive.mapred.reduce.tasks.speculative.execution=true;
    Spekulative Ausführung: Symptom: Beim Ausführen des Programms , Es wurde festgestellt, dass eine bestimmte Aufgabe in einem Programm längere Zeit nicht abgeschlossen werden konnte.
    Lösung: Wenn die spekulative Ausführung aktiviert ist, wird die Aufgabe zu langsam ausgeführt und das Programm startet dieselbe Aufgabe neu und weist sie der
    Maschine zur Ausführung zu. Wer zuerst mit der Ausführung fertig ist, wird die andere Aufgabe ausführen. Die Konfiguration kann nach dem Beenden geändert werden.
    Wenn der Benutzer aufgrund einer großen Menge an Eingabedaten eine Langzeitzuordnung oder eine Reduzierungsaufgabe ausführen muss, ist der durch den Start der spekulativen Ausführung verursachte Abfall sehr groß .

Supongo que te gusta

Origin blog.csdn.net/mitao666/article/details/110470913
Recomendado
Clasificación