Galleria mappe mentale 23 punti di conoscenza sui big data e sintesi dell'intervista (1)
Modello semplice, comprese le nozioni di base su Java, hadoop, alveare, teoria del data warehouse, impala, Teoria del data Lake e altri contenuti.
Modificato alle 2024-01-18 15:05:07Questa è una mappa mentale su una breve storia del tempo. "Una breve storia del tempo" è un'opera scientifica popolare con un'influenza di vasta portata. Non solo introduce i concetti di base della cosmologia e della relatività, ma discute anche dei buchi neri e dell'espansione dell'universo. questioni scientifiche all’avanguardia come l’inflazione e la teoria delle stringhe.
Dopo aver letto "Il coraggio di essere antipatico", "Il coraggio di essere antipatico" è un libro filosofico che vale la pena leggere. Può aiutare le persone a comprendere meglio se stesse, a comprendere gli altri e a trovare modi per ottenere la vera felicità.
"Il coraggio di essere antipatico" non solo analizza le cause profonde di vari problemi nella vita, ma fornisce anche contromisure corrispondenti per aiutare i lettori a comprendere meglio se stessi e le relazioni interpersonali e come applicare la teoria psicologica di Adler nella vita quotidiana.
Questa è una mappa mentale su una breve storia del tempo. "Una breve storia del tempo" è un'opera scientifica popolare con un'influenza di vasta portata. Non solo introduce i concetti di base della cosmologia e della relatività, ma discute anche dei buchi neri e dell'espansione dell'universo. questioni scientifiche all’avanguardia come l’inflazione e la teoria delle stringhe.
Dopo aver letto "Il coraggio di essere antipatico", "Il coraggio di essere antipatico" è un libro filosofico che vale la pena leggere. Può aiutare le persone a comprendere meglio se stesse, a comprendere gli altri e a trovare modi per ottenere la vera felicità.
"Il coraggio di essere antipatico" non solo analizza le cause profonde di vari problemi nella vita, ma fornisce anche contromisure corrispondenti per aiutare i lettori a comprendere meglio se stessi e le relazioni interpersonali e come applicare la teoria psicologica di Adler nella vita quotidiana.
Punti di conoscenza sui big data e sintesi dell'intervista
nozioni di base su Java
Tipi di dati di base
byte, booleano 1 byte, carattere, breve 2 byte, int, float 4 byte, lungo, doppio 8 byte
anormale
Lanciabile
Errore
Errori fatali catastrofici, programmi incontrollabili, come l'overflow dello stack
Eccezione
eccezione di runtime
Eccezione puntatore nullo, indice dell'array fuori dai limiti
Eccezioni in fase di compilazione (eccezioni non runtime)
IOException, ClassNotFoundException
Polimorfismo
struttura dati
Strutture dati comuni (8 tipi)
vettore
Le query e le modifiche sono veloci, l'aggiunta e la cancellazione sono lente
L'intervallo di archiviazione è continuo, l'utilizzo della memoria è elevato e la complessità dello spazio è elevata.
Vantaggi: la lettura e la modifica casuale sono veloci perché l'array è continuo (forte accesso casuale e velocità di ricerca elevata)
Svantaggi: l'inserimento e l'eliminazione sono inefficienti perché dopo aver inserito i dati, i dati dietro questa posizione devono essere spostati nella memoria e la dimensione non è fissa e non può essere facilmente espansa dinamicamente.
lista collegata
Aggiunta e cancellazione rapida, ricerca lenta
Lo spazio di archiviazione è discreto, la memoria occupata è libera e la complessità dello spazio è ridotta.
Vantaggi: inserimento e cancellazione rapidi, elevato utilizzo della memoria, nessuna dimensione fissa, espansione flessibile
Svantaggi: impossibile effettuare ricerche casuali, iniziare ogni volta dal primo, bassa efficienza delle query
Tabella hash
L'aggiunta, la cancellazione e la ricerca sono veloci, l'hashing dei dati è uno spreco di spazio di archiviazione
coda
First in, first out, l'inserimento della coda e la rimozione della parte superiore sono veloci, ma gli altri accessi sono lenti.
pila
First in, last out, rimozione e inserimento top sono veloci, ma l'accesso ad altri elementi tranne l'elemento top è lento.
albero rosso nero
Sia le aggiunte, le cancellazioni che le ricerche sono veloci e la struttura dell'algoritmo è complessa (vedi albero binario per i dettagli)
Albero binario
L'aggiunta, la cancellazione e la ricerca sono veloci, ma l'algoritmo di cancellazione ha una struttura complessa.
La complessità temporale è O(logn) nel caso migliore e O(n) nel caso peggiore.
albero binario speciale
albero binario completo
Se il numero di livelli dell'albero binario è K e il numero di nodi è (2^K-1), si tratta di un albero binario completo (come mostrato nella figura seguente)
Sottoargomento 1
albero binario completo
Il numero di strati dell'albero binario è h strato, il numero di (1~h-1) nodi ha raggiunto il massimo e tutti i nodi di h strato sono concentrati a sinistra (come mostrato nella figura seguente)
albero di ricerca binario
I valori sul sottoalbero di sinistra sono tutti più piccoli del nodo radice e i valori del sottoalbero di destra sono tutti più piccoli del nodo radice L'attraversamento in ordine deve essere ordinato da piccolo a grande (come mostrato nella figura )
albero rosso nero
Un albero binario bilanciato è un albero vuoto oppure la differenza di altezza tra i sottoalberi sinistro e destro non supera 1, ed entrambi i sottoalberi sinistro e destro sono alberi binari bilanciati. L'albero rosso-nero deve essere un albero di ricerca binaria (come mostrato nel file figura)
Caratteristiche:
complessità temporale
La peggiore complessità temporale di inserimento, cancellazione e inserimento è O(log N)
registroaltezzaN
I nodi sono neri o rossi
Il nodo radice deve essere nero
Se un nodo è rosso, i suoi nodi figli devono essere neri.
Per ogni nodo, il numero di nodi neri sul percorso verso il nodo foglia deve essere lo stesso.
Ogni nodo foglia (il nodo foglia è il puntatore NULL o il nodo NULL alla fine dell'albero) è nero
Albero binario ottimale (albero di Huffman)
La lunghezza ponderata del percorso dell'albero raggiunge il minimo
B-albero
L'albero di ricerca a più percorsi bilanciati (più di due percorsi di ricerca), diverso dall'albero binario, è un albero a più vie, O(log n)
B-albero
È una struttura dati ad albero autobilanciata che mantiene l'ordinamento dei dati; la complessità della ricerca, dell'accesso sequenziale, dell'inserimento e della cancellazione è O(log n) e l'albero B memorizza i dati solo nei nodi foglia, quindi alcuni alberi B vengono eliminati. Difetti. I nodi non foglia memorizzano solo gli indici, non i dati effettivi. I dati sono tutti archiviati nei nodi foglia. O(logn)
L'altezza dell'albero supporta la ricerca a distanza
Perché Mysql utilizza i numeri B?
Meno I/O del disco e supporto della ricerca dell'intervallo
La differenza tra B-tree e B-tree
1) Tutti i dati nell'albero B esistono nei nodi foglia 2) I nodi foglia dell'albero B hanno puntatori bidirezionali per facilitare le ricerche di range, e i dati sui nodi foglia sono collegati in sequenza da piccolo a grande.
bitmap
Risparmia spazio di archiviazione e rendi scomoda la descrizione di relazioni di dati complesse
raccogliere
Problema di attraversamento della raccolta
Quando si utilizza un iteratore per attraversare una raccolta e modificare gli oggetti nella raccolta (aggiunta, eliminazione, modifica), verrà generata un'eccezione.
Collezione
Elenco
Lista di array
Caratteristiche: gli elementi di archiviazione sono in ordine, l'interrogazione è veloce e l'aggiunta e la cancellazione sono lente.
L'array sottostante viene implementato e la capacità può aumentare automaticamente. L'espansione predefinita è 1,5 volte la capacità originale.
Non è thread-safe. Il multithreading è disponibile. È possibile utilizzare Collections.syncnizedArrayList(List l) per restituire un ArrayList thread-safe.
Il livello inferiore chiama Arrays.copyof() in gran numero e System.arraycopy() espande la sua capacità.
Vettore
L'implementazione dell'array sottostante viene modificata dalla parola chiave sincronizzata, thread-safe e con bassa efficienza. La capacità iniziale predefinita è 10 e la capacità di espansione predefinita viene aumentata di 1 volta.
Lista collegata
Implementazione della struttura dell'elenco doppiamente collegato
La query è lenta, l'aggiunta e la cancellazione sono veloci
Somiglianze e differenze tra LinkedList, ArrayList e Vector:
Impostato
Insieme ordinato
Set di alberi
L'implementazione dell'albero rosso-nero sottostante, la raccolta non ordinata, la sicurezza dei thread
HashSet
Sottoclasse: LinkedHashSet
HashSet è implementato da HashMap, quindi la struttura dei dati è un albero rosso-nero con elenco collegato di array, che consente null, nessuna duplicazione, disordine e multi-threading non sicuro. Memorizza gli elementi in base all'algoritmo hash e ha un'elevata ricerca, eliminazione e accedere alle prestazioni. Utilizzare Collections.synchronizedHashSet() per restituire un HashSet thread-safe
È possibile accedere agli elementi solo tramite iteratori
coda
Carta geografica
HashMap
HashMap
Il livello inferiore di HashMap è implementato utilizzando array, elenchi collegati e alberi rosso-neri.
Quando il numero di oggetti in una catena nell'array raggiunge 8, la catena verrà convertita in un albero rosso-nero. Se l'albero rosso-nero ha meno di 6 nodi, verrà convertito in un elenco collegato.
La capacità predefinita iniziale di Hash è 16. Quando gli elementi di archiviazione in HashMap superano il fattore di carico * la capacità attuale, la capacità verrà ampliata fino a 2 volte la dimensione originale, quindi la posizione di ciascun elemento nell'array verrà ricalcolata.
Non è thread-safe, puoi utilizzare ConcurrentHashMap
ConcurrentHashMap
jdk1.8
Implementato utilizzando l'elenco collegato, l'array di nodi dell'albero rosso-nero, cas (blocco ottimistico) sincronizzato
Sottoclasse
linkedHashMap
HashTable
Sottoclasse
Proprietà
Sicurezza del filo
La sicurezza del thread è garantita bloccando l'intera tabella hash. Questo metodo garantisce la sicurezza del thread, ma l'esecuzione simultanea è inefficiente.
Mappa ordinata
Mappa ad albero
Modelli di progettazione
Modalità Singleton, 3 tipi comuni
Modalità pigra, istanziata alla prima chiamata
Modalità Villain, la classe è stata istanziata da sola una volta inizializzata, thread-safe
Modalità di registrazione
modalità proxy
proxy statico
Sottoargomento 1
proxy dinamico
proxy dinamico jdk
CGlib
Modello di fabbrica
modello del costruttore
modalità adattatore
modello iteratore
Categorie comuni
Corda
Rappresenta una stringa
Le classi di stringhe modificate con final non possono essere ereditate e rappresentano sequenze di caratteri immutabili.
Il contenuto dei caratteri dell'oggetto String è memorizzato in un array di caratteri valore[]
Se una costante String viene unita con una costante, sarà nel pool di costanti dell'area del metodo e non ci saranno costanti con lo stesso contenuto nel pool di costanti se una costante viene unita con qualsiasi variabile, lo farà essere memorizzati nell'heap.
JVM
javac
Un compilatore che compila il linguaggio Java in un file binario che può essere riconosciuto da jvm
componenti
partizione di memoria jvm
contatore di programma
È un piccolo spazio di memoria ed è un indicatore del codice eseguito dal thread corrente. Modificando il valore del contatore, viene selezionata la successiva istruzione del bytecode che deve essere eseguita; ogni thread ha un contatore di programma univoco, ed è presente nessun contatore del programma tra i thread. Impatto; L'unica area in cui non si verificherà OOM; se il thread sta eseguendo un metodo Java, il contatore del programma registra l'indirizzo dell'istruzione bytecode della macchina virtuale in esecuzione è vuoto.
stack della macchina virtuale Java
Thread privato, memorizza principalmente variabili locali, stack frame, stack di operandi, collegamenti dinamici, uscite di metodi e altre informazioni
stack di metodi nativi
Chiama la libreria di classi del sistema operativo
mucchio
Condivisione dei thread, praticamente tutti gli oggetti si trovano nell'heap Java, l'area principale per la raccolta dei rifiuti
zona metodo
La condivisione dei thread memorizza principalmente informazioni sulle classi, costanti, variabili statiche e dati di codice compilati
Pool costante di runtime
Parte dell'area del metodo. Memorizzazione di riferimenti letterali e simbolici
Multithreading
programma
Un insieme di istruzioni scritte in un determinato linguaggio per completare un'attività specifica, ovvero un pezzo di codice statico, un oggetto statico
processi
Il processo di esecuzione di un programma una volta o il programma in esecuzione è un processo dinamico con un proprio processo di creazione, esistenza e morte (ciclo di vita)
Caratteristiche:
I programmi sono statici, i processi sono dinamici
Il processo è l'unità più piccola di allocazione delle risorse. Quando il sistema è in esecuzione, a ciascun processo verrà allocata un'area di memoria diversa.
filo
Il processo è ulteriormente suddiviso in thread, che costituiscono un percorso di esecuzione del programma.
Caratteristiche:
Se un processo esegue più thread contemporaneamente, supporta il multithreading.
I thread fungono da unità di pianificazione ed esecuzione. Ogni thread ha uno stack e un contatore di programma (pc) indipendenti e l'overhead del cambio di thread è ridotto.
Più thread in un processo condividono la stessa unità di memoria/spazio di indirizzi di memoria -> allocano oggetti dallo stesso heap e possono accedere agli stessi oggetti e variabili. Ciò rende la comunicazione tra i thread più semplice ed efficiente. Ma la condivisione tra più thread comporterà problemi di sicurezza
Parallelismo e concorrenza
parallelo:
Due o più eventi si verificano contemporaneamente
concorrente:
Due o più eventi si verificano nello stesso intervallo di tempo
Creazione del thread
Filo
Eredita la classe Thread e sovrascrive l'implementazione del metodo run. Il codice nel metodo run è il corpo del thread istanziando la sottoclasse che eredita Thread, chiama il metodo start per consentire al thread di chiamare il metodo run Thread implementa l'interfaccia Runnable.
Metodi comuni del thread
(1) void start(): avvia il thread ed esegue il metodo run() dell'oggetto (2) run(): operazioni eseguite dal thread durante la pianificazione (3) String getName(): restituisce il nome del thread (4) void setName(nome stringa): imposta il nome del thread (5) Thread statico currentThread(): restituisce il thread corrente. Questo è presente nelle sottoclassi Thread, solitamente utilizzate per il thread principale e le classi di implementazione Runnable (6) static void yield(): il thread cede e mette in pausa il thread attualmente in esecuzione, dando l'opportunità di esecuzione a un thread con la stessa priorità o con priorità superiore. Se non c'è nessun thread con la stessa priorità nella coda, ignora questo metodo (7) join(): quando il metodo join() di altri thread viene chiamato in un determinato flusso di esecuzione del programma, il thread chiamante verrà bloccato finché non verrà eseguito il thread join aggiunto dal metodo join() anche essere giustiziato (8) static void sleep (long millis): (tempo specificato: millisecondi) fa sì che il thread attualmente attivo ceda il controllo della CPU entro il periodo di tempo specificato, dando agli altri thread la possibilità di essere eseguiti e rimettendosi in coda allo scadere del tempo su. Genera InterruptedException (9) stop(): forza la fine del ciclo di vita del thread, non consigliato (10) boolean isAlive(): restituisce booleano per determinare se il thread è ancora vivo
Priorità del thread:
Quando viene creato un thread, eredita la priorità del thread principale.
La priorità bassa ha solo una bassa probabilità di essere pianificata e non deve necessariamente essere chiamata dopo un thread ad alta priorità.
1. Livello di priorità del thread PRIORITÀ_MAX: 10 PRIORITÀ_MIN:1 NORMA_PRIORITÀ:5 2. Metodi coinvolti getPriority(): restituisce il valore di priorità del thread setPriority(int newPriority): modifica la priorità del thread
Stato del thread Thread.State
Nuovo
pronto
correre
bloccare
morire
Percorribile
1) Definire una sottoclasse e implementare l'interfaccia Runnable. 2) Riscrivere il metodo run nell'interfaccia Runnable nella sottoclasse. 3) Creare un oggetto thread tramite il costruttore contenente parametri della classe Thread. 4) Passare l'oggetto sottoclasse dell'interfaccia Runnable come parametro effettivo al costruttore della classe Thread. 5) Chiamare il metodo start della classe Thread: avviare il thread e chiamare il metodo run dell'interfaccia della sottoclasse Runnable.
richiamabile
callable può essere eseguito utilizzando ExecutorService o come parametro di FeatureTask
la classe pubblica MyCallable implementa Callable<T> { @Oltrepassare public T call() genera un'eccezione { // Definisce il codice che può essere richiamato qui } } MyCallable myCallable = new MyCallable(); Esecutore ExecutorService = Executors.newSingleThreadExecutor(); Future<T> future = executor.submit(myCallable); T risultato = future.get();
Attività richiamabile<Processo> = () -> { //Esegue attività asincrone Runtime runtime = Runtime.getRuntime(); Processo processo = runtime.exec("/Users/mac/Desktop/qc-java-runtime/src/main/java/com/qc/runtime/shell.sh"); processo di reso; }; //Wrap Callable in FutureTask FutureTask<Process> future = new FutureTask<>(task); //Avvia un nuovo thread per eseguire attività asincrone nuova discussione(futuro).start(); // Ottiene i risultati dell'attività asincrona Risultato del processo = future.get(); System.out.println(risultato);
Serratura
Per il lavoro simultaneo, è necessario un modo per impedire a due attività di accedere alle stesse risorse (competendo effettivamente per le risorse condivise). Il modo per prevenire questo conflitto è bloccare la risorsa quando viene utilizzata da un'attività. La prima attività che accede a una risorsa deve bloccarla in modo che altre attività non possano accedervi finché non viene sbloccata, momento in cui un'altra attività può bloccarla e utilizzarla.
Sincronizzato
Qualsiasi oggetto può essere utilizzato come blocco di sincronizzazione. Tutti gli oggetti contengono automaticamente una singola serratura (monitor). Blocchi per metodi sincronizzati: metodi statici (nome classe.class), metodi non statici (this) Blocco di codice sincronizzato: specificalo tu stesso, spesso viene specificato anche come questo o nome classe.class
situazione di stallo
Diversi thread occupano le risorse di sincronizzazione necessarie l'uno all'altro e non si arrendono. Stanno tutti aspettando che l'altra parte ceda le risorse di cui hanno bisogno, creando una situazione di stallo.
Dopo che si verifica un deadlock, non si verificherà alcuna eccezione o richiesta, ma tutti i thread verranno bloccati e non potranno continuare.
rilascio della serratura
L'esecuzione del metodo di sincronizzazione e del blocco di codice di sincronizzazione del thread corrente termina.
Il thread corrente incontra interruzioni e ritorni in un blocco di codice sincronizzato o in un metodo sincronizzato, che termina l'esecuzione continua del blocco di codice e del metodo.
Si verifica un errore o un'eccezione non gestita nel thread corrente nel blocco di codice sincronizzato o nel metodo sincronizzato, con conseguente conclusione anomala.
Il thread corrente esegue il metodo wait() dell'oggetto thread nel blocco di codice di sincronizzazione e nel metodo di sincronizzazione. Il thread corrente mette in pausa e rilascia il blocco.
Protocollo di comunicazione di rete
Modello OSI (protocollo)
Il modello è troppo ideale e non può essere promosso su Internet
Stratificazione OSI
Livello di applicazione
livello di presentazione
livello di sessione
strato di trasporto
Livello di rete
livello di collegamento dati
strato fisico
Modello TCP/IP (protocollo)
norma internazionale di fatto
Stratificazione TCP/IP
Livello di applicazione
strato di trasporto
Livello di rete
livello di collegamento dati fisico
Confronto tra due modelli
Incapsulamento dei dati
Smantellamento dei dati
IP e porta
Importanti protocolli del livello di trasporto della rete UDP e TCP
UDP (protocollo datagramma utente)
1. Incapsulare dati, origine e destinazione in pacchetti di dati senza stabilire una connessione. 2. La dimensione di ciascun datagramma è limitata a 64 KB 3. Al mittente non interessa se l'altra parte è pronta o meno, e il destinatario non conferma la ricezione, quindi è inaffidabile. 4. Può essere trasmesso e inviato 5. Nessuna necessità di liberare risorse durante l'invio di dati, costi generali ridotti e velocità elevata
TCP (protocollo di controllo della trasmissione)
1. Prima di utilizzare il protocollo TCP, è necessario stabilire innanzitutto una connessione TCP per formare un canale di trasmissione dati. 2. Prima della trasmissione, viene utilizzato il metodo "handshake a tre vie" e la comunicazione punto a punto è affidabile. 3. Due processi applicativi comunicano utilizzando il protocollo TCP: client e server. 4. Durante la connessione possono essere trasmesse grandi quantità di dati. 5. Una volta completata la trasmissione, la connessione stabilita deve essere rilasciata, il che è inefficiente
Handshake a tre (stabilimento della connessione)
1. Il client invia un messaggio di richiesta per stabilire una connessione TCP. Il messaggio contiene un numero di sequenza sequenziale, generato casualmente dal mittente, e imposta il campo SYN (sincronizza) nel messaggio su 1, indicando che è in corso una connessione TCP. deve essere stabilito. (SYN=1, seq=x, x è un valore generato casualmente); 2. Il server risponde al messaggio di richiesta di connessione TCP inviato dal client, che contiene il numero di sequenza seq, generato casualmente dall'estremità che risponde, e imposta SYN su 1 e genera un campo ACK. Viene inviato il valore del campo ACK dal client. Aggiungere 1 al numero di sequenza passato seq per rispondere, in modo che quando il client riceve l'informazione, sappia che la sua richiesta di istituzione del TCP è stata verificata. (SYN=1, ACK=x 1, seq=y, y è un valore generato casualmente) L'ack più 1 qui può essere inteso come conferma con chi è stata stabilita la connessione; 3. Dopo che il client ha ricevuto la richiesta di verifica dell'istituzione TCP inviata dal server, aumenterà il suo numero di sequenza di 1, risponderà nuovamente alla richiesta di verifica ACK e aggiungerà 1 al seq inviato dal server per rispondere. (SYN=1, ACK=y 1, seq=x 1).
Saluta quattro volte (disconnetti)
1. Il client invia un messaggio richiedendo di disconnettere la connessione TCP. Il messaggio contiene il numero di sequenza sequenziale, che viene generato casualmente dal mittente. Inoltre imposta il campo FIN nel messaggio su 1, indicando che la connessione TCP deve essere disconnesso. (FIN=1, seq=x, x viene generato casualmente dal client); 2. Il server risponderà al messaggio di richiesta di disconnessione TCP inviato dal client, che contiene il numero di sequenza seq, generato casualmente dalla fine della risposta, e genererà un campo ACK. Il valore del campo ACK è la sequenza seq numero inviato dal client Fondamentalmente aggiungi 1 alla risposta, in modo che quando il client riceve l'informazione, sappia che la sua richiesta di disconnessione TCP è stata verificata. (FIN=1, ACK=x 1, seq=y, y viene generato casualmente dal server); 3. Dopo che il server ha risposto alla richiesta di disconnessione TCP del client, non disconnetterà immediatamente la connessione TCP. Il server si assicurerà innanzitutto che tutti i dati trasmessi ad A siano stati trasmessi prima di disconnettersi. Una volta confermata la trasmissione dei dati, il campo FIN del messaggio di risposta verrà impostato su 1 e verrà generato un numero di sequenza sequenziale casuale. (FIN=1, ACK=x 1, seq=z, z viene generato casualmente dal server); 4. Dopo aver ricevuto la richiesta di disconnessione TCP dal server, il client risponderà alla richiesta di disconnessione del server, includendo un campo seq generato casualmente e un campo ACK. Il campo ACK aggiungerà 1 al seq della richiesta di disconnessione TCP del server Completa la risposta di verifica richiesta dal server. (FIN=1, ACK=z 1, seq=h, h viene generato casualmente dal client) A questo punto, il processo di disconnessione TCP a 4 onde è completato.
Sottoargomento 3
Presa di rete
La combinazione di ip e porta forma un socket
L'essenza della comunicazione di rete: la comunicazione tra socket
Classificazione
presa di flusso
Fornire un servizio affidabile di flusso di byte utilizzando TCP
Passaggi di programmazione del socket basato su TCP
cliente
1. Crea Socket: costruisce un oggetto della classe Socket in base all'indirizzo IP o al numero di porta del server specificato. Se il server risponde, viene stabilita una linea di comunicazione dal client al server. Se la connessione fallisce, si verificherà un'eccezione. 2. Aprire il flusso di input/output connesso al Socket: utilizzare il metodo getInputStream() per ottenere il flusso di input e utilizzare il metodo getOutputStream() per ottenere il flusso di output per la trasmissione dei dati. 3. Operazioni di lettura/scrittura sul Socket secondo un determinato protocollo: leggere le informazioni inserite dal server nella linea attraverso il flusso di input (ma non è possibile leggere le informazioni inserite nella linea da soli) e scrivere le informazioni nel thread attraverso il flusso di output. 4. Close Socket: disconnette il client dal server e rilascia la linea
Terminale di servizio
1. Chiama ServerSocket(int port): crea un socket lato server e collegalo alla porta specificata. Utilizzato per monitorare le richieste dei client. 2. Chiama accetta(): ascolta le richieste di connessione Se il client richiede una connessione, accetta la connessione e restituisce l'oggetto socket di comunicazione. 3. Chiamare getOutputStream() e getInputStream() dell'oggetto della classe Socket: ottenere il flusso di output e il flusso di input e iniziare a inviare e ricevere dati di rete. 4. Chiudere gli oggetti ServerSocket e Socket: l'accesso del client è completato e il socket di comunicazione è chiuso.
presa del datagramma
Utilizza UDP per fornire servizi dati "miglior sforzo".
Programmazione di rete basata su UDP
1. Le classi DatagramSocket e DatagramPacket implementano programmi di rete basati sul protocollo UDP. 2. I datagrammi UDP vengono inviati e ricevuti tramite il socket del datagramma DatagramSocket. Il sistema non garantisce che il datagramma UDP possa essere consegnato in sicurezza alla destinazione, né può determinare quando arriverà. 3. L'oggetto DatagramPacket incapsula un datagramma UDP e il datagramma contiene l'indirizzo IP e il numero di porta del mittente e l'indirizzo IP e il numero di porta del destinatario. 4. Ciascun datagramma nel protocollo UDP fornisce informazioni complete sull'indirizzo, quindi non è necessario stabilire una connessione tra il mittente e il destinatario. Proprio come inviare un pacco espresso.
processi
1. DatagramSocket e DatagramPacket 2. Stabilire l'estremità di invio e quella di ricezione 3. Creare il pacchetto dati 4. Chiamare i metodi di invio e ricezione di Socket 5. Chiudere il socket Nota: i terminali di invio e di ricezione sono due programmi in esecuzione indipendenti.
URL
riflessione
concetto
La riflessione del meccanismo JAVA è nello stato di esecuzione. Per qualsiasi classe, puoi conoscere tutte le proprietà e i metodi di questa classe, per qualsiasi oggetto, puoi chiamare qualsiasi dei suoi metodi e proprietà queste informazioni ottenute dinamicamente e chiamate dinamiche La funzione di Il metodo dell'oggetto è chiamato meccanismo di riflessione del linguaggio Java.
Ottieni un'istanza della classe class
1) Premessa: Se la classe specifica è nota, può essere ottenuta tramite l'attributo class della classe. Questo metodo è il più sicuro e affidabile e ha le massime prestazioni del programma. Esempio: Class clazz = String.class; 2) Premessa: Se si conosce un'istanza di una determinata classe, chiamare il metodo getClass() dell'istanza per ottenere l'oggetto Class. Esempio: Class clazz = "www.atguigu.com".getClass(); 3) Prerequisito: il nome completo di una classe è noto e la classe si trova nel percorso classe e può essere recuperata tramite il metodo statico della classe Class. Ottenuto utilizzando forName(), è possibile che venga lanciata ClassNotFoundException Esempio: Class clazz =Class.forName("java.lang.String"); 4) Altri metodi (non richiesti) ClassLoader cl = this.getClass().getClassLoader(); Class clazz4 = cl.loadClass("Nome completo della classe");
Metodi comuni di classe classe
Tipi con oggetti Class
(1) classe: Classi esterne, membri (classi interne membri, classi interne statiche), classi interne locali, classi interne anonime (2) interfaccia: interfaccia (3)[]: matrice (4) enum: enumerazione (5) annotazione: annotazione @interface (6) tipo primitivo: tipo di dati di base (7) vuoto
esempio
Classe c1 = Oggetto.classe; Classe c2 = Classe.comparabile; Classe c3 = String[].class; Classe c4 = int[][].class; Classe c5 = ElementType.class; Classe c6 = Override.class; Classe c7 = classe int; Classe c8 = void.class; Classe c9 = Classe.classe; int[] a = nuovo int[10]; int[] b = nuovo int[100]; Classe c10 = a.getClass(); Classe c11 = b.getClass();
Sottoargomento 11
hadoop
hdfs
Vantaggi e svantaggi di hdf
vantaggio
Tolleranza agli errori (meccanismo di replica)
Adatto per l'elaborazione di big data, può gestire dati a livello di petabyte e milioni di file
Distribuibile su macchine economiche
discordanza
Non adatto per l'accesso ai dati a bassa latenza
È impossibile memorizzare in modo efficiente un gran numero di piccoli file. La memoria del namenode è limitata e se ci sono troppi file piccoli, il tempo di indirizzamento sarà maggiore del tempo di elaborazione del file.
La scrittura simultanea non è supportata e i file vengono modificati in modo casuale.
composizione architettonica hdfs
nomenodo
Gestisci lo spazio dei nomi hdfs
Configurare la politica di replica
Gestire le informazioni sulla mappatura dei blocchi
Gestire le richieste dei clienti
datanode
Memorizzare il blocco dati
Esegui richieste di lettura e scrittura per blocchi di dati
cliente
Suddivisione del file, divide il file in blocchi durante il caricamento del file
Interagisci con namenode per ottenere informazioni sulla posizione del file
Interagisci con datanode, leggi o scrivi dati
il client fornisce comandi per gestire hdfs
Il client fornisce comandi per accedere a HDFS, come operazioni di aggiunta, eliminazione e controllo su HDFS.
secondarioNomeNodo
Aiuta nameNode a funzionare, unisci file fsimage e modifica e inviali a nameNode
Recupero assistito di Namenode in situazioni di emergenza
dimensione del blocco file hdfs
hadoop1.x 64M, hadoop2.x/3.x è 128M
Lo stato ottimale è quando il tempo di indirizzamento è pari all'1% del tempo di trasmissione
Perché la dimensione del blocco file HDFS non può essere troppo grande o troppo piccola
1. Se è troppo piccolo, aumenterà il tempo di ricerca.
2. Se il blocco è troppo grande, il tempo di trasmissione dei dati sarà significativamente maggiore del tempo necessario per individuare la posizione del blocco iniziale, facendo sì che il programma elabori questo blocco di dati molto lentamente.
conchiglia
caricamento
hadoop fs -moveFromLocal directory del file locale hdfs (taglio e copia locale su hdfs)
hadoop fs -copyFromLocal directory del file locale hdfs (copia localmente su hdfs)
hadoop fs -put directory del file locale hdfs (copia localmente e carica su hdfs)
hadoop fs -appendToFile file locale file hdfs (i dati del file locale vengono aggiunti alla fine del file hdfs)
scaricamento
hadoop fs -copyToLocal hdfs file directory locale (file copiato in locale)
hadoop fs -get hdfs file directory locale (file copiato in locale)
hdf operativi
directory hadoop fs -ls (visualizza le informazioni nella directory)
directory hadoop fs -mkdir (crea directory)
-chgrp, -chmod, -chown (modifica la proprietà del file)
hadoop fs -cat file (visualizza il contenuto del file)
directory del file hadoop fs -cp (copia il file in un'altra directory)
hadoop fs -tail file (visualizza 1kb di dati alla fine del file)
hadoop fs -rm elimina file o cartelle
hadoop fs -rm -r directory (elimina ricorsivamente la directory e il contenuto nella directory)
hadoop fs -du
hadoop fs -setrep (Imposta il numero di repliche e registrale solo nel namenode. Se il numero di datanode è inferiore al numero di repliche impostato, il numero di repliche sarà pari solo ai datanode)
Operazione API hdfs: tramite l'oggetto FileSystem
processo di lettura e scrittura di hdfs
Processo di lettura
Sottoargomento 1
processo di scrittura
Illustrazione
Sottoargomento 3
alveare
concetto
Hive è uno strumento di gestione del data warehouse basato su Hadoop, che mappa i dati strutturati in una tabella e fornisce funzioni di query simili a SQL.
principio
Essence Converti HQL in compiti di Mr
metastore
Metadati: inclusi nome della tabella, database a cui appartiene la tabella (impostazione predefinita), proprietario della tabella, campo colonna/partizione, tipo di tabella (se si tratta di una tabella esterna), directory in cui si trovano i dati della tabella, ecc.
cliente
Fornire interfaccia jdbc/ODBC, accesso webUI, accesso all'interfaccia, ecc.
autista
Analizzatore ParserSQL
Converti SQL nell'albero della sintassi astratto AST. Questo passaggio viene solitamente completato con uno strumento di terze parti, come antrl; esegui l'analisi della sintassi su SAT per verificare se la semantica SQL è corretta, se esistono tabelle e nomi di colonne, ecc.
Piano fisico del compilatore
Converti AST in un piano di esecuzione logico
Ottimizzatore Query Optimizer
Ottimizza i piani di esecuzione logica
Esecuzione
Il piano di writeback logico viene convertito in un piano di esecuzione fisica che può essere eseguito. Per hive, viene convertito in attività mr/tez/spark
tipo di dati
Tipi di dati di base
Il tipo String di hive può teoricamente memorizzare caratteri 2G
Tipo di dati di raccolta
Dichiarazione di creazione della tabella del tipo di dati di raccolta
crea tabella test( stringa del nome, array di amici<string>, mappa dei figli<string, int>, struttura dell'indirizzo<via:stringa, città:stringa> ) campi delimitati dal formato riga terminati da ',' //Delimitatore di colonna elementi della raccolta terminati con '_' //Il delimitatore di MAP STRUCT e ARRAY (suddivisione dei dati simbolo) chiavi della mappa che terminano con ":" //map kye e separatore di valori righe terminate da ' '; //Separatore di riga
conversione del tipo
I tipi di dati atomici di Hive vengono convertiti implicitamente, in modo simile alla conversione di Java. Ad esempio, se un'espressione utilizza il tipo INT, TINYINT verrà automaticamente convertito nel tipo INT, ma Hive non eseguirà la conversione inversa. Ad esempio, se un'espressione utilizza il tipo TINYINT, INT non verrà convertito automaticamente in TINYINT digitare e restituirà un errore a meno che non si utilizzi l'operazione CAST
Regole di conversione implicita
1. Qualsiasi tipo intero può essere convertito implicitamente in un tipo più ampio, ad esempio TINYINT può essere convertito Sostituito con INT, INT può essere convertito in BIGINT.
2. Tutti i tipi interi, FLOAT e STRING possono essere convertiti implicitamente in DOUBLE. (La conversione implicita di String e double può facilmente causare una distorsione dei dati)
3.TINYINT, SMALLINT e INT possono essere tutti convertiti in FLOAT.
4. Il tipo BOOLEAN non può essere convertito in nessun altro tipo.
DDL
Crea tabella
CREARE [ESTERNA] TABELLA [SE NON ESISTE] nome_tabella [(col_name data_type [COMMENT col_comment], ...)] [COMMENTO tabella_commento] [PARTIZIONATO DA (col_name data_type [COMMENT col_comment], ...)] [RAGGRUPPATO PER (nome_col, nome_colon, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [FORMATO RIGA formato_riga] [MEMORATO COME file_formato] [LOCAZIONE hdfs_percorso] [TBLPROPERTY (nome_proprietà=valore_proprietà, ...)] [istruzione_selezione AS]
spiegare
(1) CREATE TABLE crea una tabella con il nome specificato. Se esiste già una tabella con lo stesso nome, viene generata un'eccezione; l'utente può utilizzare l'opzione IF NOT EXISTS per ignorare questa eccezione. (2) La parola chiave EXTERNAL consente agli utenti di creare una tabella esterna. Quando creano la tabella, possono specificare un percorso (LOCATION) che punta ai dati effettivi. Quando la tabella viene eliminata, i metadati e i dati della tabella interna verranno eliminati insieme e le tabelle esterne eliminano solo i metadati, non i dati. (3) COMMENTO: aggiungi commenti a tabelle e colonne. (4) PARTITIONED BY crea una tabella delle partizioni (5) CLUSTERED BY crea una tabella bucket (6) SORTED BY non è comunemente utilizzato. Viene utilizzato per ordinare una o più colonne nel bucket. (7) FORMATO RIGA DELIMITATO [CAMPI TERMINATI DA CARATTERE] [ELEMENTI DELLA RACCOLTA TERMINATO DA carattere] [TASTI MAPPA TERMINATI DA carattere] [LINEE TERMINATE DA carattere] |. SERDE nome_serde [CON SERDEPROPERTIES (nome_proprietà=valore_proprietà, nome_proprietà=valore_proprietà, ...)] Gli utenti possono personalizzare SerDe o utilizzare il SerDe integrato durante la creazione di tabelle. Se ROW FORMAT o ROW FORMAT DELIMITED non è specificato, verrà utilizzato il SerDe integrato. Quando crea una tabella, l'utente deve anche specificare le colonne per la tabella. Quando specifica le colonne della tabella, l'utente specificherà anche un SerDe personalizzato che utilizza SerDe per determinare Dati della colonna specifica della tabella specificata. SerDe è l'abbreviazione di Serialize/Deserilize. Hive utilizza Serde per sequenziare e deserializzare gli oggetti riga. (8) STORED AS specifica il tipo di file di archiviazione. Tipi di file di archiviazione comunemente utilizzati: SEQUENCEFILE (file di sequenza binaria), TEXTFILE (testo), RCFILE (file di formato di archiviazione di colonne). Se i dati del file sono testo semplice, è possibile utilizzare STORED AS FILE DI TESTO. Se i dati devono essere compressi, utilizzare STORED AS SEQUENCEFILE. (9) POSIZIONE: specificare la posizione di archiviazione della tabella su HDFS. (10) AS: seguito da un'istruzione di query per creare una tabella basata sui risultati della query. (11) LIKE consente agli utenti di copiare la struttura della tabella esistente, ma non copia i dati.
Tabella delle partizioni
L'essenza della tabella delle partizioni è corrispondere a una cartella su HDFS e la partizione in Hive è una sottodirectory.
DML
carico
carica i dati [locali] nel percorso '/opt/module/datas/student.txt' [sovrascrivi] nella tabella student [partizione (partcol1=val1,…)];
inserire
inserto di base
inserisci nella tabella (sovrascrivi) ...
Inserimento di tabelle multiple
da nometabella inserire nella tabella t1 .... selezionare .... da tableName, inserire nella tabella t2 .... selezionare .... da tableName
Interroga e crea tabelle
crea balla tableName come seleziona.....
Carica i dati per creare la tabella
1. Carica i dati su hdfs
2. Crea la tabella e specifica la sua posizione su hdfs
Importa i dati in HIve
Nota: utilizzare prima l'esportazione per esportare, quindi importare i dati.
importa la tabella partizione student2 (mese='201709') da '/utente/hive/warehouse/export/student';
Tronca elimina i dati nella tabella
È possibile eliminare solo le tabelle di gestione, non è possibile eliminare i dati nelle tabelle esterne
Funzioni di uso comune
massimo
min
somma
media
contare
ordinare
ordinamento globale
ordine per ordinamento globale, c'è un solo riduttore, l'efficienza è estremamente bassa quando la quantità di dati è grande, ma l'efficienza è elevata quando la quantità di dati è piccola
Ordinamento delle partizioni
distribuire per è simile al partizionatore personalizzato nell'attività mr; la regola di distribuzione per è che dopo la divisione del modulo del numero di riduttori in base al codice hash del campo di partizione, i resti con lo stesso numero entreranno nella stessa partizione.
ordinamento locale
sort by è l'ordinamento interno di ciascun riduttore ed è globalmente non ordinato. Viene spesso utilizzato insieme a distribuisci per, con distribuisci per nella parte anteriore e ordina per nella parte posteriore.
raggruppare per
Può essere sostituito quando distribuisci per ordina per viene utilizzato insieme e i campi sono nello stesso ordine crescente Cluster per non può specificare la regola di ordinamento come ASC o DESC.
partizione, secchio
secchio
Il bucket deve essere abilitato e configurato set hive.enforce.bucketing=true;
Crea una tabella bucket
L'inserimento dei dati in una tabella bucket equivale all'inserimento dei dati in una tabella normale
Regole di bucket
Il campo bucket determina in quale bucket si trovano i dati calcolando il modulo del modulo hash diviso per il numero di bucket.
La differenza tra bucket e partizionamento
Il partizionamento è per il percorso di archiviazione dei dati, ovvero la cartella è per i file di dati.
Indagine di campionamento del secchio
grammatica
TABLESAMPLE(BENCH x OUT OF y) .
Partizione
sottoargomento
Converti tra righe e colonne
riga in colonna
CONCAT(stringa A/col, stringa B/col…)
CONCAT_WS(separatore, str1, str2,...)
COLLECT_SET(col)
Descrizione della funzione
esempio
implementazione SQL
Colonna per riga
Descrizione della funzione
esempio
implementazione SQL
funzione finestra
SOPRA()
riga corrente
riga corrente
n percepire
Vai avanti di n righe
n seguito
n righe indietro
ILLIMITATO
punto di partenza
Percedere senza limiti significa partire dal davanti
mezzi successivi illimitati fino al punto finale dietro
LAG(col,n,val_predefinito)
Vai avanti all'ennesima riga
lead(col,n,val_predefinito)
l'ennesima riga da ora in poi
NTILE(n)
Distribuire le righe nella partizione ordinata ai gruppi di dati specificati. Ogni gruppo è numerato, a partire da 1. Per ogni riga, NTILE restituisce il numero del gruppo a cui appartiene la riga. Nota: n deve essere di tipo int.
esempio
dati
Requisiti e implementazione
1. Interrogare i clienti e il numero totale di clienti che hanno acquistato ad aprile 2017
2. Controlla i dettagli di acquisto del cliente e il totale dell'acquisto mensile
3. Nello scenario sopra riportato, i costi devono essere accumulati in base alla data.
4. Interrogare l'ora dell'ultimo acquisto di ciascun cliente
5. Richiedere le informazioni sull'ordine del 20% precedente
rango
Se l'ordine è lo stesso, verrà ripetuto e il numero totale rimarrà invariato.
denso_rank
Se l'ordine è lo stesso, non ci saranno duplicati e il numero totale sarà ridotto.
numero_riga
verranno calcolati in ordine
esempio
funzione
funzioni integrate
Funzione personalizzata
udf(Funzione definita dall'utente)
Caratteristiche: Uno dentro, uno fuori
Passi di programmazione
1. Eredita la classe org.apache.hadoop.hive.ql.UDF
2. La funzione di valutazione deve essere implementata; la funzione di valutazione supporta l'overload;
3. Crea una funzione nella finestra della riga di comando di hive
1.Carica il barattolo
aggiungi jar linux_jar_path
2.Crea funzione
crea [temporaneo] funzione [dbname.]nome_funzione AS nome_classe;
4. Elimina la funzione nella finestra della riga di comando di hive
Elimina la funzione [temporanea] [se esiste] [nomedb.]nome_funzione;
Nota: l'UDF deve avere un tipo restituito e può restituire null, ma il tipo restituito non può essere void;
udaf(Funzione di aggregazione definita dall'utente)
Più dentro e uno fuori
funzione aggregata
udtf (funzioni di generazione di tabelle definite dall'utente)
Uno dentro, tanti fuori
vista laterale esplodi()
Compressione e archiviazione
Compressione e archiviazione comunemente utilizzate da Hive
Il formato file parquet è comunemente usato in Hive; lzo o snappy viene utilizzato per la compressione.
compressione
Tabella dei formati di compressione
Confronto delle prestazioni di compressione
Impostazioni dei parametri di compressione
magazzinaggio
Formati di file comuni in hive
textFile, parquet, orc, sequencefile
Classificazione del formato dei file
Stoccaggio delle righe
Caratteristiche
Quando si esegue una query su un'intera riga di dati che soddisfa le condizioni, l'archiviazione delle colonne deve accedere a ciascun campo aggregato per trovare il valore corrispondente di ciascuna colonna. L'archiviazione delle righe deve trovare solo uno dei valori, mentre il resto dei valori lo è in luoghi adiacenti, quindi le query dell'archivio righe sono più veloci.
file di testo
Nel formato predefinito, i dati non vengono compressi, determinando un elevato sovraccarico del disco e un elevato sovraccarico di analisi dei dati.
sequenzaFile
Stoccaggio delle colonne
Caratteristiche
Poiché i dati di ciascun campo vengono aggregati e archiviati, quando la query richiede solo pochi campi, la quantità di dati letti può essere notevolmente ridotta; il tipo di dati di ciascun campo deve essere lo stesso e l'archiviazione a colonne può essere progettata meglio in modo specifico. Algoritmo di compressione progettato.
parquet
orco
composizione
I file Orc generalmente sono costituiti da una o più strisce. Ciascuna striscia ha generalmente le dimensioni di un blocco HDFS. Ciascuna striscia contiene più record. Questi record vengono archiviati in modo indipendente in base alle colonne.
banda
dati dell'indice
Sottoargomento 1
dati della riga
piè di pagina a strisce
Messa a punto
recuperare la cattura
Ciò significa che in alcuni casi, la query non ha bisogno di passare attraverso l'attività MR, come selezionare * dalla tabella. In questo caso, hive può semplicemente leggere il file nella directory della tabella e inviarlo alla console.
recuperare le impostazioni di abilitazione acquisizione
Imposta hive.fetch.task.conversion = more nel file hive-default.xml.template
Dopo averla attivata, la ricerca globale, la ricerca limitata e la ricerca sul campo non utilizzeranno l'attività mr.
modalità locale
I dati di input di Hive sono piccoli e il tempo impiegato per attivare l'attività di esecuzione della query potrebbe essere molto più lungo del tempo di esecuzione effettivo del lavoro. In questo caso, puoi attivare la modalità locale per elaborare tutte le attività su un singolo computer. Il tempo di esecuzione delle attività per set di dati di piccole dimensioni sarà notevolmente ridotto
impostazioni dei parametri
imposta hive.exec.mode.local.auto=true //Abilita locale mr
Ottimizzazione della tabella
Tavolo grande, tavolo piccolo si uniscono
Mettere le tabelle piccole davanti e quelle grandi dietro può ridurre efficacemente la possibilità di errori di overflow della memoria. Ora che è stato ottimizzato, mettere le tabelle piccole davanti e quelle grandi dietro non ha alcun effetto.
unione della mappa (tabella piccola si unisce alla tabella grande)
impostazioni di abilitazione unione mappa
l'unione della mappa è abilitata per impostazione predefinita
imposta hive.auto.convert.join = true;
set hive.mapjoin.smalltable.filesize=25000000;//La dimensione predefinita della tabella piccola è 25M
principio di unione delle mappe
unisciti al grande tavolo
1. Filtraggio chiave vuota
Una grande quantità di dati anomali con chiavi vuote entra nello stesso riduttore ed è estremamente lenta da elaborare. A volte addirittura trabocca la memoria. Puoi scegliere di filtrare prima le chiavi vuote.
2. Conversione di chiavi vuote
Un numero elevato di chiavi vuote non è un dato anomalo e deve essere incluso nel set di risultati. Successivamente è possibile assegnare valori alle chiavi e distribuirle uniformemente nel riduttore.
raggruppa per
Abilita l'aggregazione lato mappa
impostazioni dei parametri
1. Abilita l'aggregazione sul lato mappa
imposta hive.map.aggr = true
2. Aggrega il numero di elementi sul lato della mappa
imposta hive.groupby.mapaggr.checkinterval = 100000
3. Eseguire il bilanciamento del carico in caso di disallineamento dei dati (impostazione predefinita: false)
imposta hive.groupby.skewindata = vero
Principio: verranno avviati due lavori. Il lato mappa del primo lavoro distribuirà in modo casuale le chiavi ai riduttori. Ciascun riduttore eseguirà un'operazione di aggregazione internamente e restituirà i risultati lo stesso La chiave viene inviata allo stesso riduttore per l'aggregazione per completare l'operazione di aggregazione finale.
contare (distinto)
I piccoli dati non contano
Grande quantità di dati
In caso di grandi volumi di dati, count(distinct) inserirà solo un riduttore, indipendentemente dal numero di riduttori presenti, influenzando l'avanzamento del lavoro che è possibile utilizzare raggruppato per eseguire statistiche di deduplicazione.
Prodotto cartesiano
Cerca di evitare il prodotto cartesiano, non aggiungere condizioni durante l'adesione o avere condizioni non valide. Hive può utilizzare solo un riduttore per elaborare i dati.
Filtraggio di righe e colonne
Elaborazione delle colonne
In select, prendi solo le colonne richieste e usa select * il meno possibile
elaborazione delle righe
Se le condizioni di filtro della tabella secondaria vengono scritte dopo dove nell'associazione, le due tabelle verranno prima associate all'intera tabella e quindi filtrate i dati. Si consiglia di creare prima una sottoquery con le condizioni di filtro per la tabella secondaria e quindi eseguire l'associazione.
partizionamento dinamico
Abilita le impostazioni della partizione dinamica
1. Abilita le impostazioni della funzione di partizionamento dinamico (abilitata per impostazione predefinita)
hive.exec.dynamic.partition=true
2. Impostato sulla modalità non rigorosa (la modalità di partizionamento dinamico, l'impostazione predefinita è rigorosa, il che significa che almeno una partizione deve essere specificata come Partizionamento statico, modalità non restrittiva significa che tutti i campi di partizione possono utilizzare il partizionamento dinamico. )
hive.exec.dynamic.partition.mode=nonstrict
3. Il numero massimo di partizioni dinamiche che possono essere create su tutti i nodi che eseguono MR. Predefinito 1000
hive.exec.max.dynamic.partitions=1000
4. Il numero massimo di partizioni dinamiche che possono essere create su ciascun nodo che esegue MR. Questo parametro deve essere basato sull'effettivo dati da impostare. Ad esempio: i dati di origine contengono dati per un anno, ovvero il campo giorno ha 365 valori, quindi questo parametro è Deve essere impostato su un valore maggiore di 365. Se si utilizza il valore predefinito di 100, verrà segnalato un errore.
hive.exec.max.dynamic.partitions.pernode=100
5. Il numero massimo di file HDFS che possono essere creati nell'intero lavoro MR. Predefinito 100000
hive.exec.max.created.files=100000
6. Se generare un'eccezione quando viene generata una partizione vuota. Generalmente non sono necessarie impostazioni. Predefinito falso
hive.error.on.empty.partition=false
Partizione
secchio
Distorsione dei dati
1. Imposta un numero ragionevole di mappe
Esecuzione parallela
Per impostazione predefinita, hive può eseguire solo una fase alla volta. Tuttavia, un lavoro specifico può contenere molte fasi e queste fasi potrebbero non essere completamente dipendenti l'una dall'altra, vale a dire che alcune fasi possono essere eseguite in parallelo il lavoro può essere completato eseguendolo in parallelo più velocemente.
Attiva le impostazioni dei parametri
set hive.exec.parallel=true; //Abilita l'esecuzione parallela delle attività set hive.exec.parallel.thread.number=16 //Il grado massimo di parallelismo consentito per lo stesso SQL, il valore predefinito è 8.
modalità rigorosa
riutilizzo jvm
esecuzione speculativa
compressione
Teoria del magazzino dei numeri
concetto
Si tratta di una raccolta strategica che fornisce tutti i tipi di supporto dati per il processo decisionale a tutti i livelli dell'impresa.
caratteristica
Un data warehouse è una raccolta di dati orientata al grafico, integrata, non volatile e variabile nel tempo per supportare il processo decisionale
Orientato all'argomento
Integrazione
Non volatile (non può essere modificato)
variabile nel tempo
ecc
Estrai Extra, Trasforma Trasferimento, Carica Carica
Stratificazione del data warehouse
dati di origine
Non ci sono modifiche ai dati in questo livello. Utilizza direttamente la struttura e i dati del sistema periferico e non è aperto al pubblico. È un livello di archiviazione temporaneo, ovvero un'area di archiviazione temporanea per i dati dell'interfaccia per prepararsi al successivo elaborazione dati.
Banca dati
Conosciuto anche come livello di dettaglio, i dati nel livello DW devono essere dati coerenti, accurati e puliti che sono stati ripuliti (rimossi dalle impurità) dai dati del sistema di origine.
Applicazione dati
Sorgenti dati lette direttamente dalle applicazioni front-end; dati calcolati e generati in base ai requisiti di report e analisi tematiche
perché stratificare
spazio per il tempo
Una grande quantità di preelaborazione viene utilizzata per migliorare l'esperienza dell'utente (efficienza) del sistema applicativo, quindi ci sarà una grande quantità di dati ridondanti nel data warehouse senza stratificazione, se le regole aziendali del sistema aziendale di origine cambiano; influenzerà l'intero processo di pulizia dei dati e il lavoro. L'importo è enorme.
La stratificazione semplifica il processo di pulizia dei dati
Il processo di pulizia dei dati può essere semplificato attraverso la gestione gerarchica dei dati, poiché dividere il lavoro originale in una sola fase in più passaggi equivale a dividere un lavoro complesso in più attività semplici e a trasformare una grande scatola nera in una scatola bianca. la logica di elaborazione di ciascun livello è relativamente semplice e facile da comprendere. Ciò ci consente di garantire più facilmente la correttezza di ogni passaggio. Quando si verificano errori nei dati, spesso è necessario modificare solo parzialmente un determinato passaggio.
datamart
Architettura del datamart
data mart indipendente
Datamart dipendente
Stratificazione del data warehouse
Principio di stratificazione del data warehouse
1. Per facilitare l’analisi dei dati è necessario schermare il business complesso sottostante ed esporre i dati al livello di analisi in modo semplice, completo e integrato.
2. L'impatto dei cambiamenti aziendali sottostanti e dei cambiamenti della domanda di livello superiore sul modello è ridotto al minimo. L'impatto dei cambiamenti del sistema aziendale è indebolito a livello di dati di base. In combinazione con il metodo di costruzione top-down, l'impatto dei cambiamenti della domanda sul il modello è indebolito.
3. Elevata coesione e accoppiamento lasco, ovvero elevata coesione dei dati all'interno di un argomento o all'interno di ciascun sistema completo e accoppiamento lasco dei dati tra argomenti o tra sistemi completi.
4. Costruire il livello dati di base del magazzino per isolare il lavoro di integrazione dei dati aziendali sottostante dal lavoro di sviluppo delle applicazioni del livello superiore, gettando le basi per lo sviluppo su larga scala del magazzino. La gerarchia del magazzino sarà più chiara e i dati esposti esternamente saranno più unificati.
Stratificazione del data warehouse
ods (archivio dati operativo)
Accedi ai dati originali intatti
DW (data warehouse)
Livello di dettaglio dati DWD (Data Warehouse Detail).
La granularità è coerente con il livello ods e fornisce determinate garanzie sulla qualità dei dati. Ciò che il livello DWD deve fare è la pulizia, l'integrazione e la standardizzazione dei dati. Verranno elaborati dati sporchi, dati spazzatura, dati con specifiche incoerenti, definizioni di stato incoerenti e specifiche di denominazione incoerenti. Allo stesso tempo, al fine di migliorare l'usabilità dei dati, verranno utilizzate alcune tecniche di degrado delle dimensioni per degradare le dimensioni in tabelle dei fatti e ridurre l'associazione tra tabelle delle dimensioni e tabelle dei fatti. A questo livello, alcuni dati verranno anche aggregati per riunire i dati della stessa area tematica nella stessa tabella per migliorare l'usabilità dei dati.
Livello intermedio dei dati DWM (Data WareHouse Middle).
Sulla base dello strato DWD, l'operazione di aggregazione degli indicatori viene eseguita sulle dimensioni fondamentali comuni per calcolare i corrispondenti indicatori statistici. Nei calcoli effettivi, se gli indicatori di calcolo della tabella ampia vengono calcolati direttamente dal livello DWD o ODS, si verificheranno problemi quali calcoli eccessivi e dimensioni insufficienti. Pertanto, l'approccio generale consiste nel calcolare prima più tabelle intermedie piccole il livello dwm e poi metterli insieme in un'ampia tabella. Poiché la larghezza e i limiti della larghezza sono difficili da definire, è anche possibile rimuovere il livello dwm e lasciare solo il livello dws.
Livello di servizio dati DWS (Data WareHouse Servce).
La granularità è più grossolana rispetto al livello dettagliato. I dati basati sul livello dwd vengono integrati e riepilogati nei dati di servizio per l'analisi di una determinata area tematica, che generalmente è una tabella ampia. Lo strato dws dovrebbe coprire l'80% della scena dei nutrienti. Conosciuto anche come data mart o tabella ampia, viene utilizzato per successive query aziendali, analisi olap, distribuzione dei dati, ecc.
Livello di applicazione dati APP
I dati vengono forniti principalmente per prodotti di dati e analisi dei dati. Sono generalmente archiviati in ES, PostgreSql, Redis e altri sistemi per l'utilizzo da parte di sistemi online. Possono anche essere archiviati in Hive o Druid per l'analisi dei dati e il data mining. Ad esempio, i dati del report di cui parliamo spesso vengono solitamente inseriti qui.
strato superficiale di dimensioni ridotte
Se disponi di tabelle dimensionali, puoi progettare questo livello separatamente.
Dati ad alta cardinalità
In generale, è simile alla tabella dei dati utente, alla tabella dei dati della tabella del prodotto. La quantità di dati può essere di decine di milioni o centinaia di milioni
Dati sulla circonferenza di base bassa
In genere si tratta di una tabella di configurazione, ad esempio il significato cinese corrispondente al valore di enumerazione o la tabella delle dimensioni della data. La quantità di dati può essere costituita da singole cifre, centinaia, migliaia o decine di migliaia.
Metodo di modellazione del data warehouse
modellazione dimensionale
significato
Costruisci un modello basato sulle esigenze delle decisioni analizzate e il modello di dati costruito soddisfa le esigenze di analisi, concentrandosi sulla risoluzione del problema degli utenti che completano rapidamente l'analisi e offre anche buone prestazioni di risposta per query complesse su larga scala.
tabella dei fatti
tabella dei fatti con istantanee periodiche
tabella dei fatti della transazione
Tabella dei fatti snapshot cumulativa
tabella dei fatti senza fatti
tabella dei fatti aggregata
Unisci tabelle dei fatti
tabella delle dimensioni
schema stellare
Tutte le tabelle delle dimensioni sono collegate alla tabella dei fatti e le tabelle delle dimensioni non sono associate ad altre tabelle delle dimensioni.
modello di costellazione
Estese dallo schema a stella, più tabelle fattuali condividono informazioni sulle dimensioni
modello fiocco di neve
La tabella dei fatti è associata alla tabella delle dimensioni. La tabella delle dimensioni può avere altre tabelle delle dimensioni. Esistono molte associazioni e prestazioni ridotte.
Processo di modellazione dimensionale
Seleziona il processo aziendale
Granularità della dichiarazione
La stessa tabella dei fatti deve avere la stessa granularità. Non mescolare più granularità diverse nella stessa tabella dei fatti Vengono create tabelle dei fatti diverse per dati con granularità diversa. Per i dati i cui requisiti non sono chiari, stabiliamo la granularità atomica.
Conferma le dimensioni
Confermare i fatti
modellazione paradigmatica
6 paradigmi di database
Prima forma normale (1NF)
Ciò che viene sottolineato è l'atomicità della colonna, cioè la colonna non può essere divisa in altre colonne.
Seconda forma normale (2NF)
Per soddisfare la prima forma normale, devono essere soddisfatte due condizioni. Innanzitutto, la tabella deve avere una chiave primaria; in secondo luogo, le colonne non incluse nella chiave primaria devono dipendere completamente dalla chiave primaria e non possono dipendere solo da una parte della chiave primaria chiave.
Terza forma normale (3NF)
Per soddisfare 2nf, le colonne di chiave non primaria devono dipendere direttamente dalla chiave primaria e non possono esserci dipendenze transitive. Cioè, non può esistere: la colonna di chiave non primaria A dipende dalla colonna di chiave non primaria B e dalla colonna di chiave non primaria B
Forma normale di Boyce-Codd (BCNF)
Quarta forma normale (4NF)
Quinta forma normale (5NF)
Passaggi di modellazione
1. Modello concettuale
2. Modello logico
3.Modello fisico
Idee fondamentali per la costruzione del data warehouse
Dai livelli di progettazione, sviluppo, distribuzione e applicazione, evitiamo la costruzione ripetuta e la costruzione di indicatori ridondanti, garantendo così la standardizzazione e l'unificazione del calibro dei dati e, in definitiva, realizzando l'associazione completa delle risorse di dati, fornendo output di dati standard e dati unificati strato pubblico
Processo di costruzione del data center
impala
tipo di dati
comando di shell
Architettura
modulo
impalad
Ricevi la richiesta del cliente, esegui la query e torna al punto di coordinamento centrale
Il processo daemon sul nodo figlio è responsabile del mantenimento della comunicazione con l'archivio stati e del reporting del lavoro
Statestore
Responsabile della raccolta delle informazioni sulle risorse distribuite in ciascun processo impalad, dello stato di integrità di ciascun nodo e della sincronizzazione delle informazioni sui nodi
Responsabile del coordinamento e della pianificazione delle query
Catalogare
Distribuisci le informazioni sui metadati della tabella a ciascun impalad
Ricevi tutte le richieste da Statestore
hiveMetastore
hdfs
ddl
Impala non supporta WITH DBPROPERTIES (ad esempio: aggiunta delle informazioni sul creatore e della data di creazione alla libreria)
Elimina banca dati
eliminare la banca dati
impala non supporta il database alter
dml
Importazione dei dati (sostanzialmente uguale a hive), impala non supporta il caricamento dei dati in percorso locale...
Esportazione dei dati (impala non supporta la sintassi insert overwrite... per esportare i dati, puoi invece utilizzare impala -o)
I comandi di esportazione e importazione non sono supportati
Chiedere informazioni
La sintassi di base è più o meno la stessa dell'istruzione hive query.
impala non supporta il bucket
impala non supporta cluster per, ordinamento per, distribuzione per
Impala non supporta le funzioni COLLECT_SET(col) edExplod(col).
Impala supporta le funzioni di finestra
funzione personalizzata impala
uff
Archiviazione e compressione
ottimizzazione
1. Prova a distribuire stateStore e catalog il più possibile sullo stesso server per garantire la loro comunicazione.
2. Migliora l'efficienza del lavoro limitando la memoria di impala dameon (default 256) e il numero di thread di statestore
3. Ottimizzazione SQL, richiamare il piano di esecuzione prima di eseguire SQL
4. Scegli il formato file appropriato per l'archiviazione per migliorare l'efficienza delle query
5. Evitare di generare molti file di piccole dimensioni (se sono presenti file di piccole dimensioni generati da altri programmi, è possibile utilizzare una tabella intermedia per memorizzare i dati di file di piccole dimensioni nella tabella intermedia. Quindi inserire i dati dalla tabella intermedia nella tabella finale tramite insert. ..Selezionare...)
6. Utilizzare la tecnologia di partizionamento appropriata e calcolare in base alla granularità della partizione
7. Utilizzare le statistiche di calcolo per raccogliere informazioni sulla tabella Quando una tabella di contenuti o una partizione cambia in modo significativo, ricalcolare la tabella o la partizione dei dati relativi alle statistiche. Poiché le differenze nel numero di righe e nei valori distinti possono far sì che Impala scelga un ordine di unione diverso quando si utilizza una query sulla tabella.
8. Ottimizzazione della rete io
–a. Evitare di inviare tutti i dati al client
–b. Eseguire il filtraggio condizionale il più possibile
–c. Utilizzare la clausola limite
–d.Quando si generano file, evitare di utilizzare un output abbellito
–e. Prova a utilizzare un aggiornamento dei metadati meno completo
9. Utilizzare il profilo per generare il piano informativo sottostante e ottimizzare l'ambiente di conseguenza.
Teoria del lago di dati
scintilla
Modulo integrato
nucleo della scintilla
Implementate le funzioni di base di Spark, inclusi moduli come la pianificazione delle attività, la gestione della memoria, il ripristino degli errori e l'interazione con i sistemi di archiviazione. Spark Core include anche definizioni API per Resilient Distributed DataSet (RDD).
scintilla mq
Spark è un pacchetto per la manipolazione di dati strutturati e può supportare HQL
scintilla in streaming
Componente di streaming computing, l'API è altamente corrispondente allo spark core
scintilla mlib
Fornisce librerie comuni di machine learning
scintilla graghx
calcolo del grafico
modalità operativa
modalità locale
modalità autonoma
modalità filato
filato-cliente
Caratteristiche:
Il driver viene eseguito sul client ed è adatto per l'interazione e il debug.
cluster di filati
Caratteristiche
Il driver esegue applicationMaster avviato da ResourceManager ed è adatto per ambienti di produzione.
sparkcore
rdd
calcolare
partizioni
partizionatore
dipendenze
operatore
operatore di conversione
tipo di valore
mappa(funzione)
mappaPartizioni(funzione)
Il tipo di funzione func deve essere Iterator[T] => Iterator[U]
mapPartitionsWithIndex(funzione)
Il tipo di funzione func deve essere (Int, Interator[T]) => Iterator[U]
flatMap(funzione)
glom()
Forma ciascuna partizione in un array e forma un nuovo tipo RDD RDD[Array[T]]
raggruppa per()
Sottoargomento 1
Raggruppare in base al valore restituito della funzione passata. Inserisci i valori corrispondenti alla stessa chiave in un iteratore.
filtro
campione(conSostituzione, frazione, seme)
Campiona casualmente una frazione di dati con il seme casuale specificato. withReplacement indica se i dati estratti vengono sostituiti. true significa campionamento con sostituzione, false significa campionamento senza seme di sostituzione per specificare il seme del generatore di numeri casuali.
distinto([numAttività]))
Restituisce un nuovo RDD dopo aver deduplicato l'RDD di origine. Per impostazione predefinita, funzionano solo 8 attività parallele, ma questo può essere modificato passando un parametro numTasks opzionale.
coalesce(numPartizioni)
Ridurre il numero di partizioni per migliorare l'efficienza di esecuzione di set di dati di piccole dimensioni dopo aver filtrato set di dati di grandi dimensioni.
ripartizione(numPartizioni)
Mescola nuovamente in modo casuale tutti i dati attraverso la rete in base al numero di partizioni.
La differenza tra coalescere e ripartizione
1. unire le partizioni, è possibile scegliere se eseguire il processo di riproduzione casuale. Per parametro shuffle: Booleano = falso/vero Decidere.
2. La ripartizione chiama effettivamente coalesce per eseguire lo shuffle.
sortBy(funzione,[ascendente], [numTasks])
Utilizzare la funzione per elaborare prima i dati e ordinarli in base ai risultati del confronto dei dati elaborati. L'impostazione predefinita è l'ordine positivo.
pipe(comando, [envVars])
La pipeline, per ogni partizione, esegue uno script di shell e restituisce un RDD di output.
Tipo a valore doppio
unione
sottrarre (altro set di dati)
Una funzione che calcola la differenza, rimuovendo gli stessi elementi in due RDD e rimarranno RDD diversi
intersezione(altroset di dati)
Restituisce un nuovo RDD dopo aver intersecato l'RDD di origine e il parametro RDD.
cartesiano(altroDataset)
Prodotto cartesiano
zip(altroset di dati)
Combina due RDD in un RDD sotto forma di Chiave/Valore. Per impostazione predefinita, il numero di partizioni e di elementi dei due RDD è lo stesso, altrimenti verrà generata un'eccezione.
tipo chiave/valore
partizionamentoPer(partizionatore)
Esegui l'operazione di partizionamento supairRDD Se il partionRDD originale è coerente con il partitionRDD esistente, non verrà eseguito alcun partizionamento. In caso contrario, verrà generato ShuffleRDD, che genererà un processo di riordino.
reduceByKey(funzione, [numAttività])
Chiamato su un (K, V) RDD, restituisce un (K, V) RDD, utilizzando la funzione di riduzione specificata per aggregare insieme i valori della stessa chiave. Il numero di attività di riduzione può essere passato attraverso il secondo opzionale parametri da impostare.
gruppoPerChiave()
Anche groupByKey opera su ciascuna chiave, ma genera solo una seq.
La differenza tra reduceByKey e groupByKey
1. reduceByKey: aggregazione basata sulla chiave, esiste un'operazione di combinazione (pre-aggregazione) prima della riproduzione casuale e il risultato restituito è RDD[k,v]. 2. groupByKey: raggruppa per tasto e mescola direttamente. 3. Guida allo sviluppo: si consiglia reduceByKey rispetto a groupByKey. Ma è necessario prestare attenzione se ciò influenzerà la logica aziendale.
aggregateByKey
Parametri: (zeroValue:U,[partitioner: Partitioner]) (seqOp: (U, V) => U,combOp: (U, U) => U)
Nell'RDD delle coppie kv, i valori vengono raggruppati e uniti in base alla chiave. Durante l'unione, ciascun valore e il valore iniziale vengono utilizzati come parametri della funzione seq per il calcolo e il risultato restituito viene utilizzato come una nuova coppia kv, quindi il risultato viene calcolato in base a La chiave viene unita e infine il valore di ciascun gruppo viene passato alla funzione di combinazione per il calcolo (i primi due valori vengono calcolati per primi e il risultato restituito e il valore successivo vengono passati a la funzione di combinazione e così via) e la chiave e il risultato del calcolo sono come Viene emessa una nuova coppia kv.
foldByKey
Parametri: (zeroValue: V)(funz: (V, V) => V): RDD[(K, V)]
Il funzionamento semplificato di aggregateByKey, seqop e combop è lo stesso
combinaPerChiave[C]
Parametri: (createCombiner: V => C, mergeValue: (C, V) => C, mergeCombiners: (C, C) => C)
Funzione: unisci V in un insieme per lo stesso K
Sottoargomento 3
sortByKey([crescente], [numTasks])
Quando viene chiamato su un RDD di (K, V), K deve implementare l'interfaccia Ordered e restituire un RDD di (K, V) ordinato per chiave.
mapValues
Per i tipi della forma (K, V), agire solo su V
join(otherDataset, [numTasks])
Chiamato su RDD di tipo (K, V) e (K, W), restituisce un RDD di (K, (V, W)) in cui tutti gli elementi corrispondenti alla stessa chiave sono accoppiati insieme.
cogroup(otherDataset, [numTasks])
Chiamato su RDD di tipo (K,V) e (K,W), restituisce un RDD di tipo (K,(Iterable<V>,Iterable<W>))
azione
ridurre(funzione)
Aggrega tutti gli elementi nell'RDD tramite la funzione func, aggrega prima i dati all'interno della partizione, quindi aggrega i dati tra le partizioni
raccogliere()
Nel driver, restituisci tutti gli elementi del set di dati come array.
contare()
Restituisce il numero di elementi nell'RDD
Primo()
Restituisce il primo elemento nell'RDD
preso)
Restituisce un array costituito dai primi n elementi dell'RDD
prendiOrdinato(n)
Restituisce un array costituito dai primi n elementi ordinati da questo RDD
aggregato
Parametri: (zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U)
La funzione aggregata aggrega gli elementi in ciascuna partizione tramite seqOp e il valore iniziale, quindi utilizza la funzione combine per combinare il risultato di ciascuna partizione con il valore iniziale (zeroValue). Non è necessario che il tipo finale restituito da questa funzione sia coerente con il tipo di elemento nell'RDD
piega(num)(funzione)
L'operazione di piegatura, l'operazione semplificata di aggregato, seqop e combop sono le stesse.
Sottoargomento 9
nucleo di scintilla
componenti del nucleo della scintilla
autista
esecutore
innescare il processo di esecuzione generale
1) Dopo aver inviato l'attività, verrà avviato per primo il programma Driver; 2) Successivamente il Driver registra l'applicazione presso il cluster manager; 3) Il cluster manager quindi alloca e avvia l'Executor in base al file di configurazione di questa attività; 4) Il driver inizia a eseguire la funzione principale e la query Spark viene eseguita pigramente Quando viene eseguito l'operatore Azione, inizia il calcolo inverso e le fasi vengono divise in base a ampie dipendenze. Quindi ciascuna fase corrisponde a un set di attività e ci sono più attività nel set di attività Cerca risorse disponibili Esecutore per la pianificazione; 5) Secondo il principio di localizzazione, l'attività verrà distribuita all'esecutore designato per l'esecuzione. Durante il processo di esecuzione dell'attività, l'esecutore continuerà a comunicare con il conducente e a segnalare lo stato di esecuzione dell'attività.
Modalità di distribuzione
autonomo
filato hadoop
filato-cliente
cluster di filati
mesos
k8s
conteggio delle parole
sc.textFile("xx").flatMap(_.split(" ")).map((_,1)).reduceByKey(_ _).saveAsTextFile("xx")
ottimizzazione
Distorsione dei dati
modello di memoria
Algoritmi comuni
Kafka
Hbase
definizione
Hbase è un sistema noSql con archiviazione distribuita scalabile, ad alta affidabilità, ad alte prestazioni, orientata alle colonne e in tempo reale.
Caratteristiche
1. Archiviazione di massa
Hbase è adatto per l'archiviazione di dati a livello PB e i dati a livello PC possono essere restituiti entro decine o centinaia di millisecondi.
2. Stoccaggio delle colonne
L'archiviazione HBase dispone solo dell'archiviazione della famiglia di colonne, che contiene molte colonne.
3. Estremamente facile da espandere
La scalabilità di Hbase si riflette principalmente in due aspetti, uno è l'espansione basata su capacità di elaborazione di livello superiore (RegionServer) e l'altro è l'espansione basata sullo storage (HDFS). Aggiungendo orizzontalmente le macchine RegionSever, viene eseguita l'espansione orizzontale per migliorare le capacità di elaborazione dello strato superiore di Hbase e migliorare la capacità di Hbsae di servire più regioni.
4. Elevata concorrenza
Poiché la maggior parte delle attuali architetture che utilizzano Hbase utilizzano PC economici, il ritardo di un singolo IO in realtà non è piccolo, generalmente compreso tra decine e centinaia di ms. L'elevata concorrenza qui menzionata significa principalmente che, in caso di concorrenza, il singolo ritardo IO di Hbase non diminuisce di molto. In grado di ottenere servizi ad alta concorrenza e bassa latenza.
5. Scarso
Sparse è principalmente dovuto alla flessibilità delle colonne Hbase Nella famiglia di colonne, puoi specificare tutte le colonne che desideri. Quando i dati della colonna sono vuoti, non occuperanno spazio di archiviazione.
Architettura Hbase
Diagramma dell'architettura
cliente
Contiene l'interfaccia per l'accesso a HBase e include anche la cache per velocizzare l'accesso a HBase. Ad esempio, la cache contiene informazioni .META.
guardiano dello zoo
Principalmente responsabile dell'elevata disponibilità del master, del monitoraggio del reginserver, dell'immissione dei metadati e della manutenzione della configurazione del cluster.
ZK viene utilizzato per garantire che nel cluster sia in esecuzione un solo master. Quando il master fallisce, viene generato un nuovo master attraverso un meccanismo di competizione.
Monitorare lo stato del server regionale tramite zk. Quando il server regionale è anomalo, notifica al Master le informazioni online e offline del server regionale sotto forma di callback.
Informazioni di ingresso unificate per l'archiviazione di metadati tramite zk
hdfs
Fornire servizi di archiviazione dati sottostanti per HBase
Fornisce servizi di archiviazione distribuiti sottostanti per metadati e dati di tabella
Copie multiple di dati garantiscono elevata affidabilità e disponibilità
HMaster
Assegna la regione a RegionServer
Mantenere il bilanciamento del carico nel cluster
Conservare le informazioni sui metadati del cluster
Scopri la regione guasta e assegna la regione guasta al RegionServer normale
Quando il RegionSever fallisce, coordina la suddivisione dell'Hlog corrispondente
HReginServer
Gestisce principalmente le richieste di lettura e scrittura degli utenti
Gestisci la regione assegnata dal master
Gestire le richieste di lettura e scrittura dei client
Responsabile dell'interazione con l'HDFS sottostante e dell'archiviazione dei dati su HDFS
Responsabile della divisione della Regione dopo che questa è diventata più grande
Responsabile dell'unione di Storefiles
Ruolo
HMaster
1. Monitorare RegionServer
2. Gestione del failover di RegionServer
3. Gestire le modifiche ai metadati
4. Gestire l'allocazione o il trasferimento delle regioni
5. Bilanciamento del carico dei dati durante i tempi di inattività
6. Pubblica la tua posizione ai clienti tramite Zookeeper
RegionServer
1. Responsabile della memorizzazione dei dati effettivi di HBase
2. Elabora la regione assegnatagli
3. Svuota la cache su HDFS
4. Mantieni Hlog
5. Eseguire la compressione
6. Responsabile dell'elaborazione della frammentazione della regione
Altri componenti
Registri Write-Ahead (wal)
Record di modifica HBase, durante la lettura e la scrittura di dati su HBase, i dati non vengono scritti direttamente sul disco, verranno conservati in memoria per un periodo di tempo (è possibile impostare soglie di tempo e volume di dati). Tuttavia, il salvataggio dei dati in memoria può avere una maggiore probabilità di causare la perdita di dati. Per risolvere questo problema, i dati verranno prima scritti in un file chiamato file di registro Write-Ahead e quindi scritti nella memoria. Pertanto, quando il sistema fallisce, i dati possono essere ricostruiti tramite questo file di registro
regione
Per lo sharding della tabella HBase, la tabella HBase verrà divisa in diverse regioni in base al valore RowKey e archiviata nel RegionServer. Possono esserci più regioni diverse in un RegionServer.
negozio
HFile è archiviato in Store e uno Store corrisponde a una famiglia di colonne nella tabella HBase.
MemStore
Come suggerisce il nome, si tratta di un archivio di memoria, che si trova nella memoria e viene utilizzato per salvare le operazioni sui dati correnti. Pertanto, dopo che i dati sono stati salvati nel WAL, RegionServer memorizzerà le coppie chiave-valore nella memoria.
HFile
Questo è il file fisico effettivo che contiene i dati originali sul disco, il file di archiviazione effettivo. StoreFile è archiviato in HDFS sotto forma di Hfile.
Operazioni HBase
Struttura dati HBase
RowKey
Come il database NoSQL, RowKey è la chiave primaria per accedere ai dati. Esistono tre modi per accedere alle righe HBase
1.Accesso tramite un unico tasto di fila
2. Passa l'intervallo di rowkey (normale)
3. Scansione completa della tabella
La chiave di riga RowKey (RowKey) può essere qualsiasi stringa (la lunghezza massima è 64 KB e la lunghezza nelle applicazioni effettive è generalmente di 10-100 byte All'interno di HBASE, RowKey viene salvata come array di byte). Durante l'archiviazione, i dati vengono archiviati nell'ordine lessicografico (ordine dei byte) di RowKey. Quando si progetta RowKey, è necessario ordinare completamente le proprietà di archiviazione e archiviare insieme le righe che vengono lette spesso insieme. (dipendenza dalla posizione)
famiglia di colonne
Famiglia di colonne: ciascuna colonna nella tabella HBASE appartiene a una determinata famiglia di colonne. Le famiglie di colonne fanno parte dello schema della tabella (le colonne no) e devono essere definite prima di utilizzare la tabella. I nomi delle colonne sono preceduti dalla famiglia di colonne. Ad esempio, corsi:storia e corsi:math appartengono tutti alla famiglia di colonne corsi.
cellula
Un'unità identificata in modo univoco da {rowkey, colonna Famiglia:columu, versione}. I dati nella cella non hanno tipo e sono tutti archiviati sotto forma di bytecode.
marca temporale
In HBase, un'unità di archiviazione determinata dalla chiave di riga e dalla colonna è denominata cella. Ogni cella memorizza più versioni degli stessi dati. Le versioni sono indicizzate in base al timestamp. Il tipo di timestamp è un numero intero a 64 bit. Il timestamp può essere assegnato da HBASE (automaticamente quando i dati vengono scritti), nel qual caso il timestamp è l'ora corrente del sistema precisa al millisecondo. Il timestamp può anche essere assegnato esplicitamente dal client. Se un'applicazione desidera evitare conflitti tra le versioni dei dati, deve generare i propri timestamp univoci. In ciascuna cella, le diverse versioni dei dati vengono ordinate in ordine cronologico inverso, ovvero i dati più recenti vengono elencati per primi. Per evitare il carico di gestione (inclusa archiviazione e indicizzazione) causato da troppe versioni di dati, HBASE fornisce due metodi di riciclo delle versioni dei dati. Uno consiste nel salvare le ultime n versioni dei dati e l'altro consiste nel salvare le versioni nell'ultimo periodo di tempo (ad esempio gli ultimi sette giorni). Gli utenti possono impostarlo per ciascuna famiglia di colonne.
Spazi dei nomi
struttura dello spazio dei nomi
Tavolo
Tabella, tutte le tabelle sono membri dello spazio dei nomi, ovvero la tabella deve appartenere a un determinato spazio dei nomi. Se non specificato, sarà nello spazio dei nomi predefinito.
Gruppo RegionServer
Uno spazio dei nomi contiene il gruppo RegionServer predefinito.
Autorizzazione
Le autorizzazioni e gli spazi dei nomi ci consentono di definire elenchi di controllo degli accessi (ACL).
Quota
Le quote possono imporre il numero di regioni che uno spazio dei nomi può contenere.
Principi dei dati HBase
Principio di lettura HBase
1) Il client accede prima a zookeeper, legge la posizione della regione dalla meta tabella, quindi legge i dati nella meta tabella. Il meta memorizza anche le informazioni sulla regione della tabella utente;
2) Trova le informazioni sulla regione corrispondente nella meta tabella in base allo spazio dei nomi, al nome della tabella e alla chiave di riga;
3) Trova il server regionale corrispondente a questa regione;
4) Trova la regione corrispondente;
5) Prima trova i dati da MemStore, in caso contrario, leggili da BlockCache;
6) Se BlockCache non è ancora disponibile, leggerlo dallo StoreFile (per ragioni di efficienza di lettura);
7) Se i dati vengono letti da StoreFile, non vengono restituiti direttamente al client, ma vengono prima scritti su BlockCache e quindi restituiti al client.
Processo di scrittura HBase
1) Il client invia una richiesta di scrittura a HregionServer;
2) HregionServer scrive i dati su HLog (log di scrittura anticipata). Per la persistenza e il recupero dei dati;
3) HregionServer scrive i dati in memoria (MemStore);
4) Feedback che il Client è stato scritto con successo.
Processo di svuotamento dei dati
1) Quando i dati MemStore raggiungono la soglia (il valore predefinito è 128 M, la vecchia versione è 64 M), i dati vengono scaricati sul disco rigido, i dati nella memoria vengono eliminati e i dati storici nell'HLog vengono eliminati;
2) E archivia i dati in HDFS;
3) Crea punti di riferimento in HLog.
processo di fusione dei dati
1) Quando il numero di blocchi di dati raggiunge 4, Hmaster avvia l'operazione di unione e Region carica i blocchi di dati localmente per l'unione;
2) Quando i dati uniti superano i 256 M, dividerli e assegnare le regioni divise a una diversa gestione HregionServer;
3) Quando HregionServer non funziona, dividere l'hlog su HregionServer, quindi assegnarlo a un HregionServer diverso da caricare e modificare .META.;
4) Nota: HLog verrà sincronizzato con HDFS.
Utilizzo integrato di hive e HBase
Integrato tramite hive-hbase-handler-1.2.2.jar
Crea una tabella Hive, associala alla tabella HBase e inserisci i dati nella tabella Hive influenzando la tabella HBase.
Una tabella hbase_emp_table è stata archiviata in HBase, quindi viene creata una tabella esterna in Hive per associare la tabella hbase_emp_table in HBase, in modo che possa utilizzare Hive per analizzare i dati nella tabella HBase.
Ottimizzazione HBase
Alta disponibilità (più Hmaster)
In HBase, Hmaster è responsabile del monitoraggio del ciclo di vita di RegionServer e del bilanciamento del carico di RegionServer, ad esempio Se Hmaster riattacca, l'intero cluster HBase entrerà in uno stato non integro e lo stato di funzionamento in questo momento non sarà lo stesso. Durerà troppo a lungo. Pertanto, HBase supporta la configurazione ad alta disponibilità di Hmaster.
pre-partizionato
Prepartizionamento manuale
crea 'staff1','info','partition1',SPLITS => ['1000','2000','3000','4000']
Rappresenta cinque partizioni [min,1000),[1000,2000),[2000,3000),[3000,4000),[4000,max]
Genera la pre-partizione della sequenza esadecimale
crea 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
Indica che l'esadecimale è diviso in 15 partizioni
Prepartizionamento secondo le regole impostate nel file
crea 'staff3','partition3',SPLITS_FILE => 'splits.txt'
Il contenuto di splits.txt è il seguente
aaaa bbbb cccc ddd
javaAPI crea la partizione
//Personalizza l'algoritmo per generare una serie di valori hash Hash e memorizzarli in un array bidimensionale byte[][] splitKeys = una funzione di valore hash //Crea un'istanza HBaseAdmin HBaseAdmin hAdmin = nuovo HBaseAdmin(HBaseConfiguration.create()); //Crea un'istanza HTableDescriptor HTableDescriptor tableDesc = nuovo HTableDescriptor(tableName); //Crea una tabella HBase con prepartizionamento tramite l'istanza HTableDescriptor e array bidimensionale di valori hash hAdmin.createTable(tableDesc, splitKeys);
rowkeydesign
Rowkey è l'identificatore univoco di una porzione di dati. È necessario progettare correttamente la rowkey in modo che sia distribuita uniformemente nell'area per evitare distorsioni dei dati.
1. Genera numeri casuali, hash e valori hash
ad esempio: RowKey originale è 1001 e dopo SHA1 diventa: dd01903921ea24941c26a48f2cec24e0bb0e8cc7 La rowKey originale era 3001 e dopo SHA1 è diventata: 49042c54de64a1e9bf0b33e00245660ef92dc7bd La rowKey originale era 5001 e dopo SHA1 è diventata: 7b61dec07e02c188790670af43e717f0f46e8913 Prima di fare ciò, generalmente scegliamo di estrarre campioni dal set di dati per determinare quale tipo di rowKey sottoporre ad hash come valore critico di ciascuna partizione.
2. Inversione della stringa
es: 20170524000001 convertito in 10000042507102
3. Concatenazione di stringhe
20170524000001_a12e 20170524000001_93i7
Ottimizzazione della memoria
HBase richiede molto sovraccarico di memoria durante il funzionamento. Dopotutto, la tabella può essere memorizzata nella cache. In genere, il 70% dell'intera memoria disponibile viene allocato all'heap Java di HBase. Tuttavia, non è consigliabile allocare una memoria heap molto grande, perché se il processo GC continua troppo a lungo, il RegionServer si troverà in uno stato non disponibile a lungo termine. In genere, 16~48G di memoria sono sufficienti. Se la memoria occupata dal framework è troppo elevata, risultando in una memoria di sistema insufficiente, anche il framework verrà trascinato a morte dai servizi di sistema.
Ottimizzazione di base
1. Consenti l'aggiunta di contenuti ai file HDFS
hdfs-sito.xml, hbase-sito.xml Proprietà: dfs.support.append Spiegazione: l'attivazione della sincronizzazione delle aggiunte HDFS può cooperare perfettamente con la sincronizzazione e la persistenza dei dati HBase. Il valore predefinito è vero.
2. Ottimizza il numero massimo di file aperti consentiti da DataNode
hdfs-sito.xml Proprietà: dfs.datanode.max.transfer.threads Spiegazione: HBase generalmente gestisce un numero elevato di file contemporaneamente, a seconda del numero e delle dimensioni del cluster e delle azioni sui dati. Impostato su 4096 o superiore. Valore predefinito: 4096
3. Ottimizza il tempo di attesa delle operazioni sui dati con elevata latenza
hdfs-sito.xml Proprietà: dfs.image.transfer.timeout Spiegazione: Se il ritardo per una determinata operazione di dati è molto elevato e il socket deve attendere più a lungo, si consiglia di farlo Questo valore è impostato su un valore maggiore (predefinito 60000 millisecondi) per garantire che il socket non sia scaduto.
4. Ottimizza l'efficienza della scrittura dei dati
mapred-site.xml Attributi: mapreduce.map.output.compress mapreduce.map.output.compress.codec Spiegazione: L'abilitazione di questi due dati può migliorare notevolmente l'efficienza di scrittura dei file e ridurre i tempi di scrittura. Modificare il primo valore dell'attributo in true e modificare il secondo valore dell'attributo in: org.apache.hadoop.io.compress.GzipCodec o altri metodi di compressione
5. Impostare il numero di ascoltatori RPC
hbase-sito.xml Proprietà: hbase.regionserver.handler.count Spiegazione: Il valore predefinito è 30, utilizzato per specificare il numero di listener RPC. Può essere regolato in base al numero di richieste client. Quando sono presenti molte richieste di lettura e scrittura, aumentare questo valore.
6. Ottimizza la dimensione del file HStore
hbase-sito.xml Proprietà: hbase.hregion.max.filesize Spiegazione: il valore predefinito è 10737418240 (10 GB) Se è necessario eseguire attività MR HBase, è possibile ridurre questo valore perché una regione corrisponde a un'attività della mappa. Se una singola regione è troppo grande, lo sarà anche il tempo di esecuzione dell'attività della mappa lungo. Il significato di questo valore è che se la dimensione dell'HFile raggiunge questo valore, la regione verrà divisa in due Hfile.
7. Ottimizza la cache del client hbase
hbase-sito.xml Proprietà: hbase.client.write.buffer Spiegazione: Utilizzato per specificare la cache del client HBase L'aumento di questo valore può ridurre il numero di chiamate RPC, ma consumerà più memoria e viceversa. Generalmente dobbiamo impostare una certa dimensione della cache per ridurre il numero di RPC.
8. Specificare scan.next per eseguire la scansione del numero di righe ottenute da HBase
hbase-sito.xml Proprietà: hbase.client.scanner.caching Spiegazione: Utilizzato per specificare il numero predefinito di righe ottenute dal metodo scan.next Maggiore è il valore, maggiore è il consumo di memoria.
9. meccanismo a filo, compatto e diviso
Quando il MemStore raggiunge la soglia, i dati nel Memstore vengono scaricati nello Storefile. Il meccanismo compatto unisce i piccoli file scaricati in uno Storefile di grandi dimensioni. split significa che quando la Regione raggiunge la soglia, la Regione troppo grande verrà divisa in due.
Attributi coinvolti: Ovvero: 128M è la soglia predefinita di Memstore hbase.hregion.memstore.flush.size: 134217728 Cioè: la funzione di questo parametro è di svuotare tutti i memstore di una singola HRegion quando la somma delle dimensioni di tutti i Memstore in una singola HRegion supera il valore specificato. Il flush di RegionServer viene elaborato in modo asincrono aggiungendo la richiesta a una coda per simulare il modello di produzione e consumo. C'è un problema qui. Quando la coda non ha tempo da consumare e genera un grande arretrato di richieste, potrebbe causare un improvviso aumento della memoria e, nel peggiore dei casi, attivare OOM. hbase.regionserver.global.memstore.upperLimit: 0.4 hbase.regionserver.global.memstore.lowerLimit: 0,38 Cioè: quando la quantità totale di memoria utilizzata da MemStore raggiunge il valore specificato da hbase.regionserver.global.memstore.upperLimit, più MemStore verranno scaricati nel file. L'ordine di svuotamento di MemStore viene eseguito in ordine decrescente di dimensione fino al la memoria utilizzata da MemStore è stata svuotata. Meno del limite inferiore
filtro fioritura
sbattere le palpebre
Datix1
presto
Oozie
risorse di dati
stivale
Domande per l'intervista su gamberetti e cuore di maiale
Linux
Autointroduzione
1 minuto per presentarti: Nella mia precedente azienda, ho creato principalmente la piattaforma dati China Continent Insurance, che accedeva principalmente a Xiaomi, JD.com, Che300, ai dati assicurativi generati internamente e relativi alle banche della Continent Insurance Company. Il data warehouse era suddiviso in molti argomenti, inclusi gli argomenti relativi agli ordini , Argomenti relativi ai clienti, argomenti relativi ai reclami, argomenti scaduti, argomenti di approvazione e argomenti relativi ai reclami; l'attività che sviluppo riguarda argomenti relativi agli ordini, argomenti utente e argomenti scaduti. Ciò che faccio al lavoro è correlato alla modellazione del data warehouse, all'elaborazione dei dati e al monitoraggio della qualità dei dati e calcoli degli indicatori di argomento. ;Le principali tecnologie applicate includono hive, spark, hue, impala, hadoop, infomatical, ecc.; la piattaforma aggiunge circa 1 TB di dati ogni giorno.
Introduzione aziendale