Mindmap-Galerie 23 Big-Data-Wissenspunkte und Interviewzusammenfassung (1)
Einfache Vorlage, einschließlich Java-Grundlagen, hadoop, Hive, Data-Warehouse-Theorie, Impala, Data-Lake-Theorie und andere Inhalte.
Bearbeitet um 2024-01-18 15:05:07Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Projektmanagement ist der Prozess der Anwendung von Fachwissen, Fähigkeiten, Werkzeugen und Methoden auf die Projektaktivitäten, so dass das Projekt die festgelegten Anforderungen und Erwartungen im Rahmen der begrenzten Ressourcen erreichen oder übertreffen kann. Dieses Diagramm bietet einen umfassenden Überblick über die 8 Komponenten des Projektmanagementprozesses und kann als generische Vorlage verwendet werden.
Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Projektmanagement ist der Prozess der Anwendung von Fachwissen, Fähigkeiten, Werkzeugen und Methoden auf die Projektaktivitäten, so dass das Projekt die festgelegten Anforderungen und Erwartungen im Rahmen der begrenzten Ressourcen erreichen oder übertreffen kann. Dieses Diagramm bietet einen umfassenden Überblick über die 8 Komponenten des Projektmanagementprozesses und kann als generische Vorlage verwendet werden.
Big-Data-Wissenspunkte und Interviewzusammenfassung
Java-Grundlagen
Grundlegende Datentypen
Byte, boolescher Wert 1 Byte, char, kurze 2 Bytes, int, float 4 Bytes, lang, doppelt 8 Bytes
abnormal
Wurfbar
Fehler
Katastrophale schwerwiegende Fehler, unkontrollierbare Programme wie Stapelüberlauf
Ausnahme
Laufzeitausnahme
Nullzeiger-Ausnahme, Array-Index außerhalb der Grenzen
Ausnahmen zur Kompilierungszeit (Nicht-Laufzeit-Ausnahmen)
IOException, ClassNotFoundException
Polymorphismus
Datenstruktur
Gemeinsame Datenstrukturen (8 Typen)
Array
Abfragen und Änderungen erfolgen schnell, Hinzufügungen und Löschungen langsam
Das Speicherintervall ist kontinuierlich, die Speichernutzung ist hoch und die Speicherplatzkomplexität ist groß.
Vorteile: Zufälliges Lesen und Ändern erfolgt schnell, da das Array kontinuierlich ist (starker Direktzugriff und schnelle Suchgeschwindigkeit).
Nachteile: Das Einfügen und Löschen ist ineffizient, da nach dem Einfügen von Daten die Daten hinter dieser Position im Speicher verschoben werden müssen und die Größe nicht festgelegt ist und nicht einfach dynamisch erweitert werden kann.
verlinkte Liste
Schnelles Hinzufügen und Löschen, langsame Suche
Der Speicherplatz ist diskret, der belegte Speicher ist locker und die Speicherplatzkomplexität ist gering.
Vorteile: schnelles Einfügen und Löschen, hohe Speicherauslastung, keine feste Größe, flexible Erweiterung
Nachteile: Es ist keine zufällige Suche möglich, jedes Mal muss mit der ersten Suche begonnen werden, geringe Abfrageeffizienz
Hash-tabelle
Das Hinzufügen, Löschen und Suchen geht schnell, das Hashing von Daten ist eine Verschwendung von Speicherplatz
Warteschlange
„First in, first out“, „Tail-Einführung“ und „Top-Entfernung“ erfolgen schnell, andere Zugriffe sind jedoch langsam.
Stapel
First-In, Last-Out sowie das Entfernen und Einfügen des oberen Elements erfolgen schnell, der Zugriff auf andere Elemente außer dem oberen Element ist jedoch langsam.
roter schwarzer Baum
Sowohl das Hinzufügen als auch das Löschen und Suchen erfolgen schnell und die Algorithmusstruktur ist komplex (Einzelheiten finden Sie im Binärbaum).
Binärbaum
Das Hinzufügen, Löschen und Suchen erfolgt schnell, der Löschalgorithmus weist jedoch eine komplexe Struktur auf.
Die Zeitkomplexität beträgt im besten Fall O(logn) und im schlechtesten Fall O(n).
spezieller Binärbaum
vollständiger Binärbaum
Wenn die Anzahl der Ebenen des Binärbaums K und die Anzahl der Knoten (2^K-1) beträgt, handelt es sich um einen vollständigen Binärbaum (wie in der folgenden Abbildung dargestellt).
Unterthema 1
vollständiger Binärbaum
Die Anzahl der Schichten des Binärbaums ist die h-Schicht, die Anzahl der (1 ~ h-1) Knoten hat das Maximum erreicht und alle Knoten der h-Schicht sind auf der linken Seite konzentriert (wie in der folgenden Abbildung dargestellt).
binärer Suchbaum
Die Werte im linken Teilbaum sind alle kleiner als der Wurzelknoten, und die Werte im rechten Teilbaum sind alle kleiner als der Wurzelknoten. Die Reihenfolge der Durchquerung muss von klein nach groß sortiert werden (wie in der Abbildung gezeigt). )
roter schwarzer Baum
Ein ausgeglichener Binärbaum ist ein leerer Baum oder der Höhenunterschied zwischen dem linken und dem rechten Teilbaum überschreitet nicht 1, und sowohl der linke als auch der rechte Teilbaum sind ausgeglichene Binärbäume. Der rot-schwarze Baum muss ein binärer Suchbaum sein (wie in der Abbildung gezeigt). Figur)
Merkmale:
Zeitkomplexität
Die schlechteste Zeitkomplexität beim Einfügen, Löschen und Einfügen beträgt O (log N).
heightlogN
Knoten sind entweder schwarz oder rot
Der Wurzelknoten muss schwarz sein
Wenn ein Knoten rot ist, müssen seine untergeordneten Knoten schwarz sein.
Für jeden Knoten muss die Anzahl der schwarzen Knoten auf dem Pfad zum Blattknoten gleich sein.
Jeder Blattknoten (Blattknoten ist der NULL-Zeiger oder NULL-Knoten am Ende des Baums) ist schwarz
Optimaler Binärbaum (Huffman-Baum)
Die gewichtete Pfadlänge des Baums erreicht das Minimum
B-Baum
Der ausgewogene Mehrpfad-Suchbaum (mehr als zwei Suchpfade) unterscheidet sich vom Binärbaum und ist ein Mehrpfad-Baum, O(log n)
B-Baum
Es handelt sich um eine selbstausgleichende Baumdatenstruktur, die die Datenreihenfolge beibehält; die Komplexität des Suchens, des sequentiellen Zugriffs, des Einfügens und des Löschens beträgt O(log n) und der B-Baum speichert Daten nur in Blattknoten, sodass einige B-Bäume eliminiert werden Mängel. Nicht-Blattknoten speichern nur Indizes, keine tatsächlichen Daten. Die Daten werden alle in Blattknoten gespeichert. O(nlogn)
Die Höhe des Baums unterstützt die Bereichssuche
Warum verwendet MySQL B-Nummern?
Weniger Festplatten-IO und unterstützt die Bereichssuche
Der Unterschied zwischen B-Baum und B-Baum
1) Alle Daten im B-Baum liegen in Blattknoten vor 2) Die Blattknoten des B-Baums verfügen über bidirektionale Zeiger, um die Bereichssuche zu erleichtern, und die Daten auf den Blattknoten sind sequentiell von klein nach groß verbunden.
Bitmap
Sparen Sie Speicherplatz und erschweren Sie die Beschreibung komplexer Datenbeziehungen
versammeln
Problem beim Traversieren der Sammlung
Wenn Sie einen Iterator verwenden, um eine Sammlung zu durchlaufen und die Objekte in der Sammlung zu ändern (Hinzufügen, Löschen, Ändern), wird eine Ausnahme ausgelöst.
Sammlung
Aufführen
Anordnungsliste
Merkmale: Speicherelemente sind in Ordnung, Abfragen sind schnell und Hinzufügen und Löschen sind langsam.
Das zugrunde liegende Array wird implementiert und die Kapazität kann automatisch erweitert werden. Die Standarderweiterung beträgt das 1,5-fache der ursprünglichen Kapazität.
Es ist nicht Thread-sicher. Multithreading wird nicht empfohlen. Sie können Collections.syncnizedArrayList(List l) verwenden, um eine Thread-sichere ArrayList zurückzugeben.
Die unterste Ebene ruft Arrays.copyof() in großer Zahl auf und System.arraycopy() erweitert ihre Kapazität.
Vektor
Die zugrunde liegende Array-Implementierung wird durch das synchronisierte Schlüsselwort geändert, ist threadsicher und weist eine geringe Effizienz auf. Die standardmäßige Anfangskapazität beträgt 10 und die standardmäßige Erweiterungskapazität wird um das 1-fache erhöht.
LinkedList
Implementierung einer doppelt verknüpften Listenstruktur
Die Abfrage ist langsam, das Hinzufügen und Löschen erfolgt schnell
Ähnlichkeiten und Unterschiede zwischen LinkedList, ArrayList und Vector:
Satz
SortedSet
TreeSet
Die zugrunde liegende Rot-Schwarz-Baum-Implementierung, ungeordnete Sammlung, Thread-Sicherheit
HashSet
Unterklasse: LinkedHashSet
HashSet wird von HashMap implementiert, sodass die Datenstruktur ein rot-schwarzer Array-verknüpfter Baum ist, der Null, keine Duplizierung, Unordnung und unsicheres Multithreading zulässt. Es speichert Elemente gemäß dem Hash-Algorithmus und verfügt über hohe Such-, Lösch- und Zugriffsleistung. Verwenden Sie Collections.synchronizedHashSet(), um ein threadsicheres HashSet zurückzugeben
Auf Elemente kann nur über Iteratoren zugegriffen werden
Warteschlange
Karte
HashMap
HashMap
Die unterste Ebene von HashMap wird mithilfe von Arrays, verknüpften Listen und rot-schwarzen Bäumen implementiert.
Wenn die Anzahl der Objekte in einer Kette im Array 8 erreicht, wird die Kette in einen rot-schwarzen Baum umgewandelt. Wenn der rot-schwarze Baum weniger als 6 Knoten hat, wird er in eine verknüpfte Liste umgewandelt.
Die anfängliche Standardkapazität von Hash beträgt 16. Wenn die Speicherelemente in HashMap den Lastfaktor * die aktuelle Kapazität überschreiten, wird die Kapazität auf das Zweifache der ursprünglichen Größe erweitert und anschließend wird die Position jedes Elements im Array neu berechnet.
Es ist nicht threadsicher, Sie können ConcurrentHashMap verwenden
ConcurrentHashMap
jdk1.8
Implementiert unter Verwendung einer verknüpften Liste, eines rot-schwarzen Baumknotenarrays und einer CAS-Synchronisation (optimistische Sperre).
Unterklasse
LinkedHashMap
Hash-tabelle
Unterklasse
Eigenschaften
Thread-Sicherheit
Die Thread-Sicherheit wird durch das Sperren der gesamten Hash-Tabelle gewährleistet. Diese Methode gewährleistet die Thread-Sicherheit, die gleichzeitige Ausführung ist jedoch ineffizient.
SortedMap
TreeMap
Designmuster
Singleton-Modus, 3 gängige Typen
Lazy-Modus, beim ersten Aufruf instanziiert
Im Schurkenmodus wird die Klasse bei der Initialisierung selbst instanziiert und ist threadsicher
Registrierungsmodus
Proxy-Modus
statischer Proxy
Unterthema 1
dynamischer Proxy
Dynamischer JDK-Proxy
CGlib
Fabrikmuster
Builder-Muster
Adaptermodus
Iteratormuster
Gemeinsame Kategorien
Zeichenfolge
Stellt eine Zeichenfolge dar
Mit final geänderte String-Klassen können nicht vererbt werden und stellen unveränderliche Zeichenfolgen dar.
Der Zeicheninhalt des String-Objekts wird in einem Zeichenarray-Wert[] gespeichert.
Wenn eine String-Konstante mit einer Konstanten gespleißt wird, befindet sie sich im Konstantenpool des Methodenbereichs, und im Konstantenpool gibt es keine Konstanten mit demselben Inhalt, wenn eine Konstante mit einer Variablen gespleißt wird im Heap gespeichert werden.
JVM
javac
Ein Compiler, der die Java-Sprache in eine Binärdatei kompiliert, die vom JVM erkannt werden kann
Komponenten
JVM-Speicherpartition
Programm zähler
Es handelt sich um einen kleinen Speicherplatz und ist ein Indikator für den vom aktuellen Thread ausgeführten Code. Durch Ändern des Zählerwerts wird der nächste auszuführende Bytecode-Befehl ausgewählt kein Programmzähler zwischen Threads; der einzige Bereich, in dem OOM nicht auftritt; wenn der Thread eine Java-Methode ausführt, zeichnet der Programmzähler die Adresse des ausgeführten Bytecode-Befehls der virtuellen Maschine auf ist leer.
Java Virtual Machine Stack
Der private Thread speichert hauptsächlich lokale Variablen, Stapelrahmen, Operandenstapel, dynamische Links, Methodenexits und andere Informationen
nativer Methodenstapel
Rufen Sie die Klassenbibliothek des Betriebssystems auf
Haufen
Bei der Thread-Freigabe befinden sich grundsätzlich alle Objekte im Java-Heap, dem Hauptbereich für die Speicherbereinigung
Methodenbereich
Beim Thread-Sharing werden hauptsächlich Klasseninformationen, Konstanten, statische Variablen und kompilierte Codedaten gespeichert
Laufzeitkonstantenpool
Teil des Methodenbereichs. Speichern wörtlicher und symbolischer Referenzen
Multithreading
Programm
Eine Reihe von Anweisungen, die in einer bestimmten Sprache geschrieben sind, um eine bestimmte Aufgabe auszuführen, also ein statisches Stück Code, ein statisches Objekt
Verfahren
Der Prozess der einmaligen Ausführung eines Programms oder der Ausführung des Programms ist ein dynamischer Prozess mit einem eigenen Prozess der Entstehung, Existenz und des Untergangs (Lebenszyklus).
Merkmale:
Programme sind statisch, Prozesse sind dynamisch
Der Prozess ist die kleinste Einheit der Ressourcenzuweisung. Wenn das System ausgeführt wird, wird jedem Prozess ein anderer Speicherbereich zugewiesen.
Faden
Der Prozess ist weiter in Threads unterteilt, die einen Ausführungspfad des Programms darstellen.
Merkmale:
Wenn ein Prozess mehrere Threads gleichzeitig ausführt, unterstützt er Multithreading.
Threads dienen als Planungs- und Ausführungseinheiten. Jeder Thread verfügt über einen unabhängigen Stapel- und Programmzähler (PC), und der Aufwand für den Threadwechsel ist gering.
Mehrere Threads in einem Prozess teilen sich dieselbe Speichereinheit/den gleichen Speicheradressraum -> sie weisen Objekte aus demselben Heap zu und können auf dieselben Objekte und Variablen zugreifen. Dadurch wird die Kommunikation zwischen Threads einfacher und effizienter. Die gemeinsame Nutzung zwischen mehreren Threads bringt jedoch Sicherheitsprobleme mit sich
Parallelität und Parallelität
parallel:
Zwei oder mehr Ereignisse treten gleichzeitig auf
gleichzeitig:
Zwei oder mehr Ereignisse treten im gleichen Zeitintervall auf
Thread-Erstellung
Faden
Erben Sie die Thread-Klasse und überschreiben Sie die Ausführungsmethode. Durch Instanziieren der Unterklasse, die Thread erbt, kann der Thread die Ausführungsmethode aufrufen.
Thread-gängige Methoden
(1) void start(): Starten Sie den Thread und führen Sie die run()-Methode des Objekts aus (2) run(): Vorgänge, die vom Thread bei der Planung ausgeführt werden (3) String getName(): Gibt den Namen des Threads zurück (4) void setName(String name): Legen Sie den Thread-Namen fest (5) statischer Thread currentThread(): Gibt den aktuellen Thread zurück. Dies ist in Thread-Unterklassen der Fall, die normalerweise für die Haupt-Thread- und Runnable-Implementierungsklassen verwendet werden (6) static void yield(): Der Thread gibt den aktuell ausgeführten Thread zurück und hält ihn an, wodurch einem Thread mit derselben oder einer höheren Priorität die Möglichkeit zur Ausführung gegeben wird. Wenn sich kein Thread mit derselben Priorität in der Warteschlange befindet, ignorieren Sie diese Methode (7) Join(): Wenn die Join()-Methode anderer Threads in einem bestimmten Programmausführungsablauf aufgerufen wird, wird der aufrufende Thread blockiert, bis der durch die Join()-Methode hinzugefügte Join-Thread ausgeführt werden kann auch hingerichtet werden (8) Statischer Leerschlaf (lange Millisekunden): (angegebene Zeit: Millisekunden) bewirkt, dass der aktuell aktive Thread innerhalb des angegebenen Zeitraums die Kontrolle über die CPU aufgibt, anderen Threads die Möglichkeit gibt, ausgeführt zu werden, und nach Ablauf der Zeit erneut in die Warteschlange gestellt wird hoch. Löst eine unterbrochene Ausnahme aus (9) stop(): Erzwingt das Ende des Thread-Lebenszyklus, nicht empfohlen (10) boolean isAlive(): Gibt einen booleschen Wert zurück, um zu bestimmen, ob der Thread noch aktiv ist
Thread-Priorität:
Wenn ein Thread erstellt wird, erbt er die Priorität des übergeordneten Threads.
Niedrige Priorität hat nur eine geringe Wahrscheinlichkeit, geplant zu werden, und muss nicht unbedingt nach einem Thread mit hoher Priorität aufgerufen werden.
1. Thread-Prioritätsstufe MAX_PRIORITY: 10 MIN_PRIORITÄT: 1 NORM_PRIORITY:5 2. Beteiligte Methoden getPriority(): Gibt den Thread-Prioritätswert zurück setPriority(int newPriority): Ändern Sie die Priorität des Threads
Thread-StatusThread.State
Neu
bereit
laufen
Block
sterben
Lauffähig
1) Definieren Sie eine Unterklasse und implementieren Sie die Runnable-Schnittstelle. 2) Schreiben Sie die Ausführungsmethode in der Runnable-Schnittstelle in der Unterklasse neu. 3) Erstellen Sie ein Thread-Objekt über den Parameter enthaltenden Konstruktor der Thread-Klasse. 4) Übergeben Sie das Unterklassenobjekt der Runnable-Schnittstelle als tatsächlichen Parameter an den Konstruktor der Thread-Klasse. 5) Rufen Sie die Startmethode der Thread-Klasse auf: Starten Sie den Thread und rufen Sie die Ausführungsmethode der Runnable-Unterklassenschnittstelle auf.
abrufbar
Callable kann mit ExecutorService oder als Parameter von FeatureTask ausgeführt werden
Die öffentliche Klasse MyCallable implementiert Callable<T> { @Override public T call() löst eine Ausnahme aus { // Code definieren, der hier aufgerufen werden kann } } MyCallable myCallable = new MyCallable(); ExecutorService executor = Executors.newSingleThreadExecutor(); Future<T> future = executor.submit(myCallable); T result = future.get();
Callable<Process> task = () -> { //Asynchrone Aufgaben ausführen Laufzeit runtime = Runtime.getRuntime(); Prozess Prozess = runtime.exec("/Users/mac/Desktop/qc-java-runtime/src/main/java/com/qc/runtime/shell.sh"); Rückgabeprozess; }; //Callable in FutureTask einbinden FutureTask<Process> future = new FutureTask<>(task); //Starten Sie einen neuen Thread, um asynchrone Aufgaben auszuführen neuer Thread(Zukunft).start(); // Ergebnisse der asynchronen Aufgabe abrufen Prozessergebnis = future.get(); System.out.println(result);
Sperren
Für die gleichzeitige Arbeit benötigen Sie eine Möglichkeit, um zu verhindern, dass zwei Aufgaben auf dieselben Ressourcen zugreifen (und somit effektiv um gemeinsam genutzte Ressourcen konkurrieren). Die Möglichkeit, diesen Konflikt zu verhindern, besteht darin, die Ressource zu sperren, wenn sie von einer Aufgabe verwendet wird. Die erste Aufgabe, die auf eine Ressource zugreift, muss die Ressource sperren, damit andere Aufgaben nicht darauf zugreifen können, bis sie entsperrt wird. Zu diesem Zeitpunkt kann eine andere Aufgabe sie sperren und verwenden.
Synchronisiert
Jedes Objekt kann als Synchronisationssperre verwendet werden. Alle Objekte enthalten automatisch eine einzige Sperre (Monitor). Synchrone Methodensperre: statische Methode (Klassenname.Klasse), nicht statische Methode (diese) Synchronisierter Codeblock: Geben Sie ihn selbst an. Oft wird er auch als this oder class name.class angegeben
Sackgasse
Verschiedene Threads belegen die voneinander benötigten Synchronisationsressourcen und geben nicht auf. Sie warten alle darauf, dass die andere Partei die benötigten Ressourcen aufgibt, wodurch ein Deadlock entsteht.
Nachdem ein Deadlock aufgetreten ist, tritt keine Ausnahme oder Eingabeaufforderung auf, aber alle Threads sind blockiert und können nicht fortgesetzt werden.
Sperrfreigabe
Die Ausführung der Synchronisationsmethode und des Synchronisationscodeblocks des aktuellen Threads endet.
Der aktuelle Thread trifft auf Break und Return in einem synchronisierten Codeblock oder einer synchronisierten Methode, wodurch die weitere Ausführung des Codeblocks und der Methode beendet wird.
Im aktuellen Thread im synchronisierten Codeblock oder in der synchronisierten Methode tritt ein nicht behandelter Fehler oder eine Ausnahme auf, was zu einem abnormalen Ende führt.
Der aktuelle Thread führt die wait()-Methode des Thread-Objekts im Synchronisationscodeblock und in der Synchronisationsmethode aus. Der aktuelle Thread hält an und gibt die Sperre frei.
Netzwerkkommunikationsprotokoll
OSI-Modell (Protokoll)
Das Modell ist zu ideal und kann nicht im Internet beworben werden
OSI-Schichtung
Anwendungsschicht
Präsentationsfolie
Sitzungsschicht
Transportschicht
Netzwerkschicht
Datenübertragungsebene
physikalische Schicht
TCP/IP-Modell (Protokoll)
de facto internationaler Standard
TCP/IP-Schichtung
Anwendungsschicht
Transportschicht
Netzwerkschicht
physikalische Datenverbindungsschicht
Vergleich zweier Modelle
Datenverkapselung
Datenabbau
IP und Port
Wichtige Protokolle der Netzwerktransportschicht UDP und TCP
UDP (Benutzer-Datagramm-Protokoll)
1. Kapseln Sie Daten, Quelle und Ziel in Datenpakete, ohne eine Verbindung herzustellen. 2. Die Größe jedes Datagramms ist auf 64 KB begrenzt 3. Dem Absender ist es egal, ob die andere Partei bereit ist oder nicht, und der Empfänger bestätigt den Empfang nicht, daher ist es unzuverlässig. 4. Kann gesendet und gesendet werden 5. Beim Senden von Daten müssen keine Ressourcen freigegeben werden, geringer Overhead und hohe Geschwindigkeit
TCP (Transmission Control Protocol)
1. Vor der Verwendung des TCP-Protokolls muss zunächst eine TCP-Verbindung hergestellt werden, um einen Datenübertragungskanal zu bilden. 2. Vor der Übertragung wird die Methode des „Drei-Wege-Handshakes“ verwendet, und die Punkt-zu-Punkt-Kommunikation ist zuverlässig. 3. Zwei Anwendungsprozesse kommunizieren über das TCP-Protokoll: Client und Server. 4. Während der Verbindung können große Datenmengen übertragen werden. 5. Nach Abschluss der Übertragung muss die hergestellte Verbindung freigegeben werden, was ineffizient ist
Drei-Wege-Handshake (Verbindungsaufbau)
1. Der Client sendet eine Anforderungsnachricht zum Herstellen einer TCP-Verbindung. Die Nachricht enthält eine seq-Sequenznummer, die vom sendenden Ende zufällig generiert wird, und setzt das SYN-Feld (Synchronisieren) in der Nachricht auf 1, was darauf hinweist, dass eine TCP-Verbindung besteht muss etabliert werden. (SYN=1, seq=x, x ist ein zufällig generierter Wert); 2. Der Server antwortet auf die vom Client gesendete TCP-Verbindungsanforderungsnachricht, die die vom antwortenden Ende zufällig generierte Sequenznummer enthält, SYN auf 1 setzt und ein ACK-Feld generiert Fügen Sie zur Antwort 1 zur übergebenen Sequenznummer hinzu, damit der Client beim Empfang der Informationen weiß, dass seine TCP-Einrichtungsanforderung überprüft wurde. (SYN=1, ACK=x 1, seq=y, y ist ein zufällig generierter Wert) Die Bestätigung plus 1 kann hier als Bestätigung verstanden werden, mit wem die Verbindung hergestellt wird; 3. Nachdem der Client die vom Server gesendete TCP-Einrichtungsüberprüfungsanforderung erhalten hat, erhöht er seine Sequenznummer um 1, antwortet erneut auf die ACK-Überprüfungsanforderung und fügt der vom Server als Antwort gesendeten Sequenz 1 hinzu. (SYN=1, ACK=y 1, seq=x 1).
Viermal winken (unterbrechen)
1. Der Client sendet eine Nachricht mit der Aufforderung, die TCP-Verbindung zu trennen. Die Nachricht enthält die vom Absender zufällig generierte Sequenznummer. Außerdem wird das FIN-Feld in der Nachricht auf 1 gesetzt, was darauf hinweist, dass die TCP-Verbindung getrennt werden muss getrennt. (FIN=1, seq=x, x wird vom Client zufällig generiert); 2. Der Server antwortet auf die vom Client gesendete TCP-Trennungsanforderungsnachricht, die die vom Antwortende zufällig generierte Sequenznummer enthält, und generiert ein ACK-Feld. Der Wert des ACK-Felds ist die Sequenzsequenz Fügen Sie zur Antwort grundsätzlich 1 hinzu, damit der Client beim Empfang der Informationen weiß, dass seine TCP-Trennungsanforderung überprüft wurde. (FIN=1, ACK=x 1, seq=y, y wird vom Server zufällig generiert); 3. Nachdem der Server auf die TCP-Trennungsanforderung geantwortet hat, wird er die TCP-Verbindung nicht sofort trennen. Der Server stellt zunächst sicher, dass alle an A übertragenen Daten übertragen wurden, bevor er die Datenübertragung bestätigt der Antwortnachricht wird auf 1 gesetzt und eine zufällige Sequenznummer wird generiert. (FIN=1, ACK=x 1, seq=z, z wird zufällig vom Server generiert); 4. Nach Erhalt der TCP-Trennungsanforderung vom Server antwortet der Client auf die Trennungsanfrage des Servers, einschließlich eines zufällig generierten Sequenzfelds und eines ACK-Felds. Das ACK-Feld fügt somit 1 zur Sequenz der TCP-Trennungsanforderung des Servers hinzu Vervollständigen Sie die vom Server angeforderte Bestätigungsantwort. (FIN=1, ACK=z 1, seq=h, h wird vom Client zufällig generiert) Zu diesem Zeitpunkt ist der 4-Wellen-Wellenprozess der TCP-Trennung abgeschlossen.
Unterthema 3
Netzwerk-Socket
Die Kombination aus IP und Port bildet einen Socket
Die Essenz der Netzwerkkommunikation: Kommunikation zwischen Sockets
Einstufung
Stream-Socket
Stellen Sie mithilfe von TCP einen zuverlässigen Byte-Stream-Dienst bereit
Schritte zur TCP-basierten Socket-Programmierung
Klient
1. Socket erstellen: Erstellen Sie ein Socket-Klassenobjekt basierend auf der IP-Adresse oder Portnummer des angegebenen Servers. Wenn der Server antwortet, wird eine Kommunikationsleitung vom Client zum Server aufgebaut. Wenn die Verbindung fehlschlägt, tritt eine Ausnahme auf. 2. Öffnen Sie den mit dem Socket verbundenen Eingabe-/Ausgabestream: Verwenden Sie die Methode getInputStream(), um den Eingabestream abzurufen, und verwenden Sie die Methode getOutputStream(), um den Ausgabestream für die Datenübertragung abzurufen. 3. Lese-/Schreibvorgänge auf dem Socket gemäß einem bestimmten Protokoll: Lesen Sie die vom Server in die Zeile eingegebenen Informationen über den Eingabestream (können Sie die in die Zeile eingegebenen Informationen jedoch nicht selbst lesen) und schreiben Sie die Informationen in den Thread durch den Ausgabestrom. 4. Socket schließen: Trennen Sie den Client vom Server und geben Sie die Leitung frei
Service-Terminal
1. Rufen Sie ServerSocket(int port) auf: Erstellen Sie einen serverseitigen Socket und binden Sie ihn an den angegebenen Port. Wird zur Überwachung von Clientanfragen verwendet. 2. Rufen Sie „accept()“ auf: Warten Sie auf Verbindungsanforderungen. Wenn der Client eine Verbindung anfordert, akzeptieren Sie die Verbindung und geben Sie das Kommunikations-Socket-Objekt zurück. 3. Rufen Sie getOutputStream() und getInputStream() des Socket-Klassenobjekts auf: Rufen Sie den Ausgabe- und Eingabestream ab und beginnen Sie mit dem Senden und Empfangen von Netzwerkdaten. 4. Schließen Sie die ServerSocket- und Socket-Objekte: Der Client-Zugriff ist abgeschlossen und der Kommunikations-Socket ist geschlossen.
Datagramm-Socket
Verwenden Sie UDP, um „Best-Effort“-Datendienste bereitzustellen
UDP-basierte Netzwerkprogrammierung
1. Die Klassen DatagramSocket und DatagramPacket implementieren Netzwerkprogramme basierend auf dem UDP-Protokoll. 2. UDP-Datagramme werden über den Datagram-Socket DatagramSocket gesendet und empfangen. Das System garantiert nicht, dass das UDP-Datagramm sicher an das Ziel übermittelt werden kann, und kann auch nicht bestimmen, wann es ankommt. 3. Das DatagramPacket-Objekt kapselt ein UDP-Datagramm. Das Datagramm enthält die IP-Adresse und Portnummer des Absenders sowie die IP-Adresse und Portnummer des Empfängers. 4. Jedes Datagramm im UDP-Protokoll enthält vollständige Adressinformationen, sodass keine Verbindung zwischen Sender und Empfänger hergestellt werden muss. Genau wie das Versenden eines Expresspakets.
Verfahren
1. DatagramSocket und DatagramPacket 2. Legen Sie die Sende- und Empfangsseite fest 3. Datenpaket erstellen 4. Rufen Sie die Sende- und Empfangsmethoden von Socket auf 5. Steckdose schließen Hinweis: Das sendende Ende und das empfangende Ende sind zwei unabhängig laufende Programme.
URL
Betrachtung
Konzept
Die Reflexion des JAVA-Mechanismus erfolgt im laufenden Zustand. Sie können alle Eigenschaften und Methoden dieser Klasse aufrufen und die Funktion dynamisch abrufen Die Methode des Objekts wird als Reflexionsmechanismus der Java-Sprache bezeichnet.
Holen Sie sich eine Instanz der Klasse class
1) Voraussetzung: Wenn die spezifische Klasse bekannt ist, kann sie über das Klassenattribut der Klasse abgerufen werden. Diese Methode ist die sicherste und zuverlässigste und weist die höchste Programmleistung auf. Beispiel: Class clazz = String.class; 2) Voraussetzung: Wenn eine Instanz einer bestimmten Klasse bekannt ist, rufen Sie die Methode getClass () der Instanz auf, um das Klassenobjekt abzurufen. Beispiel: Class clazz = "www.atguigu.com".getClass(); 3) Voraussetzung: Der vollständige Klassenname einer Klasse ist bekannt, die Klasse befindet sich im Klassenpfad und kann über die statische Methode der Klassenklasse abgerufen werden. Mit forName() abgerufen, kann eine ClassNotFoundException ausgelöst werden Beispiel: Class clazz =Class.forName("java.lang.String"); 4) Andere Methoden (nicht erforderlich) ClassLoader cl = this.getClass().getClassLoader(); Class clazz4 = cl.loadClass("Vollständiger Klassenname der Klasse");
Gemeinsame Methoden der Klassenklasse
Typen mit Klassenobjekten
(1) Klasse: Äußere Klassen, Mitglieder (innere Mitgliedsklassen, statische innere Klassen), lokale innere Klassen, anonyme innere Klassen (2) Schnittstelle: Schnittstelle (3)[]: Array (4) Aufzählung: Aufzählung (5) Anmerkung: Anmerkung @interface (6) primitiver Typ: Basisdatentyp (7)nichtig
Beispiel
Klasse c1 = Object.class; Klasse c2 = Comparable.class; Klasse c3 = String[].class; Klasse c4 = int[][].class; Klasse c5 = ElementType.class; Klasse c6 = Override.class; Klasse c7 = int.class; Klasse c8 = void.class; Klasse c9 = Class.class; int[] a = new int[10]; int[] b = new int[100]; Klasse c10 = a.getClass(); Klasse c11 = b.getClass();
Unterthema 11
hadoop
hdfs
HDFS-Vor- und Nachteile
Vorteil
Fehlertoleranz (Replikationsmechanismus)
Geeignet für die Verarbeitung großer Datenmengen, kann Daten im Petabyte-Bereich verarbeiten und kann Millionen von Dateien verarbeiten
Auf günstigen Maschinen einsetzbar
Mangel
Nicht geeignet für Datenzugriff mit geringer Latenz
Es ist unmöglich, eine große Anzahl kleiner Dateien effizient zu speichern. Der Speicher des Namensknotens ist begrenzt, und wenn zu viele kleine Dateien vorhanden sind, ist die Adressierungszeit länger als die Dateiverarbeitungszeit.
Gleichzeitiges Schreiben wird nicht unterstützt und Dateien werden zufällig geändert.
HDFS-Architekturkomposition
Namensknoten
HDFS-Namespace verwalten
Konfigurieren Sie die Replikatrichtlinie
Blockzuordnungsinformationen verwalten
Behandeln Sie Kundenanfragen
Datenknoten
Datenblock speichern
Führen Sie Lese- und Schreibanforderungen für Datenblöcke aus
Klient
Dateiaufteilung, teilen Sie die Datei beim Hochladen der Datei in Blöcke auf
Interagieren Sie mit Namenode, um Informationen zum Dateispeicherort zu erhalten
Interagieren Sie mit Datenknoten, lesen oder schreiben Sie Daten
Der Client stellt Befehle zum Verwalten von HDFS bereit
Der Client stellt Befehle für den Zugriff auf HDFS bereit, z. B. zum Hinzufügen, Löschen und Überprüfen von HDFS-Vorgängen.
sekundärerNamenode
Unterstützen Sie nameNode bei der Arbeit, führen Sie fsimage zusammen, bearbeiten Sie Dateien und übertragen Sie sie an nameNode
Unterstützte Wiederherstellung von Namenode in Notsituationen
Blockgröße der HDFS-Datei
hadoop1.x ist 64 MB, hadoop2.x/3.x ist 128 MB
Der optimale Zustand liegt vor, wenn die Adressierungszeit 1 % der Übertragungszeit beträgt
Warum die Blockgröße einer HDFS-Datei nicht zu groß oder zu klein sein darf
1. Wenn es zu klein ist, verlängert sich die Suchzeit.
2. Wenn der Block zu groß ist, ist die Datenübertragungszeit deutlich länger als die Zeit zum Auffinden der Startblockposition, was dazu führt, dass das Programm diesen Datenblock sehr langsam verarbeitet.
Hülse
hochladen
hadoop fs -moveFromLocal lokales Datei-HDFS-Verzeichnis (lokales Ausschneiden und Kopieren nach HDFS)
hadoop fs -copyFromLocal lokales Datei-HDFS-Verzeichnis (lokal nach HDFS kopieren)
hadoop fs -Lokales Datei-HDFS-Verzeichnis ablegen (lokal kopieren und auf HDFS hochladen)
hadoop fs -appendToFile lokale Datei HDFS-Datei (lokale Dateidaten werden an das Ende der HDFS-Datei angehängt)
herunterladen
hadoop fs -copyToLocal hdfs-Datei lokales Verzeichnis (Datei ins lokale Verzeichnis kopiert)
hadoop fs -get hdfs file lokales Verzeichnis (Datei ins lokale Verzeichnis kopiert)
Betrieb von HDFS
hadoop fs -ls Verzeichnis (Informationen unter dem Verzeichnis anzeigen)
hadoop fs -mkdir-Verzeichnis (Verzeichnis erstellen)
-chgrp, -chmod, -chown (Dateieigentümer ändern)
hadoop fs -cat-Datei (Dateiinhalt anzeigen)
hadoop fs -cp Dateiverzeichnis (kopieren Sie die Datei in ein anderes Verzeichnis)
hadoop fs -tail-Datei (zeigt 1 KB Daten am Ende der Datei an)
hadoop fs -rm Dateien oder Ordner löschen
hadoop fs -rm -r Verzeichnis (rekursives Löschen des Verzeichnisses und des Inhalts unter dem Verzeichnis)
hadoop fs -du
hadoop fs -setrep (Legen Sie die Anzahl der Replikate fest und zeichnen Sie sie nur im Namensknoten auf. Wenn die Anzahl der Datenknoten geringer ist als die festgelegte Anzahl von Replikaten, beträgt die Anzahl der Replikate nur so viele wie Datenknoten.)
HDFS-API-Betrieb: über das FileSystem-Objekt
HDFS-Lese- und Schreibvorgang
Lesevorgang
Unterthema 1
Schreibvorgang
Illustration
Unterthema 3
Bienenstock
Konzept
Hive ist ein auf Hadoop basierendes Data Warehouse-Verwaltungstool, das strukturierte Daten in einer Tabelle abbildet und SQL-ähnliche Abfragefunktionen bereitstellt.
Prinzip
Essence Convert HQL in Mr Tasks
Metastore
Metadaten: einschließlich Tabellenname, Datenbank, zu der die Tabelle gehört (Standardeinstellung), Tabelleneigentümer, Spalten-/Partitionsfeld, Tabellentyp (ob es sich um eine externe Tabelle handelt), Verzeichnis, in dem sich die Daten der Tabelle befinden usw.
Klient
Bereitstellung einer JDBC/ODBC-Schnittstelle, WebUI-Zugriff, Schnittstellenzugriff usw.
Treiber
ParserSQL-Parser
Konvertieren Sie SQL in einen abstrakten Syntaxbaum AST. Dieser Schritt wird normalerweise mit einem Drittanbieter-Tool wie Antrl durchgeführt. Führen Sie eine Syntaxanalyse für SAT durch, um zu überprüfen, ob die SQL-Semantik korrekt ist, ob Tabellen und Spaltennamen vorhanden sind usw.
Physischer Plan des Compilers
Konvertieren Sie AST in einen logischen Ausführungsplan
Optimizer-Abfrageoptimierer
Optimieren Sie logische Ausführungspläne
Ausführung
Der logische Rückschreibplan wird in einen physischen Ausführungsplan umgewandelt, der ausgeführt werden kann. Für Hive wird es in mr/tez/spark-Aufgaben umgewandelt
Art der Daten
Grundlegende Datentypen
Der String-Typ von hive kann theoretisch 2G Zeichen speichern
Sammlungsdatentyp
Anweisung zur Erstellung einer Sammlungsdatentyptabelle
Tabellentest erstellen( Namenszeichenfolge, Freunde-Array<string>, Kinderkarte<string, int>, Adressstruktur<street:string, city:string> ) Zeilenformat-getrennte Felder, abgeschlossen durch „,“ //Spaltentrennzeichen Sammlungselemente, die durch „_“ beendet werden // Das Trennzeichen von MAP STRUCT und ARRAY (Datenaufteilung). Symbol) Kartenschlüssel enden mit „:“ // Kartenschlüssel und Werttrennzeichen Zeilen, abgeschlossen durch ' '; //Zeilentrenner
Typkonvertierung
Die atomaren Datentypen von Hive werden implizit konvertiert, ähnlich der Konvertierung von Java. Wenn ein Ausdruck beispielsweise den Typ INT verwendet, wird TINYINT automatisch in den Typ INT konvertiert, aber Hive führt die umgekehrte Konvertierung nicht durch. Wenn ein Ausdruck beispielsweise den Typ TINYINT verwendet, wird INT nicht automatisch in den Typ TINYINT konvertiert Typ. Es wird ein Fehler zurückgegeben, sofern nicht die CAST-Operation verwendet wird
Implizite Konvertierungsregeln
1. Jeder ganzzahlige Typ kann implizit in einen breiteren Typ konvertiert werden, z. B. TINYINT Durch INT ersetzt, kann INT in BIGINT konvertiert werden.
2. Alle Ganzzahltypen, FLOAT- und STRING-Typen können implizit in DOUBLE konvertiert werden. (Die implizite Konvertierung von String und Double kann leicht zu Datenverzerrungen führen.)
3. TINYINT, SMALLINT und INT können alle in FLOAT konvertiert werden.
4. Der Typ BOOLEAN kann nicht in einen anderen Typ konvertiert werden.
DDL
Tabelle erstellen
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTIERT NACH (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [Zeilenformat Zeilenformat] [GESPEICHERT ALS Dateiformat] [STANDORT hdfs_path] [TBLPROPERTIES (property_name=property_value, ...)] [AS select_statement]
erklären
(1) CREATE TABLE erstellt eine Tabelle mit dem angegebenen Namen. Wenn bereits eine Tabelle mit demselben Namen vorhanden ist, wird eine Ausnahme ausgelöst; der Benutzer kann diese Ausnahme mit der Option IF NOT EXISTS ignorieren. (2) Mit dem Schlüsselwort EXTERNAL können Benutzer beim Erstellen der Tabelle einen Pfad (LOCATION) angeben, der auf die tatsächlichen Daten verweist. Beim Löschen der Tabelle werden auch die Metadaten und Daten der internen Tabelle gelöscht zusammen und externe Tabellen löschen nur Metadaten, keine Daten. (3) KOMMENTAR: Kommentare zu Tabellen und Spalten hinzufügen. (4) PARTITIONED BY erstellt eine Partitionstabelle (5) CLUSTERED BY erstellt eine Bucket-Tabelle (6) SORTED BY wird nicht häufig verwendet. Es wird zum Sortieren einer oder mehrerer Spalten im Bucket verwendet. (7) Zeilenformat mit Trennzeichen [durch Zeichen beendete Felder] [Sammelelemente BEENDET DURCH char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] |. SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)] Benutzer können SerDe anpassen oder das integrierte SerDe beim Erstellen von Tabellen verwenden. Wenn ROW FORMAT oder ROW FORMAT DELIMITED nicht angegeben ist, wird das integrierte SerDe verwendet. Beim Erstellen einer Tabelle muss der Benutzer auch Spalten für die Tabelle angeben. Beim Angeben der Tabellenspalten muss der Benutzer auch ein benutzerdefiniertes SerDe angeben, um es zu bestimmen Spezifische Spaltendaten der angegebenen Tabelle. SerDe ist die Abkürzung für Serialize/Deserilize. Hive verwendet Serde zum Sequenzieren und Deserialisieren von Zeilenobjekten. (8) STORED AS gibt den Speicherdateityp an: SEQUENCEFILE (Binärsequenzdatei), TEXTFILE (Spaltenspeicherformatdatei). Wenn es sich bei den Dateidaten um Klartext handelt, können Sie STORED AS verwenden TEXTDATEI. Wenn die Daten komprimiert werden müssen, verwenden Sie STORED AS SEQUENCEFILE. (9) STANDORT: Geben Sie den Speicherort der Tabelle auf HDFS an. (10) AS: gefolgt von einer Abfrageanweisung zum Erstellen einer Tabelle basierend auf den Abfrageergebnissen. (11) Mit LIKE können Benutzer die vorhandene Tabellenstruktur kopieren, jedoch nicht die Daten.
Partitionstabelle
Der Kern der Partitionstabelle besteht darin, einem Ordner auf HDFS zu entsprechen, und die Partition in Hive ist ein Unterverzeichnis.
DML
Belastung
Daten [lokal] im Pfad „/opt/module/datas/student.txt“ laden [überschreiben] in die Tabelle student [Partition (partcol1=val1,…)];
einfügen
Grundeinlage
in die Tabelle einfügen (überschreiben) ...
Mehrfacher Tischeinsatz
aus Tabellenname in Tabelle t1 einfügen .... auswählen .... aus Tabellenname, Einfügen in Tabelle t2 .... select .... from tableName
Tabellen abfragen und erstellen
Erstelle Ballentabellennamen als Auswahl.....
Laden Sie Daten hoch, um eine Tabelle zu erstellen
1. Daten nach HDFS hochladen
2. Erstellen Sie die Tabelle und geben Sie ihren Speicherort auf HDFS an
Daten in HIVe importieren
Hinweis: Verwenden Sie zunächst „Export“, um die Daten zu exportieren und dann zu importieren.
Tabelle „Student2“-Partition (Monat = „201709“) aus „/user/hive/warehouse/export/student“ importieren;
Durch Abschneiden werden Daten in der Tabelle gelöscht
Es können nur Verwaltungstabellen gelöscht werden, Daten in externen Tabellen können nicht gelöscht werden
Häufig verwendete Funktionen
max
Mindest
Summe
Durchschn
zählen
Sortieren
globale Sortierung
Nach globaler Sortierung gibt es nur einen Reduzierer. Bei großen Datenmengen ist die Effizienz äußerst gering, bei kleinen Datenmengen jedoch hoch
Partitionssortierung
„Distribute by“ ähnelt dem benutzerdefinierten Partitionierer in der Mr-Aufgabe. Die Regel von „Distribute by“ besteht darin, dass nach der Modulo-Division der Anzahl der Reduzierer basierend auf dem Hash-Code des Partitionsfelds die Reste mit derselben Nummer in dieselbe Partition gelangen.
lokale Sortierung
„Sortieren nach“ ist die interne Sortierung jedes Reduzierers und ist global ungeordnet. Sie wird oft in Verbindung mit „Verteilen nach“ verwendet, wobei „Verteilen nach“ vorne und „Sortieren nach“ hinten steht.
Cluster nach
Es kann ersetzt werden, wenn „Verteilen nach Sortieren nach“ zusammen verwendet wird und die Felder in derselben aufsteigenden Reihenfolge liegen, indem die Sortierregel nicht als ASC oder DESC angegeben werden kann.
Partition, Eimer
Eimer
Bucketing muss aktiviert und konfiguriert sein. set hive.enforce.bucketing=true;
Erstellen Sie eine Bucket-Tabelle
Das Einfügen von Daten in eine Bucket-Tabelle ist dasselbe wie das Einfügen von Daten in eine normale Tabelle
Bucketing-Regeln
Das Bucket-Feld bestimmt, in welchem Bucket sich die Daten befinden, indem es den Modulus des Hash-Moduls dividiert durch die Anzahl der Buckets berechnet.
Der Unterschied zwischen Bucketing und Partitionierung
Die Partitionierung gilt für den Datenspeicherpfad, also den Ordner; die Bucketing-Funktion gilt für die Datendateien.
Eimer-Stichprobenerhebung
Grammatik
TABLESAMPLE(BUCKET x OUT OF y) .
Partition
Unterthema
Konvertieren Sie zwischen Zeilen und Spalten
Zeile zu Spalte
CONCAT(Zeichenfolge A/Spalte, Zeichenfolge B/Spalte…)
CONCAT_WS(Trennzeichen, str1, str2,...)
COLLECT_SET(col)
Bedienungsanleitung
Beispiel
SQL-Implementierung
Spalte zu Zeile
Bedienungsanleitung
Beispiel
SQL-Implementierung
Fensterfunktion
ÜBER()
aktuelle Zeile
aktuelle Zeile
n percing
Gehe n Zeilen vorwärts
n folgen
n Zeilen zurück
UNBEGRENZT
Startpunkt
Unbegrenztes Vorgehen bedeutet, von vorne zu beginnen
Unbegrenztes Folgen bedeutet bis zum Endpunkt dahinter
LAG(col,n,default_val)
Gehe zur n-ten Zeile vorwärts
Lead(col,n,default_val)
Von nun an in der n-ten Reihe
NTILE(n)
Verteilen Sie die Zeilen in der geordneten Partition auf die angegebenen Datengruppen. Jede Gruppe ist beginnend mit 1 nummeriert. Für jede Zeile gibt NTILE die Nummer der Gruppe zurück, zu der die Zeile gehört. Hinweis: n muss vom Typ int sein.
Beispiel
Daten
Anforderungen und Umsetzung
1. Fragen Sie die Kunden und die Gesamtzahl der Kunden ab, die im April 2017 gekauft haben
2. Überprüfen Sie die Kaufdetails des Kunden und die monatliche Kaufsumme
3. Im obigen Szenario müssen die Kosten nach Datum kumuliert werden.
4. Fragen Sie die letzte Kaufzeit jedes Kunden ab
5. Fragen Sie die Bestellinformationen der letzten 20 % ab
Rang
Bei gleicher Reihenfolge wird diese wiederholt und die Gesamtzahl bleibt unverändert.
dichter_Rang
Bei gleicher Reihenfolge gibt es keine Duplikate und die Gesamtzahl verringert sich.
Zeilennummer
wird der Reihe nach berechnet
Beispiel
Funktion
Integrierte Funktionen
Benutzerdefinierte Funktion
udf (benutzerdefinierte Funktion)
Merkmale: Einer rein, einer raus
Programmierschritte
1. Erben Sie die Klasse org.apache.hadoop.hive.ql.UDF
2. Die Evaluierungsfunktion muss implementiert werden. Die Evaluierungsfunktion unterstützt die Überladung.
3. Erstellen Sie eine Funktion im Befehlszeilenfenster von Hive
1.Glas hochladen
Fügen Sie jar linux_jar_path hinzu
2.Funktion erstellen
create [temporary] function [dbname.]function_name AS class_name;
4. Löschen Sie die Funktion im Befehlszeilenfenster von Hive
Löschen Sie die [temporäre] Funktion [falls vorhanden] [Datenbankname.]Funktionsname;
Hinweis: UDF muss einen Rückgabetyp haben und kann null zurückgeben, aber der Rückgabetyp darf nicht void sein;
udaf (Benutzerdefinierte Aggregationsfunktion)
Mehr rein und eins raus
Aggregatfunktion
udtf (Benutzerdefinierte Tabellengenerierungsfunktionen)
Einer rein, viele raus
Seitenansicht explodieren()
Komprimierung und Speicherung
Hive verwendet häufig Komprimierung und Speicherung
In Hive wird üblicherweise das Parquet-Dateiformat verwendet; für die Komprimierung wird lzo oder snappy verwendet.
Kompression
Komprimierungsformattabelle
Vergleich der Komprimierungsleistung
Einstellungen der Komprimierungsparameter
Lagerung
Gängige Dateiformate in Hive
Textdatei, Parkett, Orc, Sequenzdatei
Klassifizierung von Dateiformaten
Reihenspeicher
Merkmale
Beim Abfragen einer gesamten Datenzeile, die die Bedingungen erfüllt, muss der Spaltenspeicher zu jedem aggregierten Feld gehen, um den entsprechenden Wert jeder Spalte zu finden. Der Zeilenspeicher muss nur einen der Werte finden, und die restlichen Werte sind vorhanden an benachbarten Stellen, sodass Abfragen in diesem Zeilenspeicher schneller sind.
Textdatei
Im Standardformat werden die Daten nicht komprimiert, was zu einem hohen Festplatten-Overhead und einem hohen Datenparsing-Overhead führt.
Sequenzdatei
Säulenspeicher
Merkmale
Da die Daten jedes Felds aggregiert und gespeichert werden, kann die Datenmenge, die gelesen wird, erheblich reduziert werden, wenn für die Abfrage nur wenige Felder erforderlich sind. Entworfener Komprimierungsalgorithmus.
Parkett
Ork
Komposition
Orc-Dateien bestehen im Allgemeinen aus einem oder mehreren Streifen. Jeder Streifen hat die Größe eines HDFS-Blocks. Diese Datensätze werden unabhängig voneinander nach Spalten gespeichert.
Streifen
Indexdaten
Unterthema 1
Zeilendaten
Streifenfußzeile
Abstimmung
Capture holen
Dies bedeutet, dass die Abfrage in einigen Fällen nicht die MR-Aufgabe durchlaufen muss, z. B. „select * from table“. In diesem Fall kann Hive einfach die Datei im Tabellenverzeichnis lesen und an die Konsole ausgeben.
Einstellungen zum Aktivieren der Aufnahme abrufen
Legen Sie hive.fetch.task.conversion = more in der Datei hive-default.xml.template fest
Nach dem Einschalten wird die MR-Aufgabe bei der globalen Suche, der eingeschränkten Suche und der Feldsuche nicht mehr verwendet.
Lokalbetrieb
Die Hive-Eingabedaten sind gering und die zum Auslösen der Abfrageausführungsaufgabe benötigte Zeit kann viel länger sein als die tatsächliche Auftragsausführungszeit. In diesem Fall können Sie den lokalen Modus aktivieren, um alle Aufgaben auf einem einzelnen Computer zu verarbeiten. Die Ausführungszeit von Aufgaben für kleine Datensätze wird erheblich verkürzt
Parametereinstellungen
set hive.exec.mode.local.auto=true; //Lokalen mr aktivieren
Tabellenoptimierung
Großer Tisch, kleiner Tisch verbinden
Wenn Sie kleine Tabellen vorne und große Tabellen hinten platzieren, kann das Risiko von Speicherüberlauffehlern wirksam verringert werden. Nach der Optimierung hat das Platzieren kleiner Tabellen vorne und großer Tabellen hinten keine Auswirkungen.
Map Join (kleiner Tisch verbindet großen Tisch)
Einstellungen für die Aktivierung der Kartenbeitrittsfunktion
Map Join ist standardmäßig aktiviert
set hive.auto.convert.join = true;
set hive.mapjoin.smalltable.filesize=25000000;//Die Standardgröße für kleine Tabellen beträgt 25 MB
Map-Join-Prinzip
Am großen Tisch Platz nehmen
1. Leere Schlüsselfilterung
Eine große Menge abnormaler Daten mit leeren Schlüsseln gelangt in den gleichen Reduzierer und ist extrem langsam zu verarbeiten. Manchmal wird sogar der Speicher überfüllt. Sie können die leeren Schlüssel zuerst herausfiltern.
2. Konvertierung leerer Schlüssel
Eine große Anzahl leerer Schlüssel sind keine abnormalen Daten und müssen in die Ergebnismenge aufgenommen werden. Anschließend können Sie den Schlüsseln Werte zuweisen und diese im Reduzierer gleichmäßig verteilen.
gruppiere nach
Aktivieren Sie die kartenseitige Aggregation
Parametereinstellungen
1. Aktivieren Sie die Aggregation auf der Kartenseite
setze hive.map.aggr = true
2. Aggregieren Sie die Anzahl der Elemente auf der Kartenseite
setze hive.groupby.mapaggr.checkinterval = 100000
3. Führen Sie einen Lastausgleich durch, wenn ein Datenversatz vorliegt (Standardeinstellung ist „false“).
setze hive.groupby.skewindata = true
Prinzip: Die Kartenseite des ersten Jobs verteilt die Schlüssel zufällig an die Reduzierer. Jeder Reduzierer führt intern eine Aggregationsoperation durch und gibt die Ergebnisse des ersten Jobs aus Das Gleiche Der Schlüssel wird zur Aggregation an denselben Reduzierer gesendet, um den endgültigen Aggregationsvorgang abzuschließen.
zählen (eindeutig)
Kleine Datenmengen spielen keine Rolle
Große Datenmenge
Bei großen Datenmengen gibt count(distinct) nur einen Reduzierer ein, egal wie viele Reduzierer vorhanden sind, was sich auf den Auftragsfortschritt auswirkt. Sie können Group by verwenden, um Deduplizierungsstatistiken durchzuführen.
Kartesisches Produkt
Versuchen Sie, kartesische Produkte zu vermeiden, fügen Sie beim Beitritt keine On-Bedingungen hinzu oder verwenden Sie ungültige On-Bedingungen, um Daten nur mit einem Reduzierer zu verarbeiten.
Zeilen- und Spaltenfilterung
Spaltenverarbeitung
Nehmen Sie in select nur die erforderlichen Spalten und verwenden Sie select * so wenig wie möglich
Zeilenverarbeitung
Wenn die Filterbedingungen der Sekundärtabelle nach wo in der Zuordnung geschrieben werden, werden die beiden Tabellen zunächst mit der gesamten Tabelle verknüpft und dann die Daten gefiltert. Es wird empfohlen, zunächst eine Unterabfrage mit Filterbedingungen für die Sekundärtabelle durchzuführen Führen Sie dann die Assoziation durch.
dynamische Partitionierung
Aktivieren Sie dynamische Partitionseinstellungen
1. Aktivieren Sie die Einstellungen der dynamischen Partitionierungsfunktion (standardmäßig aktiviert).
hive.exec.dynamic.partition=true
2. Stellen Sie den nicht strikten Modus ein (den Modus der dynamischen Partitionierung). Der Standardwert ist strikt, was bedeutet, dass mindestens eine Partition als angegeben werden muss Statische Partitionierung, nicht strikter Modus bedeutet, dass alle Partitionsfelder die dynamische Partitionierung verwenden dürfen. )
hive.exec.dynamic.partition.mode=nonstrict
3. Die maximale Anzahl dynamischer Partitionen, die auf allen Knoten erstellt werden können, die MR ausführen. Standard 1000
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 auf dem tatsächlichen Wert basieren einzustellende Daten. Beispiel: Die Quelldaten enthalten Daten für ein Jahr, das heißt, das Tagesfeld hat 365 Werte, dann ist dieser Parameter Der Wert muss größer als 365 sein. Wenn Sie den Standardwert 100 verwenden, wird ein Fehler gemeldet.
hive.exec.max.dynamic.partitions.pernode=100
5. Die maximale Anzahl von HDFS-Dateien, die im gesamten MR-Job erstellt werden können. Standard 100000
hive.exec.max.created.files=100000
6. Ob eine Ausnahme ausgelöst werden soll, wenn eine leere Partition generiert wird. Im Allgemeinen sind keine Einstellungen erforderlich. Standardmäßig falsch
hive.error.on.empty.partition=false
Partition
Eimer
Datenverzerrung
1. Legen Sie eine angemessene Anzahl von Karten fest
Parallele Ausführung
Standardmäßig kann Hive jeweils nur eine Phase ausführen. Ein bestimmter Job kann jedoch viele Phasen enthalten, und diese Phasen sind möglicherweise nicht vollständig voneinander abhängig. Das heißt, einige Phasen können parallel ausgeführt werden Der Auftrag kann durch die parallele Ausführung schneller abgeschlossen werden.
Parametereinstellungen aktivieren
set hive.exec.parallel=true; // Parallele Ausführung von Aufgaben aktivieren set hive.exec.parallel.thread.number=16; //Der maximal zulässige Parallelitätsgrad für dasselbe SQL, der Standardwert ist 8.
strikter Modus
JVM-Wiederverwendung
spekulative Hinrichtung
Kompression
Zahlenlagertheorie
Konzept
Es handelt sich um eine strategische Sammlung, die alle Arten von Datenunterstützung für den Entscheidungsprozess auf allen Ebenen des Unternehmens bietet.
Besonderheit
Ein Data Warehouse ist eine auf Mastergraphen basierende, integrierte, nichtflüchtige und zeitlich veränderliche Datensammlung zur Unterstützung der Entscheidungsfindung
Themenorientiert
Integration
Nichtflüchtig (kann nicht geändert werden)
zeitveränderlich
etl
Extrahieren, Transformieren, Laden, Laden
Stratifizierung des Data Warehouse
Quelldaten
Es gibt keine Änderungen an den Daten in dieser Schicht. Sie nutzt direkt die Datenstruktur und -daten des Peripheriesystems und ist nicht für die Öffentlichkeit zugänglich. Es handelt sich um eine temporäre Speicherschicht, bei der es sich um einen temporären Speicherbereich für Schnittstellendaten handelt, der für die spätere Verwendung vorgesehen ist Datenverarbeitung.
Datenbank
Die Daten in der DW-Schicht, auch Detailschicht genannt, sollten konsistente, genaue und saubere Daten sein, die aus den Quellsystemdaten bereinigt (von Verunreinigungen befreit) wurden.
Datenanwendung
Datenquellen, die direkt von Front-End-Anwendungen gelesen werden; Daten, die auf der Grundlage von Berichts- und thematischen Analyseanforderungen berechnet und generiert werden
warum Layering
Raum für Zeit
Um die Benutzererfahrung (Effizienz) des Anwendungssystems zu verbessern, wird ein großer Teil der Vorverarbeitung verwendet, sodass im Data Warehouse eine große Menge redundanter Daten ohne Schichtung vorhanden ist, wenn sich die Geschäftsregeln des Quellgeschäftssystems ändern wirkt sich auf den gesamten Datenbereinigungsprozess aus, und die Arbeit ist riesig.
Layering vereinfacht den Datenbereinigungsprozess
Der Prozess der Datenbereinigung kann durch die Datenhierarchieverwaltung vereinfacht werden, da die Aufteilung der ursprünglichen einstufigen Arbeit in mehrere Schritte der Aufteilung einer komplexen Arbeit in mehrere einfache Aufgaben und der Umwandlung einer großen Black Box in eine White Box entspricht Die Verarbeitungslogik jeder Ebene ist relativ einfach und leicht zu verstehen. Dadurch können wir die Richtigkeit jedes Schritts einfacher sicherstellen. Wenn Fehler in den Daten auftreten, müssen wir häufig nur einen bestimmten Schritt anpassen.
Datenmarkt
Data-Mart-Architektur
unabhängiger Datenmarkt
Abhängiger Datenmarkt
Stratifizierung des Data Warehouse
Prinzip der Data-Warehouse-Schichtung
1. Um die Datenanalyse zu erleichtern, ist es notwendig, das zugrunde liegende komplexe Geschäft abzuschirmen und die Daten auf einfache, vollständige und integrierte Weise der Analyseebene zugänglich zu machen.
2. Die Auswirkungen zugrunde liegender Geschäftsänderungen und Nachfrageänderungen auf der oberen Ebene werden minimiert. Die Auswirkungen von Geschäftssystemänderungen werden auf der Basisdatenebene abgeschwächt Modell ist geschwächt.
3. Hohe Kohäsion und lose Kopplung, d. h. hohe Kohäsion der Daten innerhalb eines Themas oder innerhalb jedes vollständigen Systems und lose Kopplung der Daten zwischen Themen oder zwischen vollständigen Systemen.
4. Erstellen Sie die grundlegende Datenschicht des Lagers, um die zugrunde liegende Geschäftsdatenintegrationsarbeit von der Anwendungsentwicklungsarbeit der oberen Schicht zu isolieren und so den Grundstein für die groß angelegte Entwicklung des Lagers zu legen. Die Lagerhierarchie wird klarer und die Daten werden extern offengelegt wird einheitlicher sein.
Stratifizierung des Data Warehouse
ods (Operational Data Store)
Greifen Sie unversehrt auf die Originaldaten zu
DW (Data Warehouse)
DWD-Datendetailebene (Data Warehouse Detail).
Die Granularität stimmt mit der Ods-Schicht überein und bietet bestimmte Garantien für die Datenqualität. Was die DWD-Schicht tun muss, ist die Datenbereinigung, Integration und Standardisierung. Schmutzige Daten, Junk-Daten, Daten mit inkonsistenten Spezifikationen, inkonsistenten Statusdefinitionen und inkonsistenten Namensspezifikationen werden alle verarbeitet. Um die Nutzbarkeit von Daten zu verbessern, werden gleichzeitig einige Dimensionsdegradationstechniken verwendet, um Dimensionen in Faktentabellen zu degradieren und die Zuordnung zwischen Dimensionstabellen und Faktentabellen zu verringern. Auf dieser Ebene werden einige Daten auch aggregiert, um Daten aus demselben Themenbereich in derselben Tabelle zusammenzuführen und so die Nutzbarkeit der Daten zu verbessern.
DWM-Daten-Mittelschicht (Data WareHouse Middle).
Auf der Grundlage der DWD-Schicht wird die Indikatoraggregationsoperation für die gemeinsamen Kerndimensionen durchgeführt, um die entsprechenden statistischen Indikatoren zu berechnen. Wenn bei tatsächlichen Berechnungen die Berechnungsindikatoren der breiten Tabelle direkt aus der DWD- oder ODS-Schicht berechnet werden, treten Probleme wie zu viele Berechnungen und zu wenige Dimensionen auf. Daher besteht der allgemeine Ansatz darin, zunächst mehrere kleine Zwischentabellen zu berechnen die DWM-Ebene und fügen Sie sie dann zu einer breiten Tabelle zusammen. Da die Breite und Breitengrenzen schwer zu definieren sind, können Sie auch die DWM-Ebene entfernen und nur die DWS-Ebene belassen.
DWS-Datendienstschicht (Data WareHouse Servce).
Die Granularität ist gröber als die detaillierte Ebene. Daten, die auf der DWD-Ebene basieren, werden zur Analyse eines bestimmten Themenbereichs integriert und zu Servicedaten zusammengefasst, bei denen es sich im Allgemeinen um eine breite Tabelle handelt. Die DWS-Schicht sollte 80 % der Nährstoffszene abdecken. Es wird auch als Data Mart oder Wide Table bezeichnet und für nachfolgende Geschäftsabfragen, Olap-Analysen, Datenverteilung usw. verwendet.
APP-Datenanwendungsschicht
Die Daten werden hauptsächlich für Datenprodukte und Datenanalysen bereitgestellt. Sie werden im Allgemeinen in ES, PostgreSql, Redis und anderen Systemen zur Verwendung durch Online-Systeme gespeichert. Sie können auch in Hive oder Druid für Datenanalysen und Data Mining gespeichert werden. Beispielsweise werden die Berichtsdaten, über die wir oft sprechen, normalerweise hier platziert.
Dim-Dimension-Oberflächenschicht
Wenn Sie Dimensionstabellen haben, können Sie diese Ebene separat entwerfen.
Daten mit hoher Kardinalität
Im Allgemeinen ähnelt es der Benutzerdatentabelle und der Produkttabellendatentabelle. Die Datenmenge kann Dutzende Millionen oder Hunderte Millionen betragen
Daten zum niedrigen Grundumfang
Im Allgemeinen handelt es sich um eine Konfigurationstabelle, z. B. die chinesische Bedeutung, die dem Aufzählungswert entspricht, oder um eine Datumsdimensionstabelle. Die Datenmenge kann aus einzelnen Ziffern, Hundertern, Tausendern oder Zehntausenden bestehen.
Methode zur Data-Warehouse-Modellierung
dimensionale Modellierung
Bedeutung
Erstellen Sie ein Modell basierend auf den Anforderungen der analysierten Entscheidungen. Das erstellte Datenmodell erfüllt die Analyseanforderungen, wobei der Schwerpunkt auf der Lösung des Problems liegt, dass Benutzer die Analyse schnell abschließen, und weist außerdem eine gute Antwortleistung bei umfangreichen, komplexen Abfragen auf.
Faktentabelle
Periodische Snapshot-Faktentabelle
Transaktionsfaktentabelle
Kumulative Snapshot-Faktentabelle
Faktentabelle ohne Fakten
aggregierte Faktentabelle
Faktentabellen zusammenführen
Dimensionstabelle
Sternschema
Alle Dimensionstabellen sind mit der Faktentabelle verbunden und Dimensionstabellen sind nicht mit anderen Dimensionstabellen verknüpft.
Konstellationsmodell
Als Erweiterung des Star-Schemas nutzen mehrere Faktentabellen gemeinsame Dimensionsinformationen
Schneeflockenmodell
Die Faktentabelle ist mit der Dimensionstabelle verknüpft. Es gibt viele Zuordnungen und eine geringe Leistung.
Dimensionsmodellierungsprozess
Geschäftsprozess auswählen
Granularität der Deklaration
Die gleiche Faktentabelle muss die gleiche Granularität haben. Mischen Sie nicht mehrere unterschiedliche Granularitäten in derselben Faktentabelle. Verwenden Sie unterschiedliche Granularitätsdaten, um unterschiedliche Faktentabellen zu erstellen. Für Daten, deren Anforderungen unklar sind, legen wir eine atomare Granularität fest.
Maße bestätigen
Bestätigen Sie die Fakten
Paradigmenmodellierung
6 Paradigmen der Datenbank
Erste Normalform (1NF)
Hervorgehoben wird die Atomizität der Spalte, das heißt, die Spalte kann nicht in andere Spalten unterteilt werden.
Zweite Normalform (2NF)
Um die erste Normalform zu erfüllen, müssen zwei Bedingungen erfüllt sein: Erstens muss die Tabelle einen Primärschlüssel haben. Zweitens müssen die Spalten, die nicht im Primärschlüssel enthalten sind, vollständig vom Primärschlüssel abhängen und dürfen nicht nur von einem Teil des Primärschlüssels abhängen Schlüssel.
Dritte Normalform (3NF)
Um 2nf zu erfüllen, müssen Nicht-Primärschlüsselspalten direkt vom Primärschlüssel abhängen und es darf keine transitiven Abhängigkeiten geben. Das heißt, es kann nicht existieren: Nicht-Primärschlüssel-Spalte A hängt von Nicht-Primärschlüssel-Spalte B und Nicht-Primärschlüssel-Spalte B ab
Boyce-Codd-Normalform (BCNF)
Vierte Normalform (4NF)
Fünfte Normalform (5NF)
Modellierungsschritte
1. Konzeptionelles Modell
2. Logikmodell
3.Physikalisches Modell
Ideen für den Kernaufbau eines Data Warehouse
Auf der Entwurfs-, Entwicklungs-, Bereitstellungs- und Anwendungsebene vermeiden wir wiederholte Konstruktionen und redundante Indexkonstruktionen und stellen so die Standardisierung und Vereinheitlichung des Datenkalibers sicher und realisieren letztendlich die vollständige Verknüpfung von Datenbeständen, wodurch eine Standarddatenausgabe und einheitliche Daten bereitgestellt werden öffentliche Ebene
Bauprozess eines Rechenzentrums
Impala
Art der Daten
Shell-Befehl
Die Architektur
Modul
impalad
Empfangen Sie die Anfrage des Kunden, führen Sie die Anfrage aus und kehren Sie zur zentralen Koordinationsstelle zurück
Der Daemon-Prozess auf dem untergeordneten Knoten ist für die Aufrechterhaltung der Kommunikation mit dem Statestore und die Berichtsarbeit verantwortlich
Statestore
Verantwortlich für das Sammeln von Ressourceninformationen, die in jedem Impalad-Prozess verteilt werden, den Gesundheitsstatus jedes Knotens und die Synchronisierung von Knoteninformationen
Verantwortlich für die Koordination und Terminplanung von Anfragen
Katalog
Verteilen Sie Tabellenmetadateninformationen an jedes Impalad
Erhalten Sie alle Anfragen von statestore
hiveMetastore
hdfs
ddl
Impala unterstützt WITH DBPROPERTIES nicht (zum Beispiel: Hinzufügen von Erstellerinformationen und Erstellungsdatum zur Bibliothek)
Datenbank löschen
Datenbank löschen
Impala unterstützt keine Alter-Datenbank
dml
Datenimport (im Grunde das Gleiche wie Hive), Impala unterstützt das lokale Laden von Daten im Inpath nicht ...
Datenexport (Impala unterstützt keine Insert-Overwrite-Syntax zum Exportieren von Daten, Sie können stattdessen impala -o verwenden)
Export- und Importbefehle werden nicht unterstützt
Anfragen
Die grundlegende Syntax entspricht in etwa der der Hive-Abfrageanweisung.
Impala unterstützt kein Bucketing
Impala unterstützt kein Clustern nach, Sortieren nach, Verteilen nach
Impala unterstützt die Funktionen COLLECT_SET(col) und explosion(col) nicht
Impala unterstützt Fensterfunktionen
Benutzerdefinierte Impala-Funktion
udf
Speicherung und Komprimierung
Optimierung
1. Versuchen Sie, StateStore und Katalog so weit wie möglich auf demselben Server bereitzustellen, um ihre Kommunikation sicherzustellen.
2. Verbessern Sie die Arbeitseffizienz, indem Sie den Speicher von Impala Dameon (Standard 256) und die Anzahl der Statestore-Threads begrenzen
3. SQL-Optimierung: Rufen Sie den Ausführungsplan auf, bevor Sie SQL ausführen
4. Wählen Sie das geeignete Dateiformat für die Speicherung, um die Abfrageeffizienz zu verbessern
5. Vermeiden Sie das Generieren vieler kleiner Dateien (wenn von anderen Programmen kleine Dateien generiert werden, können Sie eine Zwischentabelle verwenden, um die kleinen Dateidaten in der Zwischentabelle zu speichern. Fügen Sie dann die Daten aus der Zwischentabelle durch Einfügen in die endgültige Tabelle ein. ..wählen...)
6. Verwenden Sie eine geeignete Partitionierungstechnologie und berechnen Sie entsprechend der Partitionsgranularität
7. Verwenden Sie Rechenstatistiken, um Tabelleninformationen zu sammeln. Wenn sich eine Inhaltstabelle oder -partition erheblich ändert, berechnen Sie die statistikbezogenen Datentabellen oder -partitionen neu. Da Unterschiede in der Anzahl der Zeilen und unterschiedlichen Werten dazu führen können, dass Impala eine andere Verknüpfungsreihenfolge wählt, wenn eine Abfrage für die Tabelle verwendet wird.
8. Optimierung des Netzwerk-IO
–a. Vermeiden Sie es, die gesamten Daten an den Client zu senden
–b. Führen Sie so viel bedingte Filterung durch wie möglich
–c. Beschränkungsklausel verwenden
–d. Vermeiden Sie bei der Ausgabe von Dateien die Verwendung einer verschönerten Ausgabe
–e. Versuchen Sie, eine weniger vollständige Metadatenaktualisierung zu verwenden
9. Verwenden Sie das Profil, um den zugrunde liegenden Informationsplan auszugeben und die Umgebung entsprechend zu optimieren.
Data-Lake-Theorie
Funke
Eingebautes Modul
Funkenkern
Implementierte die Grundfunktionen von Spark, einschließlich Modulen wie Aufgabenplanung, Speicherverwaltung, Fehlerbehebung und Interaktion mit Speichersystemen. Spark Core enthält auch API-Definitionen für Resilient Distributed DataSet (RDD).
Spark SQL
Spark ist ein Paket zur Bearbeitung strukturierter Daten und kann HQL unterstützen
Spark-Streaming
Die Streaming-Computing-Komponente API entspricht in hohem Maße dem Spark Core
Spark Mlib
Stellt gängige Bibliotheken für maschinelles Lernen bereit
Funke graghx
Diagrammberechnung
Betriebsart
Lokalbetrieb
Standalone-Modus
Garnmodus
Garn-Kunde
Merkmale:
Der Treiber läuft auf dem Client und eignet sich für Interaktion und Debugging.
Garn-Cluster
Merkmale
Der Treiber führt den von resourcesManager gestarteten applicationMaster aus und ist für Produktionsumgebungen geeignet.
Sparkcore
rdd
berechnen
Partitionen
Partitionierer
Abhängigkeiten
Operator
Konvertierungsoperator
Werttyp
Karte(Funktion)
mapPartitions(func)
Der Funktionstyp von func muss Iterator[T] => Iterator[U] sein.
mapPartitionsWithIndex(func)
Der Funktionstyp von func muss (Int, Interator[T]) => Iterator[U] sein.
flatMap(func)
glom()
Bilden Sie jede Partition zu einem Array und bilden Sie einen neuen RDD-Typ RDD[Array[T]]
gruppiere nach()
Unterthema 1
Gruppieren Sie nach dem Rückgabewert der übergebenen Funktion. Geben Sie die Werte, die demselben Schlüssel entsprechen, in einen Iterator ein.
Filter
Probe (mit Ersatz, Fraktion, Samen)
Einen Teil der Daten zufällig mit dem angegebenen Zufallszahlengenerator abtasten. withReplacement gibt an, ob die extrahierten Daten durch Abtasten mit Ersetzen ersetzt werden. Falsch bedeutet, dass Abtasten ohne Ersetzen verwendet wird, um den Zufallszahlengenerator-Startwert anzugeben.
unique([numTasks]))
Gibt ein neues RDD zurück, nachdem das Quell-RDD dedupliziert wurde. Standardmäßig werden nur 8 parallele Aufgaben ausgeführt. Dies kann jedoch durch Übergabe eines optionalen Parameters „numTasks“ geändert werden.
merge(numPartitions)
Reduzieren Sie die Anzahl der Partitionen, um die Ausführungseffizienz kleiner Datensätze nach dem Filtern großer Datensätze zu verbessern.
Neupartition(numPartitions)
Alle Daten werden basierend auf der Anzahl der Partitionen erneut zufällig durch das Netzwerk gemischt.
Der Unterschied zwischen Zusammenführung und Neupartitionierung
1. Beim Zusammenführen von Neupartitionen können Sie auswählen, ob der Mischvorgang durchgeführt werden soll. Durch Parameter-Shuffle: Boolean = false/true Entscheiden.
2. Die Neupartitionierung ruft tatsächlich „Coalesce“ auf, um einen Shuffle durchzuführen.
sortBy(func,[ascending], [numTasks])
Verwenden Sie zunächst func, um die Daten zu verarbeiten, und sortieren Sie sie entsprechend den Ergebnissen des verarbeiteten Datenvergleichs. Die Standardeinstellung ist positive Reihenfolge.
Pipe(Befehl, [envVars])
Die Pipeline führt für jede Partition ein Shell-Skript aus und gibt ein RDD der Ausgabe zurück.
Doppelter Werttyp
Union
subtract(otherDataset)
Eine Funktion, die die Differenz berechnet und die gleichen Elemente in zwei RDDs entfernt, und unterschiedliche RDDs bleiben übrig
Schnittpunkt(otherDataset)
Gibt ein neues RDD zurück, nachdem sich das Quell-RDD und das Parameter-RDD überschnitten haben.
kartesisch (anderer Datensatz)
Kartesisches Produkt
zip(otherDataset)
Kombinieren Sie zwei RDDs in Form eines Schlüssels/Werts zu einem RDD. Standardmäßig ist die Anzahl der Partitionen und Elemente der beiden RDDs gleich, andernfalls wird eine Ausnahme ausgelöst.
Schlüssel-/Werttyp
partitionBy(partitioner)
Führen Sie einen Partitionierungsvorgang für pairRDD durch. Wenn das ursprüngliche partionRDD mit dem vorhandenen partionRDD übereinstimmt, wird keine Partitionierung durchgeführt. Andernfalls wird ShuffleRDD generiert, wodurch ein Shuffle-Prozess generiert wird.
reduceByKey(func, [numTasks])
Wird auf einem (K, V) RDD aufgerufen und gibt ein (K, V) RDD zurück, wobei die angegebene Reduzierungsfunktion verwendet wird, um die Werte desselben Schlüssels zusammenzufassen. Die Anzahl der Reduzierungsaufgaben kann über die zweite Option übergeben werden einzustellende Parameter.
groupByKey()
groupByKey bearbeitet auch jeden Schlüssel, generiert jedoch nur eine Sequenz.
Der Unterschied zwischen ReduceByKey und GroupByKey
1. ReduceByKey: Aggregation basierend auf dem Schlüssel, vor dem Shuffle gibt es eine Kombinationsoperation (Voraggregation) und das Rückgabeergebnis ist RDD[k,v]. 2. groupByKey: Nach Schlüssel gruppieren und direkt mischen. 3. Entwicklungsanleitung: ReduceByKey wird gegenüber GroupByKey empfohlen. Sie müssen jedoch darauf achten, ob sich dies auf die Geschäftslogik auswirkt.
aggregatByKey
Parameter: (zeroValue:U,[partitioner: Partitioner]) (seqOp: (U, V) => U,combOp: (U, U) => U)
In der RDD von kv-Paaren werden Werte nach Schlüssel gruppiert und zusammengeführt. Beim Zusammenführen werden jeder Wert und der Anfangswert als Parameter der seq-Funktion zur Berechnung verwendet, und das zurückgegebene Ergebnis wird als neues kv-Paar verwendet. und dann wird das Ergebnis gemäß berechnet Der Schlüssel wird zusammengeführt und schließlich wird der Wert jeder Gruppe zur Berechnung an die Kombinationsfunktion übergeben (die ersten beiden Werte werden zuerst berechnet und das Rückgabeergebnis und der nächste Wert werden an übergeben die Kombinationsfunktion usw.), und der Schlüssel und das Berechnungsergebnis sind wie folgt: Ein neues kv-Paar wird ausgegeben.
FoldByKey
Parameter: (zeroValue: V)(func: (V, V) => V): RDD[(K, V)]
Vereinfachte Bedienung vonaggregatByKey, seqop und Combop sind gleich
kombinierenByKey[C]
Parameter: (createCombiner: V => C, mergeValue: (C, V) => C, mergeCombiners: (C, C) => C)
Funktion: V zu einer Menge für dasselbe K zusammenführen
Unterthema 3
sortByKey([aufsteigend], [numTasks])
Beim Aufruf auf einem RDD von (K, V) muss K die Ordered-Schnittstelle implementieren und ein nach Schlüssel sortiertes RDD von (K, V) zurückgeben.
Kartenwerte
Arbeiten Sie bei Typen der Form (K, V) nur mit V
join(otherDataset, [numTasks])
Wird für RDDs vom Typ (K, V) und (K, W) aufgerufen und gibt ein RDD von (K, (V, W)) zurück, in dem alle Elemente, die demselben Schlüssel entsprechen, gepaart sind.
cogroup(otherDataset, [numTasks])
Wird für RDDs vom Typ (K,V) und (K,W) aufgerufen und gibt ein RDD vom Typ (K,(Iterable<V>,Iterable<W>)) zurück.
Aktion
reduzieren(Funktion)
Aggregieren Sie alle Elemente im RDD über die Funktion func, aggregieren Sie zuerst die Daten innerhalb der Partition und dann die Daten zwischen Partitionen
sammeln()
Geben Sie im Treiber alle Elemente des Datensatzes als Array zurück.
zählen()
Gibt die Anzahl der Elemente im RDD zurück
Erste()
Gibt das erste Element im RDD zurück
genommen)
Gibt ein Array zurück, das aus den ersten n Elementen des RDD besteht
takeOrdered(n)
Gibt ein Array zurück, das aus den ersten n Elementen besteht, sortiert nach diesem RDD
Aggregat
Parameter: (zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U)
Die Aggregatfunktion aggregiert die Elemente in jeder Partition über seqOp und den Anfangswert und kombiniert dann mithilfe der Combine-Funktion das Ergebnis jeder Partition mit dem Anfangswert (zeroValue). Der von dieser Funktion zurückgegebene endgültige Typ muss nicht mit dem Elementtyp im RDD übereinstimmen
falten(num)(func)
Der Faltvorgang, der vereinfachte Betrieb von Aggregat, Seqop und Combop sind gleich.
Unterthema 9
Spark-Kernel
Funkenkernkomponenten
Treiber
Vollstrecker
Funken allgemeiner laufender Prozess
1) Nachdem die Aufgabe übermittelt wurde, wird zuerst das Treiberprogramm gestartet. 2) Der Treiber registriert dann die Anwendung beim Cluster-Manager; 3) Der Cluster-Manager weist dann den Executor gemäß der Konfigurationsdatei dieser Aufgabe zu und startet ihn. 4) Der Treiber beginnt mit der Ausführung der Hauptfunktion und die Spark-Abfrage wird träge ausgeführt. Wenn der Aktionsoperator ausgeführt wird, beginnt die umgekehrte Berechnung und die Stufen werden nach breiten Abhängigkeiten unterteilt. Dann entspricht jede Stufe einem Taskset mehrere Aufgaben im Aufgabensatz. Suche nach verfügbaren Ressourcen. Ausführender für die Planung. 5) Gemäß dem Lokalisierungsprinzip wird die Aufgabe zur Ausführung an den designierten Executor verteilt. Während des Taskausführungsprozesses kommuniziert der Executor weiterhin mit dem Treiber und meldet den Ausführungsstatus der Aufgabe.
Bereitstellungsmodus
eigenständig
Hadoop-Garn
Garn-Kunde
Garn-Cluster
Mesos
k8s
Wortzahl
sc.textFile("xx").flatMap(_.split(" ")).map((_,1)).reduceByKey(_ _).saveAsTextFile("xx")
Optimierung
Datenverzerrung
Speichermodell
Gängige Algorithmen
Kafka
Hbase
Definition
Hbase ist ein noSql-System mit hoher Zuverlässigkeit, hoher Leistung, spaltenorientiertem, skalierbarem verteiltem Speicher und Echtzeitspeicher.
Merkmale
1. Massenspeicher
Hbase eignet sich zum Speichern von Daten auf PB-Ebene, und Daten auf PC-Ebene können innerhalb von zehn bis Hunderten von Millisekunden zurückgegeben werden.
2. Säulenspeicher
HBase-Speicher verfügt nur über Spaltenfamilienspeicher, der viele Spalten enthält.
3. Extrem einfach zu erweitern
Die Skalierbarkeit von Hbase spiegelt sich hauptsächlich in zwei Aspekten wider: Zum einen in der Erweiterung basierend auf Verarbeitungsfunktionen der oberen Schicht (RegionServer) und zum anderen in der Erweiterung basierend auf Speicher (HDFS). Durch das horizontale Hinzufügen von RegionSever-Maschinen wird eine horizontale Erweiterung durchgeführt, um die Verarbeitungsfähigkeiten der oberen Schicht von Hbase zu verbessern und die Fähigkeit von Hbsae zu verbessern, mehr Regionen zu bedienen.
4. Hohe Parallelität
Da die meisten aktuellen Architekturen, die Hbase verwenden, billige PCs verwenden, ist die Verzögerung einer einzelnen E/A tatsächlich nicht gering und liegt im Allgemeinen zwischen zehn und mehreren Hundert ms. Die hier erwähnte hohe Parallelität bedeutet hauptsächlich, dass bei Parallelität die einzelne E/A-Verzögerung von Hbase nicht viel abnimmt. Kann Dienste mit hoher Parallelität und geringer Latenz erhalten.
5. Spärlich
Sparse dient hauptsächlich der Flexibilität von Hbase-Spalten. Sie können so viele Spalten angeben, wie Sie möchten. Wenn die Spaltendaten leer sind, belegen sie keinen Speicherplatz.
Hbase-Architektur
Architekturdiagramm
Klient
Enthält die Schnittstelle für den Zugriff auf HBase und enthält außerdem einen Cache, um den HBase-Zugriff zu beschleunigen. Der Cache enthält beispielsweise .META-Informationen.
Tierpfleger
Hauptverantwortlich für die hohe Verfügbarkeit des Masters, die Überwachung des Reginservers, die Eingabe von Metadaten und die Wartung der Clusterkonfiguration.
ZK wird verwendet, um sicherzustellen, dass nur ein Master im Cluster ausgeführt wird. Wenn der Master ausfällt, wird durch einen Konkurrenzmechanismus ein neuer Master generiert.
Überwachen Sie den Status des Regionsservers über zk. Wenn der Regionsserver abnormal ist, benachrichtigen Sie den Master über die Online- und Offline-Informationen des Regionsservers in Form von Rückrufen.
Einheitliche Eintragsinformationen zum Speichern von Metadaten über zk
hdfs
Bereitstellung zugrunde liegender Datenspeicherdienste für HBase
Stellt zugrunde liegende verteilte Speicherdienste für Metadaten und Tabellendaten bereit
Mehrere Kopien der Daten gewährleisten eine hohe Zuverlässigkeit und Verfügbarkeit
HMeister
Weisen Sie Region dem RegionServer zu
Sorgen Sie für den Lastausgleich im gesamten Cluster
Verwalten Sie Cluster-Metadateninformationen
Ermitteln Sie die ausgefallene Region und weisen Sie die ausgefallene Region dem normalen RegionServer zu
Wenn der RegionSever ausfällt, koordinieren Sie die Aufteilung des entsprechenden Hlog
HReginServer
Verarbeitet hauptsächlich die Lese- und Schreibanfragen der Benutzer
Verwalten Sie die vom Master zugewiesene Region
Behandeln Sie Lese- und Schreibanfragen von Clients
Verantwortlich für die Interaktion mit dem zugrunde liegenden HDFS und die Speicherung von Daten im HDFS
Verantwortlich für die Aufteilung der Region, nachdem diese größer geworden ist
Verantwortlich für die Zusammenführung von Storefiles
Rolle
HMeister
1. Überwachen Sie RegionServer
2. Handhabung des RegionServer-Failovers
3. Behandeln Sie Metadatenänderungen
4. Erledigen Sie die Regionszuweisung oder -übertragung
5. Lastausgleichsdaten während der Leerlaufzeit
6. Veröffentlichen Sie Ihren Standort über Zookeeper für Kunden
RegionServer
1. Verantwortlich für die Speicherung der tatsächlichen Daten von HBase
2. Verarbeiten Sie die ihm zugewiesene Region
3. Cache in HDFS leeren
4. Hlog pflegen
5. Führen Sie eine Komprimierung durch
6. Verantwortlich für die Verarbeitung der Regionsfragmentierung
Andere Komponenten
Write-Ahead-Protokolle (wal)
HBase-Änderungsdatensatz: Beim Lesen und Schreiben von Daten in HBase werden die Daten nicht direkt auf die Festplatte geschrieben, sondern für einen bestimmten Zeitraum im Speicher gespeichert (Zeit- und Datenvolumenschwellenwerte können festgelegt werden). Das Speichern von Daten im Speicher kann jedoch mit größerer Wahrscheinlichkeit zu Datenverlusten führen. Um dieses Problem zu lösen, werden die Daten zunächst in eine Datei namens Write-Ahead-Protokolldatei geschrieben und dann in den Speicher geschrieben. Wenn das System ausfällt, können die Daten über diese Protokolldatei rekonstruiert werden
Region
Für das Sharding der HBase-Tabelle wird die HBase-Tabelle basierend auf dem RowKey-Wert in verschiedene Regionen unterteilt und im RegionServer gespeichert. In einem RegionServer können mehrere verschiedene Regionen vorhanden sein.
speichern
HFile wird im Store gespeichert und ein Store entspricht einer Spaltenfamilie in der HBase-Tabelle.
MemStore
Wie der Name schon sagt, handelt es sich um einen Speicher, der sich im Speicher befindet und zum Speichern der aktuellen Datenoperationen verwendet wird. Nachdem die Daten in der WAL gespeichert wurden, speichert der RegionServer daher die Schlüssel-Wert-Paare im Speicher.
HFile
Dies ist die eigentliche physische Datei, die die Originaldaten auf der Festplatte enthält, die eigentliche Speicherdatei. StoreFile wird in HDFS in Form von Hfile gespeichert.
HBase-Operationen
HBase-Datenstruktur
RowKey
Wie bei der NoSQL-Datenbank ist Rowkey der Primärschlüssel für den Zugriff auf Daten. Es gibt drei Möglichkeiten, auf HBase-Zeilen zuzugreifen
1.Zugriff über einen einzigen Zeilenschlüssel
2. Übergeben Sie den Bereich des Zeilenschlüssels (regulär).
3. Vollständiger Tabellenscan
Der RowKey-Zeilenschlüssel (RowKey) kann eine beliebige Zeichenfolge sein (die maximale Länge beträgt 64 KB und die Länge in tatsächlichen Anwendungen beträgt im Allgemeinen 10-100 Byte. In HBASE wird RowKey als Byte-Array gespeichert). Beim Speichern werden die Daten in der lexikografischen Reihenfolge (Byte-Reihenfolge) von RowKey gespeichert. Beim Entwerfen von RowKey ist es erforderlich, die Speichereigenschaften vollständig zu sortieren und häufig gemeinsam gelesene Zeilen zu speichern. (Ortsabhängigkeit)
Kolumne Familie
Spaltenfamilie: Jede Spalte in der HBASE-Tabelle gehört zu einer bestimmten Spaltenfamilie. Spaltenfamilien sind Teil des Tabellenschemas (Spalten nicht) und müssen vor der Verwendung der Tabelle definiert werden. Den Spaltennamen wird die Spaltenfamilie vorangestellt. Beispielsweise gehören „courses:history“ und „courses:math“ alle zur Spaltenfamilie „courses“.
Zelle
Eine Einheit, die eindeutig durch {rowkey, Column Family:columu, version} identifiziert wird. Die Daten in der Zelle haben keinen Typ und werden alle in Bytecode-Form gespeichert.
Zeitstempel
In HBase wird eine durch Zeilenschlüssel und Spalte bestimmte Speichereinheit als Zelle bezeichnet. Jede Zelle speichert mehrere Versionen derselben Daten. Versionen werden nach Zeitstempel indiziert. Der Zeitstempeltyp ist eine 64-Bit-Ganzzahl. Der Zeitstempel kann von HBASE zugewiesen werden (automatisch beim Schreiben von Daten). In diesem Fall ist der Zeitstempel die aktuelle Systemzeit mit einer Genauigkeit von Millisekunden. Zeitstempel können auch explizit vom Client vergeben werden. Wenn eine Anwendung Datenversionskonflikte vermeiden möchte, muss sie ihre eigenen eindeutigen Zeitstempel generieren. In jeder Zelle werden verschiedene Datenversionen in umgekehrter chronologischer Reihenfolge sortiert, d. h. die neuesten Daten werden zuerst aufgeführt. Um den durch zu viele Datenversionen verursachten Verwaltungsaufwand (einschließlich Speicherung und Indizierung) zu vermeiden, bietet HBASE zwei Methoden zum Recycling von Datenversionen. Die eine besteht darin, die letzten n Versionen der Daten zu speichern, die andere darin, die Versionen innerhalb des letzten Zeitraums (z. B. der letzten sieben Tage) zu speichern. Benutzer können dies für jede Spaltenfamilie festlegen.
Namensräume
Namespace-Struktur
Tisch
Tabelle, alle Tabellen sind Mitglieder des Namespace, das heißt, die Tabelle muss zu einem bestimmten Namespace gehören. Wenn nicht angegeben, befindet sie sich im Standard-Namespace.
RegionServer-Gruppe
Ein Namespace enthält die Standard-RegionServer-Gruppe.
Erlaubnis
Berechtigungen und Namespaces ermöglichen es uns, Zugriffskontrolllisten (ACLs) zu definieren.
Quote
Kontingente können die Anzahl der Regionen erzwingen, die ein Namespace enthalten kann.
HBase-Datenprinzipien
HBase-Leseprinzip
1) Der Client greift zuerst auf zookeeper zu, liest den Standort der Region aus der Metatabelle und liest dann die Daten in der Metatabelle. Das Meta speichert die Regionsinformationen der Benutzertabelle.
2) Finden Sie die entsprechenden Regionsinformationen in der Metatabelle basierend auf Namespace, Tabellenname und Zeilenschlüssel.
3) Suchen Sie den Regionserver, der dieser Region entspricht.
4) Finden Sie die entsprechende Region;
5) Suchen Sie zuerst die Daten aus MemStore. Wenn nicht, lesen Sie sie dann aus BlockCache.
6) Wenn der BlockCache noch nicht verfügbar ist, lesen Sie ihn aus der StoreFile (aus Gründen der Leseeffizienz);
7) Wenn die Daten aus StoreFile gelesen werden, werden sie nicht direkt an den Client zurückgegeben, sondern zunächst in BlockCache geschrieben und dann an den Client zurückgegeben.
HBase-Schreibprozess
1) Der Client sendet eine Schreibanforderung an HregionServer.
2) HregionServer schreibt Daten in HLog (Write-Ahead-Protokoll). Für Datenpersistenz und -wiederherstellung;
3) HregionServer schreibt Daten in den Speicher (MemStore);
4) Rückmeldung, dass der Client erfolgreich geschrieben wurde.
Datenlöschvorgang
1) Wenn die MemStore-Daten den Schwellenwert erreichen (der Standardwert ist 128 MB, die alte Version ist 64 MB), werden die Daten auf die Festplatte geleert, die Daten im Speicher werden gelöscht und die historischen Daten im HLog werden gelöscht.
2) Und die Daten in HDFS speichern;
3) Markieren Sie Punkte in HLog.
Datenzusammenführungsprozess
1) Wenn die Anzahl der Datenblöcke 4 erreicht, löst Hmaster den Zusammenführungsvorgang aus und Region lädt die Datenblöcke lokal zum Zusammenführen.
2) Wenn die zusammengeführten Daten 256 MB überschreiten, teilen Sie sie auf und weisen Sie die aufgeteilten Regionen einer anderen HregionServer-Verwaltung zu.
3) Wenn HregionServer ausfällt, teilen Sie das Hlog auf HregionServer auf, weisen Sie es dann einem anderen HregionServer zum Laden zu und ändern Sie .META.;
4) Hinweis: HLog wird mit HDFS synchronisiert.
Integrierte Nutzung von Hive und HBase
Integriert über hive-hbase-handler-1.2.2.jar
Erstellen Sie eine Hive-Tabelle, verknüpfen Sie sie mit der HBase-Tabelle und fügen Sie Daten in die Hive-Tabelle ein, während Sie sich auf die HBase-Tabelle auswirken.
In HBase wurde eine Tabelle hbase_emp_table gespeichert. Anschließend wird in Hive eine externe Tabelle erstellt, um die Tabelle hbase_emp_table in HBase zuzuordnen, sodass Hive zum Analysieren der Daten in der HBase-Tabelle verwendet werden kann.
HBase-Optimierung
Hohe Verfügbarkeit (mehrere Hmaster)
In HBase ist Hmaster dafür verantwortlich, den Lebenszyklus von RegionServer zu überwachen und die Last von RegionServer auszugleichen, z Wenn Hmaster auflegt, fällt der gesamte HBase-Cluster in einen fehlerhaften Zustand und der Arbeitsstatus ist zu diesem Zeitpunkt nicht mehr derselbe. Wird zu lange dauern. Daher unterstützt HBase die Hochverfügbarkeitskonfiguration von Hmaster.
vorpartitioniert
Manuelle Vorpartitionierung
create 'staff1','info','partition1',SPLITS => ['1000','2000','3000','4000']
Stellt fünf Partitionen dar [min,1000),[1000,2000),[2000,3000),[3000,4000),[4000,max]
Vorpartitionierung einer Hexadezimalsequenz generieren
create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
Gibt an, dass der Hexadezimalwert in 15 Partitionen unterteilt ist
Vorabpartitionierung gemäß den in der Datei festgelegten Regeln
Erstelle 'staff3','partition3',SPLITS_FILE => 'splits.txt'
Der Inhalt von splits.txt ist wie folgt
aaaa bbb cccc dddd
JavaAPI erstellt eine Partition
// Passen Sie den Algorithmus an, um eine Reihe von Hash-Hash-Werten zu generieren und diese in einem zweidimensionalen Array zu speichern byte[][] splitKeys = eine Hashwertfunktion //HBaseAdmin-Instanz erstellen HBaseAdmin hAdmin = new HBaseAdmin(HBaseConfiguration.create()); //HTableDescriptor-Instanz erstellen HTableDescriptor tableDesc = new HTableDescriptor(tableName); //Erstellen Sie eine HBase-Tabelle mit Vorpartitionierung durch eine HTableDescriptor-Instanz und ein zweidimensionales Array von Hashwerten hAdmin.createTable(tableDesc, splitKeys);
rowkeydesign
Rowkey ist die eindeutige Kennung eines Datenelements. Es ist notwendig, den Rowkey richtig zu gestalten, damit der Rowkey gleichmäßig in der Region verteilt ist, um einen Datenversatz zu verhindern.
1. Generieren Sie Zufallszahlen, Hashes und Hashwerte
Beispiel: Der ursprüngliche Zeilenschlüssel ist 1001 und wird nach SHA1 zu: dd01903921ea24941c26a48f2cec24e0bb0e8cc7 Der ursprüngliche rowKey war 3001 und wurde nach SHA1 zu: 49042c54de64a1e9bf0b33e00245660ef92dc7bd Der ursprüngliche rowKey war 5001 und wurde nach SHA1 zu: 7b61dec07e02c188790670af43e717f0f46e8913 Bevor wir dies tun, extrahieren wir im Allgemeinen Stichproben aus dem Datensatz, um zu bestimmen, welche Art von Zeilenschlüssel als kritischer Wert jeder Partition gehasht werden soll.
2. String-Umkehr
Beispiel: 20170524000001 konvertiert in 10000042507102
3. String-Verkettung
20170524000001_a12e 20170524000001_93i7
Speicheroptimierung
HBase benötigt während des Betriebs viel Speicheraufwand. Schließlich kann die Tabelle im Speicher zwischengespeichert werden. Im Allgemeinen werden 70 % des gesamten verfügbaren Speichers dem Java-Heap von HBase zugewiesen. Es wird jedoch nicht empfohlen, sehr großen Heap-Speicher zuzuweisen, denn wenn der GC-Prozess zu lange andauert, befindet sich der RegionServer in einem langfristig nicht verfügbaren Zustand. Im Allgemeinen sind 16 bis 48 GB Speicher ausreichend. Wenn der vom Framework belegte Speicher zu hoch ist, was dazu führt, dass der Systemspeicher nicht ausreicht, wird das Framework auch durch die Systemdienste zerstört.
Grundlegende Optimierung
1. Erlauben Sie das Anhängen von Inhalten an HDFS-Dateien
hdfs-site.xml, hbase-site.xml Eigenschaft: dfs.support.append Erläuterung: Das Aktivieren der HDFS-Anhängesynchronisierung kann perfekt mit der HBase-Datensynchronisierung und -persistenz zusammenarbeiten. Der Standardwert ist wahr.
2. Optimieren Sie die von DataNode maximal zulässige Anzahl geöffneter Dateien
hdfs-site.xml Eigenschaft: dfs.datanode.max.transfer.threads Erläuterung: HBase betreibt im Allgemeinen eine große Anzahl von Dateien gleichzeitig, abhängig von der Anzahl und Größe der Cluster- und Datenaktionen. Auf 4096 oder höher einstellen. Standardwert: 4096
3. Optimieren Sie die Wartezeit von Datenvorgängen mit hoher Latenz
hdfs-site.xml Eigenschaft: dfs.image.transfer.timeout Erläuterung: Wenn die Verzögerung für einen bestimmten Datenvorgang sehr hoch ist und der Socket länger warten muss, wird dies empfohlen Dieser Wert wird auf einen größeren Wert (Standard 60.000 Millisekunden) eingestellt, um sicherzustellen, dass der Socket nicht abläuft.
4. Optimieren Sie die Effizienz beim Schreiben von Daten
mapred-site.xml Attribute: mapreduce.map.output.compress mapreduce.map.output.compress.codec Erläuterung: Die Aktivierung dieser beiden Daten kann die Effizienz beim Schreiben von Dateien erheblich verbessern und die Schreibzeit verkürzen. Ändern Sie den ersten Attributwert in „true“ und den zweiten Attributwert in „org.apache.hadoop.io.compress.GzipCodec“ oder andere Komprimierungsmethoden
5. Legen Sie die Anzahl der RPC-Listener fest
hbase-site.xml Eigenschaft: hbase.regionserver.handler.count Erläuterung: Der Standardwert ist 30 und wird zur Angabe der Anzahl der RPC-Listener verwendet. Er kann entsprechend der Anzahl der Clientanforderungen angepasst werden. Wenn viele Lese- und Schreibanforderungen vorliegen, erhöhen Sie diesen Wert.
6. Optimieren Sie die HStore-Dateigröße
hbase-site.xml Eigenschaft: hbase.hregion.max.filesize Erläuterung: Der Standardwert ist 10737418240 (10 GB). Wenn Sie HBase-MR-Aufgaben ausführen müssen, können Sie diesen Wert reduzieren, da eine einzelne Region einer Kartenaufgabe entspricht lang. Die Bedeutung dieses Werts besteht darin, dass die Region in zwei H-Dateien aufgeteilt wird, wenn die Größe der H-Datei diesen Wert erreicht.
7. Optimieren Sie den hbase-Client-Cache
hbase-site.xml Eigenschaft: hbase.client.write.buffer Erläuterung: Wird zur Angabe des HBase-Client-Cache verwendet. Eine Erhöhung dieses Werts kann die Anzahl der RPC-Aufrufe verringern, verbraucht jedoch mehr Speicher und umgekehrt. Im Allgemeinen müssen wir eine bestimmte Cache-Größe festlegen, um die Anzahl der RPCs zu reduzieren.
8. Geben Sie scan.next an, um die Anzahl der von HBase erhaltenen Zeilen zu scannen
hbase-site.xml Eigenschaft: hbase.client.scanner.caching Erläuterung: Wird verwendet, um die Standardanzahl der von der Methode scan.next erhaltenen Zeilen anzugeben. Je größer der Wert, desto höher der Speicherverbrauch.
9.bündiger, kompakter, geteilter Mechanismus
Wenn der MemStore den Schwellenwert erreicht, werden die Daten im Memstore in die Storefile geleert; der Kompaktmechanismus führt die geleerten kleinen Dateien zu einer großen Storefile zusammen. Split bedeutet, dass die übermäßig große Region in zwei Teile geteilt wird, wenn die Region den Schwellenwert erreicht.
Beteiligte Attribute: Das heißt: 128 MB ist der Standardschwellenwert von Memstore hbase.hregion.memstore.flush.size: 134217728 Das heißt: Die Funktion dieses Parameters besteht darin, alle Memstores einer einzelnen HRegion zu leeren, wenn die Summe der Größen aller Memstores in einer einzelnen HRegion den angegebenen Wert überschreitet. Der Flush von RegionServer wird asynchron verarbeitet, indem die Anforderung einer Warteschlange hinzugefügt wird, um das Produktions- und Verbrauchsmodell zu simulieren. Dann liegt hier ein Problem vor, wenn die Warteschlange keine Zeit zum Verbrauchen hat und einen großen Rückstand an Anforderungen generiert, was zu einem plötzlichen Anstieg des Speichers führen und im schlimmsten Fall OOM auslösen kann. hbase.regionserver.global.memstore.upperLimit: 0,4 hbase.regionserver.global.memstore.lowerLimit: 0,38 Das heißt: Wenn der von MemStore insgesamt verwendete Speicher den durch hbase.regionserver.global.memstore.upperLimit angegebenen Wert erreicht, werden mehrere MemStores in die Datei geleert. Die Reihenfolge des MemStore-Flushes wird in absteigender Reihenfolge der Größe ausgeführt, bis der Speicher verbraucht ist von MemStore wird weniger als das untere Limit geleert
Blütenfilter
flink
Datenx1
Presto
Oozie
Datenbestände
Springboot
Interviewer-Fragen im Vorstellungsgespräch bei Shrimp and Pig Heart
Linux
Vorstellen
1 Minute, um sich vorzustellen: In meinem vorherigen Unternehmen habe ich hauptsächlich die Datenplattform China Continent Insurance aufgebaut, die hauptsächlich auf die intern generierten und bankbezogenen Versicherungsdaten von Xiaomi, JD.com, Che300 und Continent Insurance Company zugreift. Das Data Warehouse war in viele Themen unterteilt, einschließlich Auftragsthemen , Kundenthemen, Schadenthemen, überfällige Themen, Genehmigungsthemen und Beschwerdethemen; das von mir entwickelte Geschäft umfasst Auftragsthemen, Benutzerthemen und überfällige Themen. Was ich bei der Arbeit mache, hängt mit der Data-Warehouse-Modellierung, Datenverarbeitung und Datenqualitätsüberwachung zusammen und Themenindikatorberechnungen. Zu den wichtigsten angewandten Technologien gehören Hive, Spark, Hue, Impala, Hadoop, Infomatical usw.; die Plattform fügt täglich etwa 1 TB Daten hinzu.
Geschäftseinführung