7. Hive-Leistungsoptimierung und neue Funktionen von Hive3

1. Optimierung des Hive-Tischdesigns

  1. Partitionierte Tabellen optimieren die Abfragegeschwindigkeit
  2. Bucket-Tabelle zur Optimierung der Join-Geschwindigkeit
  3. Indexoptimierung (nach Hive3 entfernt, nur verstehen)

2. Optimierung der Hive-Tabellendaten

2.1 Dateiformat

Überblick

  • Die Essenz der Hive-Datenspeicherung ist HDFS. Das gesamte Lesen und Schreiben von Daten erfolgt auf Basis von HDFS-Dateien
  • Um die Leistung beim Lesen und Schreiben von HDFS-Dateien zu verbessern, bietet Hive verschiedene Dateispeicherformate: TextFile, SequenceFile, ORC, Parguet usw.
  • Verschiedene Dateispeicherformate haben unterschiedliche Speichereigenschaften, einige können den Speicherplatz reduzieren und andere können die Leistung von Abfragen verbessern
  • Das Dateiformat von Hive wird beim Erstellen einer Tabelle angegeben und der Standardwert ist TextFile. Angegebene Syntax: Als Dateiformat speichern

Textdatei

  • TextFile ist das Standarddateiformat in Hive und die Speicherform ist zeilenweise
  • Das in der Arbeit am häufigsten verwendete Datendateiformat ist TextFile. Fast alle Rohdaten werden im TextFile-Format generiert. Daher ist Hive so konzipiert, dass verschiedene Codierungs- und Datenverwirrungsprobleme vermieden werden, und wählt TextFile als Standardformat aus.
  • Wenn Sie beim Erstellen einer Tabelle kein Speicherformat angeben, handelt es sich um TextFile. Kopieren Sie beim Importieren von Daten die Datendatei nach HDFS, ohne sie zu verarbeiten.

Vorteile: Das einfachste Datenformat, das direkt angezeigt werden kann.
Nachteile: Verbraucht Speicherplatz und geringere I/O-Leistung

Sequenzdatei

  • SequenceFile ist ein Dateiformat, das zum Speichern serialisierter Schlüssel-Wert-Paare in Hadoop verwendet wird, also binär, generiert durch Einfügen + Auswählen
  • SequenceFile kann auch als Ein- und Ausgabe von MapReduce-Jobs verwendet werden, und Hive unterstützt dieses Format ebenfalls

Vorteile: Speichern Sie Daten in binärer KV-Form, freundliche Interaktion mit der zugrunde liegenden Schicht, schnellere Leistung.
Nachteile: Verbrauchen Sie den meisten Speicherplatz

Parkett

  • Parquet ist ein spaltenorientiertes Speicherdateiformat, das verschachtelte Strukturen unterstützt. Generierungsmethode: Einfügen + Auswählen
  • Es handelt sich um ein spaltenorientiertes Speichersystem, das verschachtelte Datenmodellpaare unterstützt. Als Optimierungslösung für OLAP-Abfragen in Big-Data-Systemen wurde es von verschiedenen getrennten Engines nativ unterstützt, und einige Performance-Engines verwenden es als Standarddateispeicherformat
  • Durch Datenkodierung und -komprimierung sowie Funktionen wie Map-Pushdown und Prädikat-Pushdown wird auch die Leistung von Parquet im Vergleich zu anderen Dateiformaten verbessert

Vorteile: Effizientere Komprimierung und Codierung können komprimiert und aufgeteilt werden, optimieren die Festplattennutzung und E/A und können in einer Vielzahl von Datenverarbeitungs-Frameworks verwendet werden. Nachteile: Unterstützt keine
Aktualisierung, Einfügung, Löschung und ACID

ORC

  • Das ORC-Dateiformat ist ein spaltenorientiertes Speicherformat im Hadoop-Ökosystem
  • Die verbleibende Lebensdauer betrug Anfang 2013 und wurde ursprünglich von Apache Hive generiert, um den Speicherplatz für Hadoop-Daten zu reduzieren und die Abfragegeschwindigkeit von Hive zu beschleunigen
  • ORC ist kein spaltenorientiertes Speicherformat. Renshi unterteilt zunächst die gesamte Tabelle entsprechend der Zeilengruppe und speichert sie in jeder Zeilengruppe spaltenweise.
  • Die ORC-Datei ist selbstbeschreibend, ihre Quelldaten werden mithilfe von Protokollpuffern serialisiert und die Daten in der Datei werden so weit wie möglich komprimiert, um den Speicherplatzverbrauch zu reduzieren, der derzeit auch von Hive verwendet wird. Unterstützung für Spark SQL, Presto usw. Engine

Vorteile: Spaltenspeicher, hohe Speichereffizienz, Komprimierbarkeit, effiziente Spaltenzugriffsabfrageeffizienz, Unterstützungsindex, Unterstützungsvektorabfrage. Nachteile: Der Leistungsverbrauch ist
beim Laden hoch und die Leistung beim Lesen der gesamten Datenmenge muss über eine Textdatei generiert werden Umwandlung. Unterschied

2.2 Datenkomprimierung

Überblick

  • Wenn Hive das MapReduce-Programm auf der untersten Ebene ausführt, nehmen Festplatten-E/A-Vorgänge, Netzwerkdatenübertragung, Mischen und Zusammenführen viel Zeit in Anspruch, insbesondere wenn die Datengröße groß und die Arbeitslast hoch ist.
  • Da Festplatten-E/A und Netzwerkbandbreite wertvolle Ressourcen für Hadoop sind, ist die Datenkomprimierung sehr hilfreich, um Ressourcen zu sparen und Festplatten-E/A- und Netzwerkübertragungen zu minimieren
  • Die Hive-Komprimierung bezieht sich eigentlich auf die Komprimierung von MapReduce

Vorteile der Komprimierung
Reduzieren Sie den vom Dateispeicher belegten Speicherplatz.
Beschleunigen Sie die Effizienz der Dateiübertragung und verbessern Sie dadurch die Verarbeitungsgeschwindigkeit des Systems.
Reduzieren Sie die Anzahl der E/A-Lese- und Schreibvorgänge

Nachteile der Komprimierung
Bei der Verwendung von Daten müssen Sie die Datei zuerst dekomprimieren, was die CPU-Belastung erhöht. Je komplexer der Komprimierungsalgorithmus, desto länger die Dekomprimierungszeit

Komprimierung in Hive
Die Komprimierung in Hive wird mithilfe der Komprimierung in Hadoop implementiert, sodass die in Hadoop unterstützte Komprimierung direkt die in
Hadoop in Hive unterstützten Komprimierungsalgorithmen verwenden kann: DEFLATE, gzip, bzip2, LZO, LZ4,
Snappy Um die Komprimierung in Hive zu verwenden, MapReduce und Hive müssen entsprechend konfiguriert werden

Komprimierungskonfiguration in Hive

-- 开启hive中间传输数据压缩功能
-- 1)开启hive中间传输数据压缩功能
set hive.exec.compress.insermediate=true;
-- 2)开启mapreduce中map输出压缩功能
set mapreduce.map.output.compress=true;
-- 3)设置mapreduce中map输出数据的压缩方式
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

-- 开启Reduce输出阶段压缩
-- 1)开启hive最终输出数据压缩功能
set hive.exec.compress.output=true;
-- 2)开启mapreduce最终输出数据压缩
set mapreduce.output.fileoutputformat.compress=true;
-- 3)设置mapreduce最终数据输出压缩方式
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
-- 4)设置mapreduce最终数据输出压缩为块压缩
set mapreduce.output.fileoutputformat.compress.type=BLOCK;

Komprimierungstest in Hive
Erstellen Sie eine Tabelle, geben Sie sie als Textdateiformat an und verwenden Sie Snappy zum Komprimieren

create table tb_sogou_snappy
stored as textfile
as select * from tb_sogou_source;

Erstellen Sie eine Tabelle, geben Sie sie im Orc-Format an und komprimieren Sie sie mit Snappy

create table tb_sogou_orc_snappy
stored as orc tblproperties ("orc.compress"="SNAPPY")
as select * from tb_sogou_source;

2.3 Speicheroptimierung

Vermeiden Sie die Generierung kleiner Dateien
. Der Speicher von Hive ist im Wesentlichen HDFS. HDFS eignet sich nicht für die Speicherung kleiner Dateien, da jede kleine Datei eine Metadateninformation generiert und keine MapReduce-Verarbeitung verwendet. Jede kleine Datei in MapReduce startet eine MapTask Berechnung. Die Verarbeitung führt zu einer Verschwendung von Ressourcen. Versuchen Sie daher bei der Verwendung von Hive zur Verarbeitung und Analyse, die Generierung kleiner Dateien zu vermeiden. Hive bietet
einen speziellen Mechanismus, der automatisch feststellen kann, ob es sich um eine kleine Datei handelt und ob es sich um eine handelt Wenn Sie eine kleine Datei erstellen, werden die kleinen Dateien automatisch zusammengeführt.

-- 如果hive的程序,只有maptask,将MapTask产生的所有小文件进行合并
set hive.merge.mapfiles=true;
-- 如果hive的程序,有Map和ReduceTask,将ReduceTask生成的所有小文件进行合并
set hive.merge.mapredfiles=true;
-- 每一个合并的文件大小(244M)
set hive.merge.size.per.task=256000000;
-- 平均每个文件的大小,如果小于这个值就会进行合并(15M)
set hive.merge.smallfiles.avgsize=16000000;

Kombinieren Sie kleine Dateien.
Wenn Sie bei der Datenverarbeitung auf kleine Eingabedateien stoßen, stellt Hive auch die Eingabeklasse CombineHiveInputFormat bereit, mit der kleine Dateien nach dem Zusammenführen verarbeitet werden.

-- 设置Hive中底层MapReduce读取数据的输入类;将所有文件合并为一个大文件作为输入
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

ORC-Dateiindex

  • Bei der Verwendung von ORC-Dateien bietet ORC zwei Indexmechanismen, um das Lesen des Dateninhalts in ORC-Dateien zu beschleunigen: Der Zeilengruppenindex und der Bloom-Filter-Index können dazu beitragen, die Leistung beim Abfragen von ORC-Dateien zu verbessern
  • Wenn Benutzer Daten schreiben, können sie angeben, dass ein Index erstellt werden soll. Wenn Benutzer Daten abfragen, können sie die Daten im Voraus nach dem Index filtern, um unnötige Datenscans zu vermeiden.

Zeilengruppenindex

  • Eine ORC-Datei enthält einen oder mehrere Stripes (Gruppen von Zeilendaten), jeder Stripe enthält die Indexdaten des Min/Max-Werts jeder Spalte
  • Wenn in der Abfrage eine Operation größer oder gleich kleiner als vorhanden ist, werden die Stripes, die nicht im Scan enthalten sind, entsprechend dem Min./Max.-Wert übersprungen
  • Der Index, der den für jeden Stripe festgelegten Min.-/Max.-Wert enthält, wird zum Zeilengruppenindex des Zeilengruppenindex, auch bekannt als Min-Max-Indexgrößenvergleichsindex oder Speicherindex
  • Beim Erstellen einer Tabelle im ORC-Format wird nach Angabe des Tabellenparameters „orc.create.index“=„true“ der Zeilengruppenindex erstellt
  • Um den Zeilengruppenindex effektiv nutzen zu können, müssen beim Laden von Daten in die Tabelle die Felder sortiert werden, die den Index verwenden müssen
-- 1.开启索引配置
set hive.optimize.index.filter=true
-- 2.创建表并指定构建索引
create table tb_sogou_orc_index
    stored as orc tblproperties("orc.create.index"="true")
as select * from tb_sogou_source
    distribute by stime
    sort by stime;
-- 3.当进行范围或者等职查询时就可以基于构建的索引进行查询
select count(*) from tb_sogou_orc_index where stime > '12:00:00' and stime < '18:00:00';

Bloom-Filter-Index

  • Verwenden Sie beim Erstellen einer Tabelle den Parameter „orc.bloom.filter.columns“="columnName...", um anzugeben, für welche Felder ein BloomFilter-Index erstellt werden soll. Beim Generieren von Daten wird für dieses Feld eine BloomFilter-Datenstruktur erstellt jeder Streifen
  • Wenn die Abfragebedingung einen äquivalenten Filter für dieses Feld enthält, ermitteln Sie zunächst, ob der folgende Wert vom BloomFilter enthalten ist. Wenn nicht, überspringen Sie den Stripe
-- 创建表指定创建布隆索引
create table tb_sougou_orc_bloom
stored as orc tblproperties
("orc.create.index"="true","orc.bloom.filter.columns"="stime,userid")
as select * from tb_sogou_source
distribute by stime
sort by stime;

-- stime的范围过滤可以走row group index,userrid的过滤可以走bloom filter index
select count(*) from tb_sogou_orc_index
where stime > '12:00:00' and stime < '18:00:00'
and userid = '3933336519818919';

3. Optimierung der Ausführung von Hive-Job-Aufgaben

3.1 Erklären Sie den Abfrageplan

  • HQL ist eine SQL-ähnliche Sprache. Aus Sicht der Sprachspezifikation handelt es sich um eine deklarative Sprache. Benutzer senden lebensechte HQL-Abfragen gemäß den Abfrageanforderungen, und Hive konvertiert sie basierend auf der zugrunde liegenden Berechnung in Mapreduce/Tez/Spark Motor. Arbeit
  • Der Befehl „explain“ kann Benutzern helfen, den zugrunde liegenden Implementierungsprozess einer HQL-Sprache zu verstehen. Laienhaft ausgedrückt ist es die Art und Weise, wie Hive dies erreichen will
  • „explain“ analysiert die HQL-Anweisung und analysiert die Implementierungsschritte, Abhängigkeiten und den Implementierungsprozess der gesamten HQL-Anweisung und gibt sie zurück. Sie können verstehen, wie eine HQL-Anweisung den Prozess der Datenabfrage und -verarbeitung auf der untersten Ebene implementiert. Beachten Sie, dass die Benutzer optimiert Hive

* Allgemeine Syntaxbefehle

EXPLAIN [FORMATTED|EXTENDED|DEPENDENCY|AUTHORIZATION|] query

FORMATTED:对执行计划进行格式化,返回JSON格式的执行计划
EXTENDED:提供一些额外的i西南西,比如文件的路径信息
DEPENDENCY:以JSON格式返回查询所依赖的表和分区的列表
AUTHORIZATION:列出需要被授权的条目,包括输入于输出

Jeder Abfrageplan besteht aus den folgenden Teilen:
1. Abstrakter Syntaxbaum (AST): Hive verwendet den Antlr-Parser-Generator, um automatisch einen abstrakten Syntaxbaum aus HQL zu generieren. 2.
Stufenabhängigkeiten: Die Stufen, die den Abfrageplan ausführen, werden aufgelistet Abhängigkeiten zwischen
3. Phaseninhalt: Enthält sehr wichtige Informationen zu jeder Phase, z. B. spezifische Informationen wie Operatoren und Sortierreihenfolgen zur Laufzeit

3.2 MapReduce-Attributoptimierung

Lokalbetrieb

  • Bei der Verwendung von Hive werden auch einige Tabellen mit einer kleinen Datenmenge in die MapReduce-Verarbeitung konvertiert. Beim Senden an den Cluster müssen Sie Ressourcen beantragen, auf die Ressourcenzuweisung warten, den JVM-Prozess starten und dann ausführen Aufgabe. Eine Reihe von Prozessen ist umständlich. Die Datenmenge selbst ist nicht groß, und die Übermittlung an YARN zur Ausführung und Rückgabe führt zu einer schlechten Leistung
  • Um dieses Problem zu lösen, folgt Hive dem Design in MapReduce und bietet einen lokalen Rechenmodus, der es ermöglicht, Programme lokal auszuführen, ohne sie an YARN zu übermitteln, um so die Leistung von Programmen mit kleinen Datenmengen zu verbessern.
-- 配置
-- 开启本地模式
set hive.exec.mode.local.auto = true;

提交任务满足以下三个条件(均可调)则使用本地模式:
输入大小小于128M
maptasks数小于4
reducetasks是0或1

JVM-Wiederverwendung
1. Hadoop startet standardmäßig eine JVM für jede auszuführende Aufgabe, und der Speicheraufwand ist beim Starten der JVM groß.
2. Wenn bei einer großen Anzahl von Jobs das Datenvolumen einer einzelnen Aufgabe klein ist, Die JVM wird ebenfalls beantragt, was zu Ressourcenspannung und -verschwendung
3 führt. Die Wiederverwendung der JVM kann dazu führen, dass die JVM-Instanz N-mal im selben Job wiederverwendet wird. Wenn die Ausführung einer Aufgabe beendet ist, erklärt die JVM dies nicht, sondern läuft weiter Die nächste Aufgabe, bis N Aufgaben ausgeführt werden, wird
4 freigegeben. Der Wert von N kann in der Datei „mapred-site.xml“ von Hadoop konfiguriert werden, normalerweise zwischen 10 und 20

-- Hadoop3之前的配置在mapred-site.xml中添加以下参数
-- Hadoop3不再支持
mapreduce.job.jvm.numtasks=10

Die parallele Ausführung von
Hive wird bei der Implementierung von HQL-Berechnungen in mehrere Phasen zerlegt. Manchmal sind die Phasen voneinander abhängig und können nur einzeln ausgeführt werden. In einigen anderen Szenarien besteht jedoch keine Abhängigkeit zwischen vielen Phasen. Aktivieren Sie durch Ändern der Parameter die parallele Ausführung. Wenn zwischen mehreren Stufen keine Abhängigkeit besteht, können mehrere Stufen parallel ausgeführt werden, um die Leistung zu verbessern.

-- 开启stage并行化,默认为false
set hive.exec.parallel=true;
-- 指定并行化线程数,默认为8
set hive.exec.parallel.thread.number=16;

2.3 Join-Optimierung

  • Join ist eine wesentliche Operation im Prozess der Datenanalyse und -verarbeitung, und Hive unterstützt auch die Syntax von Join
  • Die zugrunde liegende Ebene von Hive Join wurde mithilfe von MapReduce implementiert. Wenn Hive Join implementiert, werden verschiedene Join-Lösungen bereitgestellt, um die Leistung von MapReduce zu verbessern
  • Map Join eignet sich beispielsweise zum Verbinden kleiner Tabellen mit großen Tabellen, ReduceJoin eignet sich zum Verbinden großer Tabellen und Bucket Join ist ein Optimierungsschema zum Verbinden großer Tabellen.

Das Prinzip von Map Join
: Legen Sie die kleinen Daten in jeden MapRask-Speicher, um vollständige Daten zu speichern, und jeder Teil der großen Daten kann mit den vollständigen Daten der kleinen Daten verknüpft werden. Die unterste Ebene muss nicht gemischt werden. und muss Speicherplatz belegen.
Verwendung kleiner Datendateien
: Versuchen Sie, Map Join zu verwenden, um den Join-Prozess zu implementieren. Map Join ist in Hive standardmäßig automatisch aktiviert: hive.auto. konvertieren.join=true

Größenbeschränkung für kleine Tische in Hive

-- 2.0版本之前的控制属性
hive.mapjoin.smalltable.filesize=25M
-- 2.0之后
hive.auto.convert.join.noconditionaltask.size=512000000

Das Prinzip von Reduce Join
: In der Shuffle-Phase werden die Daten der beiden Tabellen durch Shuffle-Gruppierung gemäß den zugehörigen Feldern kombiniert. Es
muss Shuffle sein, und die Gruppierung im Shuffle-Prozess wird verwendet, um die Assoziation zu realisieren
. Verwendung: Hive ermittelt automatisch, ob Map Join erfüllt ist. Wenn Map Join nicht erfüllt ist, wird Reduce Join automatisch ausgeführt

Bucket-Join-
Prinzip: Teilen Sie die Daten gemäß den gewünschten Regeln auf zwei Tabellen auf, verknüpfen Sie die Daten gemäß den entsprechenden Regeln, reduzieren Sie die Anzahl der Vergleiche und verbessern Sie die Leistung. Syntax: Clustered by colName Parameter: set hive.optimize.bucketmapjoin=
true
;
Anforderungen: Bucket-Feld = Join-Feld, die Anzahl der Buckets ist gleich oder mehrfach

Verwenden Sie Sort Merge Bucket Join
basierend auf geordneten Daten. Join-
Syntax: Clustered by colName, sortiert nach (colName)
Parameter:
set hive.optimize.bucketmapjoin=true;
set hive.auto.convert.sortmerge.join=true;
set hive.optimize. Bucketmapjoin .sortedmerge=true;
setze hive.auto.convert.sortmerge.join.noconditionaltask=true;
Anforderungen: Bucketing-Feld=Join-Feld=Sortierfeld, die Anzahl der Buckets ist gleich oder mehrfach

2.4 Optimierer – Assoziationsoptimierung

Korrelationsoptimierung
Wenn einige Vorgänge in einem Programm miteinander korrelieren, kann die Korrelationsoptimierung aktiviert werden. Versuchen Sie beim Parsen verwandter Vorgänge, sie in eine MapReduce-
Konfiguration zu bringen: set hive.optimize.correlation=true;

2.5 Optimierer-Engine

Hintergrund
Wenn der Standardoptimierer von Hive eine aggregierte statistische Verarbeitung analysiert, ist die Parsing-Lösung auf der untersten Ebene manchmal nicht die beste Lösung.

CBO-Optimierer
RBO: Regelbasierter Optimierer, optimiert das Programm gemäß den festgelegten Regeln.
CBO: Kostenbasierter Optimierer, wählt das geeignete Optimierungsschema entsprechend den Kosten verschiedener Szenarien aus.
Hive unterstützt RBO und CBO. Zwei Engines, RBO standardmäßig

CBOs konfigurieren

set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;

Analyse-Analysator-
Funktion: Wird verwendet, um vorab ein MapReduce-Programm auszuführen, um einige Metadaten der Tabelle oder Partition zu erstellen und diese zur Verwendung an die CBO-Engine zu verteilen

Grammatik

-- 构建分区信息元数据
ANALYZE TABLE tablename
[PARTITION(partcol1 [=val1], partcol2[=val2],...]
COMPUTE STATISTICS [noscan];

-- 构建列的元数据
ANALYZE TABLE tablename
[PARTITION(partcol1 [=val1], partcol2[=val2],...]
COMPUTE STATISTICS FOR COLUMNS (columns name1, columns name2...) [noscan];

-- 查看元数据
DESC FORMATTED [tablename] [columnname];
-- 分析优化器
-- 构建表中分区数据的元数据信息
analyze table tb_login_part partition(logindate) compute statistics;
-- 构建表中列的数据的元数据信息
analyze table tb_login_part compute statistics for columns userid;
-- 查看构建的列的元数据
desc formatted tb_login_part userid;

2.5 Prädikat-Pushdown (PPD)

Die Grundidee des Prädikat-Pushdowns besteht darin, den Filterausdruck so nah wie möglich an die Datenquelle zu verschieben, sodass irrelevante Daten während der tatsächlichen Ausführung direkt übersprungen werden können. Um es einfach auszudrücken: Versuchen Sie, die Filterbedingungen im Voraus auszuführen, ohne das Endergebnis zu beeinträchtigen

Parameter aktivieren (standardmäßig aktiviert): hive.optimize.ppd=true;

Regel
1. Bei Join (Inner Join) und Full Outer Join gibt es keinen Unterschied, ob die Bedingung nach on oder nach where geschrieben wird.
2. Bei Left Outer Join wird die Tabelle rechts nach on und die Tabelle on geschrieben Die linke Tabelle wird nach „wo“ geschrieben. Leistung 3.
Bei der rechten äußeren Verknüpfung wird die linke Tabelle nach „on“ und die rechte Tabelle nach „wo“ geschrieben, und die Leistung wird verbessert.
4. Wenn die Bedingungen auf zwei Tabellen verteilt sind, Das Prädikat kann gemäß den obigen Schlussfolgerungen 2 und 3 frei kombiniert werden

2.6 Datenverzerrung

Datenversatz bedeutet, dass beim Senden eines Programms die meisten Aufgaben dieses Programms bereits ausgeführt wurden und nur eine bestimmte Aufgabe ausgeführt wurde.
Wenn das Programm Group By oder Count (Distinct) und andere Gruppenaggregationen ausführt und die Daten selbst gemäß den Hash-Partitionsregeln von MapReduce verzerrt sind, kommt es definitiv zu einer Datenverzerrung

Lösung
Lösung 1: Aktivieren Sie die kartenseitige Aggregation
hive.map.aggr=true;
indem Sie die Menge der Shuffle-Daten und die Ausführungszeit der Reducer-Phase reduzieren, vermeiden Sie einen Datenversatz aufgrund großer Unterschiede in den einzelnen Aufgabendaten

Lösung 2: Realisieren Sie eine zufällige Partitionierung . Wählen Sie * aus der
Tabelle aus Rangfunktion zur Vermeidung von Datenverzerrungen

Lösung 3: Datenversatz, automatischer Lastausgleich
hive.groupby.skewindata=true;
Nach dem Öffnen durchläuft das Programm automatisch zwei MapReduces.
Das erste MapReduce teilt sich automatisch zufällig in Reduzierer auf, und der linke Teil jedes Reduzierers aggregiert und gibt
das Ergebnis aus MapReduce verarbeitet die Ergebnisse der Aggregation im vorherigen Schritt entsprechend dem Unternehmen, um sicherzustellen, dass gemeinsam dieselbe Verteilung vorgenommen wird und die endgültigen Aggregationsergebnisse vorliegen

Data Skew Join
Wenn die beiden Tabellen während des Join-Vorgangs relativ groß sind, kann Map Join nicht implementiert werden, sondern nur Reduce Join verwendet werden. Wenn dann zu viele Werte in einem bestimmten Typ eines zugeordneten Felds vorhanden sind, führt dies zu Daten verzerren.

Lösung 1: Vorfilterung, Umwandlung von Big Data in Small Data zur Implementierung von Map Join

Lösung 2: Verwenden Sie Bucket Join,
um zwei Tabellen in Bucket-Tabellen zu erstellen

Lösung 3: Bei Verwendung von Skew Join
Skew Join ist ein spezieller Join-Prozess, der speziell zur Vermeidung von Datenversatz in Hive entwickelt wurde. Das
Prinzip dieses Joins besteht darin, Map Join und Reduce Join zu kombinieren. Wenn bei einem bestimmten Wert ein Datenversatz vorliegt, wird der Datenversatz auftreten auftreten. Map Join wird nur zum Implementieren der Daten verwendet.
Andere Daten ohne Datenversatz werden durch Reduce Join implementiert, wodurch das Problem der Datenverzerrung bei Reduce Join vermieden wird.
Schließlich werden die Ergebnisse von Map Join und die Ergebnisse von Reduce Join durch kombiniert Union

Verwenden Sie Skew Join

-- 开启运行过程中Skejoin
set hive.optimize.skewjoin=true;
-- 如果这个key的出现次数超过这个范围
set hive.skewjoin.key=100000;
-- 在编译时判断是否会产生数据倾斜
set hive.optimize.skewjoin.compiletime=true;
-- 不合并,提升性能
set hive.optimize.union.remove=true;
-- 如果Hive的底层走的时MapReduce,必须开启这个属性,才能实现合并
set mapreduce.input.fileinputformat.input.dir.recursive=true;

3. Neue Funktionen von Hive3

Hive hat darauf hingewiesen, dass MR seit Version 2.X nicht empfohlen wird. Es ist möglicherweise in zukünftigen Versionen nicht verfügbar. Es wird empfohlen, stattdessen Tes oder Spark zu verwenden.

3.1 Schnell

Tez ist ein Open-Source-Computing-Framework in der Apache-Community, das DAG-Jobs unterstützt.
Es kann mehrere abhängige Jobs in einen Job umwandeln, um die Leistung von DAG-Jobs zu verbessern. Am Ende wird Tez das Programm auch an YARN senden, um die Ausführung von
Tez zu realisieren. Für Endbenutzer bedeutet es tatsächlich, dass Entwickler schneller neue Songs für Endbenutzer erstellen können. Apps, die besser skalieren

3.2 LLAP-Update

Die in hive2.0 in LLAP eingeführte Funktion ist in Hive3 und Tez ausgereifter
. System-E/A und Interaktion mit HDFS DataNode, mit extrem hoher Programmleistung, LLAP unterstützt derzeit nur die Tez-Engine.
LLAP wird das bestehende Ausführungsmodell nicht ersetzen, sondern verbessern
Der LLAP-Daemon ist optional.
LLAP ist keine Ausführungs-Engine
. Teilweise Ausführung: Die Ergebnisse der vom LLAP-Programm durchgeführten Arbeit können einen Teil der Hive-Abfrageergebnisse bilden.
Ressourcenverwaltung: YARn-Mitarbeiter sind für die Ressourcenverwaltung und -zuweisung verantwortlich

3.3 Metastore-unabhängiger Modus

  • Alle Objekte in Hive wie Datenbanken, Tabellen, Funktionen usw. Ihre Definitionen werden Metadaten-Metadaten genannt
  • Metastore ist ein Metadatenspeicherdienst zum Bearbeiten und Zugreifen auf Metadaten
  • HIVe oder andere Ausführungs-Engines verwenden diese Metadaten zur Laufzeit, um zu entscheiden, wie die Benutzertrennung analysiert, autorisiert und effektiv durchgeführt wird
  • Metadaten können als eingebettetes Apache Derby-RDBMS konfiguriert oder mit einem externen RDBMS verbunden gespeichert werden
  • Der Metastore selbst ist vollständig in den Benutzerprozess eingebettet und kann auch als Dienst für die Verbindung anderer Prozesse ausgeführt werden

Ab Hive 3.0 wird der Metastore als separates Paket veröffentlicht, das ohne andere Teile von Hive ausgeführt werden kann.

おすすめ

転載: blog.csdn.net/hutc_Alan/article/details/131481195