心智圖資源庫 23大數據知識點以及面試總結(1)
簡潔模板,包含java基礎、 hadoop、 hive、數倉理論、 impala、 資料湖理論等內容。
編輯於2024-01-18 15:05:07Microbiologia medica, Infezioni batteriche e immunità riassume e organizza i punti di conoscenza per aiutare gli studenti a comprendere e ricordare. Studia in modo più efficiente!
La teoria cinetica dei gas rivela la natura microscopica dei fenomeni termici macroscopici e le leggi dei gas trovando la relazione tra quantità macroscopiche e quantità microscopiche. Dal punto di vista del movimento molecolare, vengono utilizzati metodi statistici per studiare le proprietà macroscopiche e modificare i modelli di movimento termico delle molecole di gas.
Este é um mapa mental sobre uma breve história do tempo. "Uma Breve História do Tempo" é um trabalho científico popular com influência de longo alcance. Ele não apenas introduz os conceitos básicos da cosmologia e da relatividade, mas também discute os buracos negros e a expansão. Do universo. questões científicas de ponta, como inflação e teoria das cordas.
Microbiologia medica, Infezioni batteriche e immunità riassume e organizza i punti di conoscenza per aiutare gli studenti a comprendere e ricordare. Studia in modo più efficiente!
La teoria cinetica dei gas rivela la natura microscopica dei fenomeni termici macroscopici e le leggi dei gas trovando la relazione tra quantità macroscopiche e quantità microscopiche. Dal punto di vista del movimento molecolare, vengono utilizzati metodi statistici per studiare le proprietà macroscopiche e modificare i modelli di movimento termico delle molecole di gas.
Este é um mapa mental sobre uma breve história do tempo. "Uma Breve História do Tempo" é um trabalho científico popular com influência de longo alcance. Ele não apenas introduz os conceitos básicos da cosmologia e da relatividade, mas também discute os buracos negros e a expansão. Do universo. questões científicas de ponta, como inflação e teoria das cordas.
大數據知識點以及面試總結
java基礎
基本資料類型
byte,boolean 1個位元組, char,short 2字節, int,float 4個位元組, long,double 8個位元組
例外
Throwable
Error
災難性的致命錯誤,程式不可控,例如堆疊溢出
Exception
運行時異常
空指標異常,陣列下標越界
編譯時異常(非運行時異常)
IOException、ClassNotFoundException
多態性
資料結構
常見的資料結構(8種)
陣列
查詢修改快,增刪慢
儲存區間連續,記憶體佔用嚴重,空間複雜度大
優點:隨機讀取和修改快,原因是數組是連續的(隨機訪問性強,查找速度快)
缺點:插入和刪除效率低,因插入資料後這個位置後面的資料都要在記憶體中移動,且大小不固定不易動態擴展
鍊錶
增刪快,找慢
儲存空間離散,佔用記憶體寬鬆,空間複雜度小
優點:插入刪除快,記憶體使用率高,沒有固定大小,擴充靈活
缺點:不能隨機查找,每次都是從第一個開始,查詢效率低
哈希表
增刪查找快,資料雜湊對儲存空間浪費
佇列
先進先出,尾部插入和頂部取出快,其他訪問都慢
堆疊
先進後出,頂部取出和插入快,除頂部元素外其他元素訪問都慢
紅黑樹
增刪查找都快,演算法結構複雜(詳情見二元樹)
二元樹
增刪查找都快,刪除演算法結構複雜
時間複雜度最好情況是O(logn),最壞O(n)
特殊二元樹
滿叉樹
若二元樹有的層數為K,且節點是(2^K-1)個,即為滿二元樹(如後面圖所示)
子主題 1
完全二元樹
二元樹層數為h層,(1~h-1)節點個數達到了最大,且h層所有節點都集中在左邊(如後面圖所示)
二元查找樹
左子樹上的值都比根節點小,右子數上的值都比根節點打,中序遍歷一定是從小到大排序的(如圖)
紅黑樹
平衡二元樹是空樹或左右兩顆子樹高度差不會超過1,且左右兩顆子樹都是平衡二元樹,紅黑樹一定是二元查找樹(如圖所示)
特點:
時間複雜度
插入刪除插入的最壞的時間複雜度是O(log N)
高度logN
節點非黑即紅
根節點一定是黑的
如果一個節點是紅的子節點一定是黑的
對於任意節點而言,其到葉節點路徑上黑節點數一定相同
每個葉子節點(葉節點即樹尾端NULL指標或NULL節點)都是黑色的
最優二元樹(哈夫曼樹)
樹的帶權路徑長度達到最小
B樹
平衡多路查找樹(查找路徑不只兩個),不同於二元樹,是一種多叉樹,O(log n)
B 樹
是一種自平衡樹資料結構,它保持資料排序;在進行搜尋、順序存取、插入和刪除的複雜度是O(log n)且B 樹只在葉子節點中存放數據,所以消除了一些B樹的缺陷。非葉子節點只保存索引,不保存實際的資料,資料都保存在葉子節點中。 O(nlogn)
樹的高低度,支援範圍查找
Mysql為甚用B 數
磁碟IO更少,支援範圍查找
B 樹和B樹的差別
1)B 樹所有資料都存在葉子節點 2)B 樹的葉子節點有雙向指標,方便範圍查找,且葉節點上的資料從小到大順序連接
點陣圖
節省儲存空間,不方便描述複雜的資料關係
集合
遍歷集合問題
用迭代器遍歷集時合改變集合中的物件(增加刪除修改)會拋出異常
Collection
List
ArrayList
特點:儲存元素先後有序,查詢快增刪慢
底層數組實現,容量能自動增長,預設擴容擴容為原來的1.5倍
線程不安全,單線程可用,多線程不建議,可以使用Collections.syncnizedArrayList(List l)傳回一個線程安全的ArrayList
底層大量呼叫Arrays.copyof(),System.arraycopy()擴充ဩ
Vector
底層數組實現,synchronized關鍵字修飾,執行緒安全,效率低,初始化預設容量10,預設擴容自增1倍
LinkedList
雙向鍊錶結構實現
查詢慢增刪快
LinkedList,ArrayList,Vector異同:
Set
SortedSet
TreeSet
底層紅黑樹實現,無序集合,線程安全
HashSet
子類別:LinkedHashSet
HashSet是由HashMap實現,所以資料結構是數組鍊錶紅黑樹,允許null,不重複,無序,多線程不安全,按照hash演算法存儲元素,查找刪除訪問性能高,用Collections.synchronizedHashSet()返回一個線程安全的HashSet
只能透過迭代器存取元素
queue
Map
HashMap
HashMap
HashMap底層使用陣列 鍊錶 紅黑樹實現
當數組中的一個鏈的物件數達到了8個,這個鏈會轉換為紅黑樹,紅黑樹節點低於6個又會轉換為鍊錶
Hash初始預設容量為16,HashMap中的儲存元素超過 負載因子*當前容量 個數時就會進行擴容,變為原來的2倍,然後重新計算每個元素在陣列的位置
線程不安全,可以使用ConcurrentHashMap
ConcurrentHashMap
jdk1.8
採用鍊錶 紅黑樹 node數組 cas(樂觀鎖) synchronized實現
子類別
linkedHashMap
HashTable
子類別
Properties
線程安全
是透過給整個散列表加鎖的方式來確保線程安全,這種方式保證了線程安全,但是並發執行效率低下
SortedMap
TreeMap
設計模式
單例模式,常見3種
懶漢模式,在第一次呼叫的時候就實例化
惡漢模式,類別初始化的時候已經自行實例化,線程安全
登記模式
代理模式
靜態代理
子主題 1
動態代理
jdk動態代理
CGlib
工廠模式
建造者模式
適配器模式
迭代器模式
常用類別
String
代表字串
String用final修飾的類別不可被繼承,代表不可變的字元序列
String物件的字元內容儲存在一個字元數組value[]中
String常數與常數拼接,則在方法區常數池中,且常量池中不會存在相同內容的常數;常數與任何變數拼接則存在堆中
JVM
javac
一種編譯器,將java語言編譯成jvm能夠辨識的二進位文件
組件
jvm記憶體劃分
程式計數器
是一塊很小的記憶體空間,是目前執行緒所執行的程式碼指示器,透過改變計數器的值,來選取下一條需要執行的字節碼指令;每個執行緒都獨有一個程式計數器,執行緒之間沒有影響;唯一不會發生OOM的區域;如果執行緒正在執行java方法,則程式計數器記錄的是正在執行的虛擬機器字節碼指令的位址,若執行的是本機方法則計數器是空。
java虛擬機器棧
線程私有,主要儲存局部變量,棧幀,操作數棧,動態鏈接,方法出口等信息
本地方法堆疊
呼叫作業系統類別庫
堆疊
執行緒共享,基本所有的物件基本上都在java堆中,垃圾回收的主要區域
方法區
線程共享,主要儲存類信息,常量,靜態變量,及編譯後的代碼數據
運轉時常數池
方法區的一部分。儲存字面值和符號引用
多執行緒
程式
為完成特定任務用某種語言編寫的一組指令的集合,即指一段靜態的程式碼,靜態對象
行程
程序執行一次的過程或正在執行的程序,是一個動態的過程,有他自身的產生、存在和消亡的過程(生命週期)
特點:
程式是靜態的,進程是動態的
進程是最小的資源分配單位,系統運行時會為每個進程分配不同的記憶體區域
執行緒
進程進一步細分為線程,線程就是程式的一條執行路徑
特點:
若一個行程同時執行多個線程,就是支援多線程的
執行緒作為調度和執行單位,每個執行緒都有獨立的堆疊和程式計數器(pc),執行緒切換的開銷小
一個進程中的多個線程共享相同的記憶體單元/記憶體位址空間->他們從同一堆中分配物件可以存取相同的物件和變數。這就使得線程間的通訊更簡單、更有效率。但多個執行緒之間的共享會帶來安全性問題
並行和並發
平行:
兩個或兩個以上的事件同時發生
並行:
兩個或兩個以上的事件在同一時間間隔發生
線程的創建
Thread
繼承Thread類別重寫run方法實現,run方法裡的程式碼是執行緒體,透過實例化繼承Thread的子類別呼叫start方法啟用執行緒呼叫run方法;Thread實作了Runnable介面
Thread常見方法
(1)void start(): 啟動線程,並執行物件的run()方法 (2)run(): 執行緒在被調度時執行的操作 (3)String getName(): 傳回線程的名稱 (4)void setName(String name):設定該執行緒名稱 (5)static Thread currentThread(): 傳回目前執行緒。在Thread子類別中就是this,通常用於主執行緒和Runnable實作類 (6)static void yield():線程讓步暫停目前正在執行的線程,把執行機會讓給優先權相同或更高的線程,若佇列中沒有同優先權的線程,忽略此方法 (7)join() :當某個程式執行流程中呼叫其他執行緒的join() 方法時,呼叫執行緒將被阻塞,直到join() 方法加入的join 執行緒執行完為止,低優先權的執行緒也可以獲得執行 (8)static void sleep(long millis):(指定時間:毫秒)令當前活動線程在指定時間段內放棄對CPU控制,使其他線程有機會被執行,時間到後重排隊。拋出InterruptedException異常 (9)stop(): 強制執行緒生命期結束,不建議使用 (10)boolean isAlive():返回boolean,判斷線程是否還活著
執行緒優先權:
執行緒建立時繼承父執行緒的優先權
低優先權只是獲得調度的機率低,並非一定是在高優先權執行緒之後才被調用
1、執行緒的優先等級 MAX_PRIORITY:10 MIN _PRIORITY:1 NORM_PRIORITY:5 2、 涉及的方法 getPriority() :傳回執行緒優先值 setPriority(int newPriority) :改變執行緒的優先權
執行緒狀態Thread.State
新建
就緒
運行
阻塞
死亡
Runnable
1) 定義子類,實作Runnable介面。 2) 子類別中重寫Runnable介面中的run方法。 3) 透過Thread類別含參建構器建立線程物件。 4) 將Runnable介面的子類別物件作為實際參數傳遞給Thread類別的建構器中。 5) 呼叫Thread類別的start方法:開啟線程,呼叫Runnable子類別介面的run方法。
callable
callable則可以透過使用ExecutorService執行或作為FeatureTask的參數
public class MyCallable implements Callable<T> { @Override public T call() throws Exception { // 在這裡定義可被呼叫的程式碼 } } MyCallable myCallable = new MyCallable(); ExecutorService executor = Executors.newSingleThreadExecutor(); Future<T> future = executor.submit(myCallable); T result = future.get();
Callable<Process> task = () -> { // 執行非同步任務 Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("/Users/mac/Desktop/qc-java-runtime/src/main/java/com/qc/runtime/shell.sh"); return process; }; // 將Callable包裝成FutureTask FutureTask<Process> future = new FutureTask<>(task); // 啟動新執行緒來執行非同步任務 new Thread(future).start(); // 取得非同步任務的結果 Process result = future.get(); System.out.println(result);
鎖
對於並發工作,你需要某種方式來防止兩個任務存取相同的資源(其實就是共享資源競爭)。 防止這種衝突的方法就是當資源被一個任務使用時,在其上加鎖。第一個存取某項資源的任務必須鎖定這項資源,使其他任務在其被解鎖之前,就無法存取它了,而在其被解鎖之時,另一個任務就可以鎖定並使用它了。
Synchronized
任意物件都可以當作同步鎖。所有物件都自動含有單一的鎖(監視器)。 同步方法的鎖:靜態方法(類別名稱.class)、非靜態方法(this) 同步程式碼區塊:自己指定,很多時候也是指定為this或類別名稱.class
死鎖
不同的執行緒分別佔用對方所需的同步資源不放棄,都在等對放棄自己需要的資源,就形成了死鎖
出現死鎖後,不會出現異常,不會提示,只是所有執行緒處於阻塞狀態,無法繼續
鎖的釋放
目前執行緒的同步方法、同步程式碼區塊執行結束。
目前執行緒在同步程式碼區塊、同步方法中遇到break、return終止了該程式碼區塊、該方法的繼續執行。
目前執行緒在同步程式碼區塊、同步方法中出現了未處理的Error或Exception,導致例外結束。
當前執行緒在同步程式碼區塊、同步方法中執行了執行緒物件的wait()方法,當前執行緒暫停,並釋放鎖定。
網路通訊協定
OSI模型(協定)
模式過於理想化,未能在網路推廣
OSI分層
應用層
表示層
會話層
傳輸層
網路層
資料鏈路層
物理層
TCP/IP模型(協定)
事實上的國際標準
TCP/IP分層
應用層
傳輸層
網路層
物理 資料鏈結層
兩種模型對比
數據封裝
資料拆解
ip和連接埠
網路傳輸層重要協定UDP和TCP
UDP(用戶資料報協定)
1. 將資料、來源、目的封裝成資料包,不需要建立連接 2.每個資料報的大小限制在64K內 3.發送不管對方是否準備好,接收方收到也不確認,故是不可靠的 4.可以廣播發送 5.發送資料結束時無需釋放資源,開銷小,速度快
TCP(傳輸控制協定)
1.使用TCP協定前,須先建立TCP連接,形成傳輸資料通道 2.傳輸前,採用「三次握手」方式,點對點通信,是可靠的 3.TCP協定進行通訊的兩個應用進程:客戶端、服務端。 4.在連線中可進行大數據量的傳輸 5.傳輸完畢,需釋放已建立的連接,效率低
三次握手(建立連線)
1.客戶端發送建立TCP連接的請求報文,其中報文中包含seq序號,是由發送端隨機產生的,並且將報文中的SYN(synchronize)字段置為1,表示需要建立TCP連接。 (SYN=1,seq=x,x為隨機產生數值); 2.服務端回覆客戶端發送的TCP連線請求報文,其中包含seq序號,是由回複端隨機產生的,並且將SYN置為1,而且會產生ACK字段,ACK字段數值是在客戶端發送過來的序號seq的基礎上加1進行回复,以便客戶端收到訊息時,知曉自己的TCP建立請求已得到驗證。 (SYN=1,ACK=x 1,seq=y,y為隨機產生數值)這裡的ack加1可以理解為是確認和誰建立連結; 3.客戶端收到服務端發送的TCP建立驗證請求後,會使自己的序號加1表示,並且再次回覆ACK驗證請求,在服務端發過來的seq上加1進行回覆。 (SYN=1,ACK=y 1,seq=x 1)。
四次揮手(斷開連接)
1.客戶端發送斷開TCP連接請求的報文,其中報文中包含seq序號,是由發送端隨機產生的,並且還將報文中的FIN字段置為1,表示需要斷開TCP連接。 (FIN=1,seq=x,x由客戶端隨機產生); 2.服務端會回覆客戶端發送的TCP斷開請求報文,其包含seq序號,是由回复端隨機產生的,而且會產生ACK字段,ACK字段數值是在客戶端發過來的seq序號基礎上加1進行回复,以便客戶端收到訊息時,知曉自己的TCP斷開請求已經得到驗證。 (FIN=1,ACK=x 1,seq=y,y由服務端隨機產生); 3.服務端在回復完客戶端的TCP斷開請求後,不會馬上進行TCP連線的斷開,服務端會先確保斷開前,所有傳輸到A的資料是否已傳輸完畢,一旦確認傳輸資料完畢,就會回覆封包的FIN欄位置1,並且產生隨機seq序號。 (FIN=1,ACK=x 1,seq=z,z由服務端隨機產生); 4.客戶端收到服務端的TCP斷開請求後,會回覆服務端的斷開請求,包含隨機產生的seq字段和ACK字段,ACK字段會在服務端的TCP斷開請求的seq基礎上加1,從而完成服務端請求的驗證回覆。 (FIN=1,ACK=z 1,seq=h,h為客戶端隨機產生) 至此TCP斷開的4次揮手過程完畢。
子主題 3
網路套接字Socket
ip與連接埠的組合形成套接字socket
網路通訊的本質:socket之間的通信
分類
流套接字
使用TCP提供可依賴的位元組流服務
基於TCP的Socket程式設計步驟
客戶端
1. 建立 Socket:根據指定服務端的 IP 位址或連接埠號建構 Socket 類別物件。若伺服器端回應,則建立用戶端到伺服器的通訊線路。若連線失敗,會出現異常。 2.開啟連接到 Socket 的輸入/出流: 使用getInputStream()方法取得輸入流,使用getOutputStream()方法取得輸出流,進行資料傳輸 3. 依照一定的協定對 Socket 進行讀取/寫入操作:透過輸入流讀取伺服器放入線路的資訊(但不能讀取自己放入線路的資訊),透過輸出流將資訊寫入執行緒。 4. 關閉 Socket:斷開客戶端到伺服器的連接,釋放線路
伺服器端
1.呼叫 ServerSocket(int port) :建立一個伺服器端套接字,並綁定到指定連接埠上。用於監聽客戶端的請求。 2.呼叫 accept():監聽連接請求,如果客戶端請求連接,則接受連接,返回通信套接字物件。 3.呼叫 該Socket類別物件的 getOutputStream() 和 getInputStream ():取得輸出流和輸入流,開始網路資料的傳送和接收。 4.關閉ServerSocket和Socket物件:客戶端存取結束,關閉通訊套接字。
資料報套接字
使用UDP提「供盡力而為」的數據服務
基於UDP的網路編程
1.類別 DatagramSocket 和 DatagramPacket 實作了基於 UDP 協定網路程式。 2.UDP資料封包透過資料報套接字 DatagramSocket 發送和接收,系統不保證UDP資料封包一定能夠安全送到目的地,也無法確定何時可以抵達。 3. DatagramPacket 物件封裝了UDP資料報,在資料報中包含了發送端的IP位址和連接埠號碼以及接收端的IP位址和連接埠號碼。 4.UDP協定中每個資料封包都給出了完整的位址訊息,因此無須建立發送方和接收方的連線。如同發快遞包裹一樣。
流程
1. DatagramSocket與DatagramPacket 2. 建立發送端,接收端 3. 建立資料包 4. 呼叫Socket的傳送、接收方法 5. 關閉Socket 注意: 發送端與接收端是兩個獨立的運行程序
URL
反射
概念
JAVA機制反射是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用物件的方法的功能稱為java語言的反射機制。
取得class類別的實例
1)前提:若已知具體的類,透過類別的class屬性獲取,此方法最為安全可靠,程式效能最高 例:Class clazz = String.class; 2)前提:已知某個類別的實例,呼叫該實例的getClass()方法取得Class對象 實例:Class clazz =“www.atguigu.com”.getClass(); 3)前提:已知一個類別的全類別名,且該類別在類別路徑下,可通過Class類別的靜態方 法forName()獲取,可能拋出ClassNotFoundException 實例:Class clazz =Class.forName(“java.lang.String”); 4)其他方式(不做要求) ClassLoader cl = this.getClass().getClassLoader(); Class clazz4 = cl.loadClass(“類別的全類別名稱”);
class類別的常用方法
有Class物件的類型
(1)class: 外部類,成員(成員內部類,靜態內部類),局部內部類,匿名內部類 (2)interface:接口 (3)[]:數組 (4)enum:枚舉 (5)annotation:註@interface (6)primitive type:基本資料類型 (7)void
例子
Class c1 = Object.class; Class c2 = Comparable.class; Class c3 = String[].class; Class c4 = int[][].class; Class c5 = ElementType.class; Class c6 = Override.class; Class c7 = int.class; Class c8 = void.class; Class c9 = Class.class; int[] a = new int[10]; int[] b = new int[100]; Class c10 = a.getClass(); Class c11 = b.getClass();
子主題 11
hadoop
hdfs
hdfs優缺點
優點
容錯性(複製機制)
適合處理大數據,能處理pb層級的數據,能處理數百萬數量的文件
可在廉價機器上部署
缺點
不適合低延時資料訪問
無法有效率地對大量小檔案進行存儲,namenode的記憶體是有限的且小檔案數量過多尋址時間會大於檔案處理時間
不支援並發寫入,檔案隨機修改
hdfs架構組成
namenode
管理hdfs的名稱空間
配置副本策略
管理block區塊的映射訊息
處理客戶端的請求
datanode
儲存資料塊
執行資料區塊的讀寫請求
client
文件切分,上傳文件時將文件切分成block塊
與namenode交互獲取文件位置信息
與datanode交互,讀取或寫入數據
client提供指令來管理hdfs
client提供指令存取hdfs,例如對hdfs的增刪查操作
secondaryNamenode
輔助nameNode工作,合併fsimage和edits文件,並且推送給nameNode
緊急情況下,輔助恢復Namenode
hdfs檔案塊大小
hadoop1.x 64M,hadoop2.x/3.x是128M
尋址時間是傳輸時間的1%時是最佳狀態
hdfs檔案塊的大小為什麼不能太大也不能太小
1.太小,會增加尋址時間
2.區塊太大資料傳輸時間會明細大於定位這個開始區塊位置的時間,導致程式處理這個資料區塊的時候非常慢
shell
上傳
hadoop fs -moveFromLocal 本地檔案 hdfs目錄 (本地剪切複製到hdfs)
hadoop fs -copyFromLocal 本機檔案 hdfs目錄 (本地複製到hdfs)
hadoop fs -put 本機檔案 hdfs目錄 (本地複製一份上傳到hdfs)
hadoop fs -appendToFile 本機檔案 hdfs檔案 (本地檔案資料追加到hdfs檔案結尾)
下載
hadoop fs -copyToLocal hdfs檔案 本地目錄 (檔案複製到本機)
hadoop fs -get hdfs檔案 本機目錄 (檔案複製到本機)
操作hdfs
hadoop fs -ls 目錄 (展示目錄下資訊)
hadoop fs -mkdir 目錄 (建立目錄)
-chgrp、-chmod、-chown (修改文件所屬權)
hadoop fs -cat 檔案 (顯示檔案內容)
hadoop fs -cp 檔案 目錄 (把檔案複製到其他目錄)
hadoop fs -tail 檔案 (顯示檔案末端的1kb資料)
hadoop fs -rm 刪除檔案或資料夾
hadoop fs -rm -r 目錄 ( 遞歸刪除目錄以及目錄下的內容)
hadoop fs -du
hadoop fs -setrep (設定副本數量,只記錄在namenode中,datanode數量小於設定的副本數量,那麼副本數只會有datanode那麼多)
hdfs api操作:透過FileSystem物件即可
hdfs讀寫流程
讀流程
子主題 1
寫流程
圖解
子主題 3
hive
概念
hive是基於hadoop的數倉管理工具,將結構化資料對應成一張表,並且提供類別sql的查詢功能
原理
本質 將HQL轉換成mr任務
metastore
元資料:包括表名、表所屬的資料庫(預設為default)、表格的擁有者、列/分區欄位、表格的類型(是否外部表)、表格的資料所在目錄等
client
提供jdbc/ODBC介面,webUI訪問,介面存取等
driver
解析器SQL Parser
將sql轉換成抽象語法樹AST,這一步驟一般用第三方工具完成,例如antrl;對SAT進行語法分析,檢查sql語意是否正確,表,列名是否存在等
編譯器 Physical Plan
將AST轉換成邏輯執行計劃
優化器 Query Optimzer
對邏輯執行計劃進行最佳化
執行器 Execution
邏輯回寫計劃轉換成可以運行的物理執行計劃。對hive來說就是轉換成mr/tez/spark任務
資料類型
基本資料類型
hive的String類型理論上可以存2G字符
集合資料類型
集合資料類型建表語句
create table test( name string, friends array<string>, children map<string, int>, address struct<street:string, city:string> ) row format delimited fields terminated by ',' //列分隔符 collection items terminated by '_' //MAP STRUCT 和 ARRAY 的分隔符號(資料分割 符號) map keys terminated by ':' //map kye與value的分隔符 lines terminated by ' '; //行分隔符
類型轉換
hive的原子資料型態是會進行隱式轉換的,類似java的轉換。例如某表達式使用INT 類型,TINYINT 會自動轉換為INT 類型,但是Hive 不會進行反向轉化,例如,某表達式使用TINYINT 類型,INT 不會自動轉換為TINYINT 類型,它會回傳錯誤,除非使用CAST 操作
隱含轉換規則
1.任何整數類型都可以隱含地轉換為範圍更廣的類型,如 TINYINT 可以轉 換成 INT,INT 可以轉換成 BIGINT。
2.所有整數類型、FLOAT 和 STRING 類型都可以隱含地轉換成 DOUBLE。 (String與double隱式轉換容易造成資料傾斜)
3.TINYINT、SMALLINT、INT 都可以轉換成 FLOAT。
4.BOOLEAN 類型不可以轉換為任何其它的類型。
DDL
建立表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path] [TBLPROPERTIES (property_name=property_value, ...)] [AS select_statement]
解釋
(1)CREATE TABLE 建立一個指定名字的表。如果相同名字的表已經存在,則拋出異常;使用者可以用 IF NOT EXISTS 選項來忽略這個異常。 (2)EXTERNAL 關鍵字可以讓使用者建立一個外部表,在建表的同時可以指定一個指向實際資料的路徑(LOCATION),在刪除表的時候,內部表的元資料和資料會被一起刪除,而外部表只刪除元數據,不刪除數據。 (3)COMMENT:為表格和列新增註解。 (4)PARTITIONED BY 建立分區表 (5)CLUSTERED BY 建立分桶表 (6)SORTED BY 不常用,對桶中的一個或多個列另外排序 (7)ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)] 用戶在建表的時候可以自訂 SerDe 或使用自帶的 SerDe。如果沒有指定 ROW FORMAT 或 ROW FORMAT DELIMITED,將會使用自帶的 SerDe。在建表的時候,使用者還需要為表指定列,使用者在指定表的列的同時也會指定自訂的 SerDe,Hive 透過 SerDe 的確 定表的具體的列的資料。 SerDe 是 Serialize/Deserilize 的簡稱, hive 使用 Serde 進行行物件的序列與反序列化。 (8)STORED AS 指定儲存檔案類型常用的儲存檔案類型:SEQUENCEFILE(二進位序列檔案)、TEXTFILE(文字)、RCFILE(列式儲存格式檔案)如果檔案資料是純文本,可以使用 STORED AS TEXTFILE。如果資料需要壓縮,使用 STORED AS SEQUENCEFILE。 (9)LOCATION :指定表在 HDFS 上的儲存位置。 (10)AS:後面跟著查詢語句,根據查詢結果建立表格。 (11)LIKE 允許使用者複製現有的表結構,但不複製資料。
分區表
分區表的本質是對應hdfs上的一個資料夾,hive中的分區就是分目錄
DML
load
load data [local] inpath '/opt/module/datas/student.txt' [overwrite] into table student [partition (partcol1=val1,…)];
insert
基本插入
insert into(overwrite) table ...
多表插入
from tableName insert into table t1 .... select .... from tableName, insert into table t2 .... select .... from tableName
查詢建表
create bale tableName as select.....
上傳資料建表
1.上傳資料到 hdfs 上
2.建立表,並指定在 hdfs 上的位置
import數據到HIve中
注意:先用 export 匯出後,再將資料匯入。
import table student2 partition(month='201709') from '/user/hive/warehouse/export/student';
Truncate刪除表中數據
只能刪除管理表,不能刪除外部表中的數據
常用函數
max
min
sum
avg
count
排序
全域排序
order by 全域排序,只有一個reducer,資料量大的時候效率極低,資料量小效率高
分區排序
distribute by 類似於mr任務中的自訂分區器;distribute by的規則是根據分區字段的hash碼對reducer個數進行模除以後,餘數相同的進入同一個分區
局部排序
sort by 每個reducer內部的排序,全域無序,常與distribute by搭配使用,distribute by在前sort by在後
cluster by
當distribute by sort by 一起使用且欄位相同升序時可替代,cluster by 不能指定排序規則為 ASC 或 DESC。
分區,分桶
分桶
分桶必須開啟配置 set hive.enforce.bucketing=true;
建立分桶表
分桶表插入資料跟正常表插入資料無異
分桶規則
分桶字段求hash模除分桶數取餘的方式決定資料在哪個桶中
分桶和分區區別
分區針對的是資料的儲存路徑即資料夾;分桶針對的是資料檔案
分桶抽樣調查
文法
TABLESAMPLE(BUCKET x OUT OF y) 。
分割區
子主題
行列互相轉換
行轉列
CONCAT(string A/col, string B/col…)
CONCAT_WS(separator, str1, str2,...)
COLLECT_SET(col)
函數說明
例子
sql實現
列轉行
函數說明
例子
sql實現
視窗函數
OVER()
current row
目前行
n perceding
往前n行
n following
往後n行
UNBOUNDED
起點
unbounded perceding 表示從前面的起點
unbounded following 表示到後面的終點
LAG(col,n,default_val)
往前第n行
lead(col,n,default_val)
往後第n行
NTILE(n)
把有序分割區中的行分發到指定資料的群組中,各個組有編號,編號從 1 開始,對於每一行,NTILE 傳回此行所屬的群組的編號。注意:n 必須為 int 型別。
例子
數據
需求及實現
1.查詢 2017 年 4 月份購買過的顧客及總人數
2.查詢顧客的購買明細及每月購買總額
3.上述的場景,要將 cost 依照日期進行累加
4.查詢每位顧客上次的購買時間
5.查詢前 20%時間的訂單信息
rank
排序相同時會重複,總數不變
dense_rank
排序相同是不會重複,總數會減少
row_number
會依序計算
例子
函數
內建函數
自訂函數
udf(User-Defined-Function)
特點:一進一出
程式設計步驟
1.繼承類別 org.apache.hadoop.hive.ql.UDF
2.需要實作 evaluate 函數;evaluate 函數支援重載;
3.在 hive 的命令列視窗建立函數
1.上傳jar
add jar linux_jar_path
2.創建function
create [temporary] function [dbname.]function_name AS class_name;
4.在 hive 的命令列視窗刪除函數
Drop [temporary] function [if exists] [dbname.]function_name;
注意:UDF 必須要有回傳類型,可以傳回 null,但是回傳類型不能為 void;
udaf(User-Defined Aggregation Function)
多進一出
聚合函數
udtf(User-Defined Table-Generating Functions)
一進多出
lateral view explode()
壓縮和儲存
hive常用壓縮和存儲
hive常用parquet檔案格式;壓縮選用lzo或snappy
壓縮
壓縮格式表
壓縮性能比較
壓縮參數設定
儲存
hive常見的文件格式
textFile、parquet、orc、sequencefile
文件格式分類
行儲存
特點
查詢滿足條件的一整行資料的時候,列存儲則需要去每個聚集的字段找到對應的每個列的值,行存儲只需要找到其中一個值,其餘的值都在相鄰地方,所以此時行儲存查詢的速度更快。
textfile
預設格式,資料不做壓縮,磁碟開銷大,資料解析開銷大。
sequenceFile
列儲存
特點
因為每個字段的數據聚集存儲,在查詢只需要少數幾個字段的時候,能大大減少讀取的數據量;每個字段的數據類型一定是相同的,列式存儲可以針對性的設計更好的設計壓縮演算法。
parquet
orc
組成
orc檔案一般由一個或多個stripe組成,每個stripe一般為hdfs區塊的大小,每個stripe包含多個記錄,這些記錄依照列獨立儲存。
stripe
index data
子主題 1
row data
stripe footer
調優
fetch抓取
指的是某些情況下查詢可不必走mr任務,例如 select * from table 在這種情況下hive可以簡單地讀取表目錄下的檔案然後輸出到控制台
fetch抓取開啟設定
在hive-default.xml.template檔中設定hive.fetch.task.conversion = more
開啟以後在全域查找,limit查找,欄位查找都不走mr任務
本地模式
hive輸入資料較少,為查詢觸發執行任務消耗的時間可能會比實際job的執行時間要長的多,對於這種情況可以開啟本地模式在單機上處理所有的任務。小數據集的任務執行時間明顯會縮短
參數設定
set hive.exec.mode.local.auto=true; //開啟本機 mr
表的最佳化
大錶、小表join
小表在前大表在後能有效減少記憶體溢出出錯的誤發生的幾率,現在已經優化掉了,小表大表在前後已經沒影響了
map join(小表join大表)
map join開啟設定
map join預設是開啟的
set hive.auto.convert.join = true;
set hive.mapjoin.smalltable.filesize=25000000;//預設小表大小是25M
map join 原理
大表join大表
1.空key過濾
大量空key的異常數據,進入同一個reducer處理極慢有時候甚至內存溢出,可以選擇先過濾掉空key
2.空key轉換
大量空key不是異常數據,必須包含在結果集中,那可以給key賦值,讓其均勻地分配在reducer中
group by
開啟map端聚合
參數設定
1.在map端開啟聚合
set hive.map.aggr = true
2.在map端聚合條數
set hive.groupby.mapaggr.checkinterval = 100000
3.有資料傾斜的時候進行負載平衡(預設false)
set hive.groupby.skewindata = true
原理:會啟動兩個job,第一個job map端會把key隨機分佈到reducer中,每個reducer內部進行一次聚合操作,輸出結果,第二個job拿到第一個job的結果把相同的key送到同一個reducer中進行聚合完成最終的聚合作業。
count(distinct)
小數據無所謂
大數據量
大數據量的情況下count(distinct)不管有多少個reducer資料都只會進入一個reducer中,影響job進度;可以使用group by進行去重統計
笛卡兒積
盡量避免笛卡兒積,join的時候不加on條件,或是無效的on條件hive只能用一個reducer處理數據
行列過濾
列處理
在select中,只拿需要的列,盡量少使用select *
列處理
如果在關聯中副表的過濾條件寫在where後面,那麼兩張表會先進行全表關聯然後再過濾數據,建議先對副表做一個帶有過濾條件的子查詢然後進行關聯
動態分割區
開啟動態分割區設定
1。開啟動態分區功能設定(預設為開啟)
hive.exec.dynamic.partition=true
2。設定為非嚴格模式(動態分割區的模式,預設為 strict,表示必須指定至少一個分割區為 靜態分割區,nonstrict 模式表示允許所有的分割區欄位都可以使用動態分割區。 )
hive.exec.dynamic.partition.mode=nonstrict
3。在所有執行 MR 的節點上,最大一共可以建立多少個動態分區。預設 1000
hive.exec.max.dynamic.partitions=1000
4。在每個執行 MR 的節點上,最大可以建立多少個動態分區。此參數需要根據實際 的數據來設定。例如:來源資料中包含了一年的數據,即 day 欄位有 365 個值,那麼該參數就 需要設定成大於 365,如果使用預設值 100,則會報錯。
hive.exec.max.dynamic.partitions.pernode=100
5。在整個 MR Job 中,最大可以建立多少個 HDFS 檔案。預設 100000
hive.exec.max.created.files=100000
6。當有空分區產生時,是否拋出異常。一般不需要設定。預設 false
hive.error.on.empty.partition=false
分割區
分桶
數據傾斜
1.設定合理的Map數
平行執行
預設情況下,hive一次只能執行一個階段,不過,某個特定的job可能包含眾多階段,這些階段可能並非完全相互依賴,也就是說有些階段是可以並行進行的,並行執行job也就完成得更快。
開啟參數設定
set hive.exec.parallel=true; //開啟任務並行執行 set hive.exec.parallel.thread.number=16; //同一個 sql 允許最大並行度,預設為 8。
嚴格模式
jvm重用
推測執行
壓縮
數倉理論
概念
是為企業所有層級的決策制定過程,提供所有類型資料支援的策略集合。
特徵
數倉是面向主圖、整合的、非揮發性的、時變的資料集合,用來支援決策
面向主題
整合性
非易失(不可更改)
時變性
etl
抽取 Extra, 轉化 Transfer, 裝載 Load
數倉分層
來源資料
此層數據無任何更改,直接沿用外圍系統數據結構和數據,不對外開放;為臨時存儲層,是接口數據的臨時存儲區域,為後一步的數據處理做準備。
資料倉儲
也稱為細節層,DW 層的數據應該是一致的、準確的、乾淨的數據,即對源系統數據進行了清洗(去除了雜質)後的數據。
數據應用
前端應用直接讀取的資料來源;根據報表、專題分析需求而計算產生的資料
為什麼要分層
空間換時間
透過大量的預處理來提升應用系統的使用者體驗(效率),因此資料倉儲會存在大量冗餘的資料;不分層的話,如果來源業務系統的業務規則變更將會影響整個資料清洗過程,工作量巨大。
分層簡化資料清洗過程
透過資料分層管理可以簡化資料清洗的過程,因為把原來一步的工作分到了多個步驟去完成,相當於把一個複雜的工作拆成了多個簡單的工作,把一個大的黑盒子變成了一個白盒,每一層的處理邏輯都相對簡單和容易理解,這樣我們比較容易保證每一個步驟的正確性,當數據發生錯誤的時候,往往我們只需要局部調整某個步驟即可。
數據集市
資料集市架構
獨立數據集市
從屬資料集市
數倉分層
數倉分層原則
1. 為便於資料分析,要屏蔽底層複雜業務,簡單、完整、整合的將資料暴露給分析層。
2. 底層業務變動與上層需求變動對模型衝擊最小化,業務系統變化影響削弱在基礎資料層,結合由上而下的建設方法削弱需求變動對模型的影響。
3. 高內聚松耦合,即主題之內或各個完整意義的系統內資料的高內聚,主題之間或各個完整意義的系統間資料的鬆散耦合。
4. 建構倉庫基礎資料層,使底層業務資料整合工作與上層應用開發工作相隔離,為倉庫大規模開發奠定基礎 倉庫層次更加清晰,對外暴露資料更加統一。
數倉分層
ods(Operational Data Store)
原封不動的接入原始數據
DW(Data Warehouse)
DWD(Data Warehouse Detail)資料明細層
粒度與ods層保持一致,並提供一定的資料品質保證。 dwd這一層需要做的是資料清理、整合、標準化、髒資料、垃圾資料、規範不一致、狀態定義不一致、命名規範不一致的資料都會被處理。同時,為了提高資料的易用性會採用一些維度退化的手法,將維度退化至事實表中,並減少維度表和事實表的關聯。在該層也會做一部分資料的聚合,將相同主題域的資料匯集到同一張表中,提高資料的可用性
DWM(Data WareHouse Middle)資料中間層
在DWD層的基礎上,對通用的核心維度進行指標聚合操作,算出對應的統計指標。 實際計算中如果從DWD或ODS層直接計算出寬表的計算指標,會存在計算量太大且維度太少的問題,因此一般做法是在dwm層先計算出多個小的中間表然後拼成一張大的寬表。由於寬窄界限不易界定,也可以去掉dwm這一層只留下dws這一層。
DWS(Data WareHouse Servce)資料服務層
粒度比明細層粗,基於dwd層的數據整合匯總成分析某一主題域的服務數據,一般是寬表。 dws層應覆蓋80%的營養場景。又稱數集市或寬表,用於後續的業務查詢、olap分析、資料分發等。
APP數據應用層
主要是提供給數據產品和數據分析使用的數據,一般會存放在 ES、PostgreSql、Redis 等系統中供線上系統使用,也可能存在 Hive 或Druid中供數據分析和數據挖掘使用。例如我們常說的報表數據,一般就放在這裡。
dim維表層
如果維表過的可以單獨設計這一層
高基維度數據
一般是使用者資料表、商品表資料表類似的。數據量可能是上千萬或上億
低基圍度數據
一般是配置表,例如枚舉值對應的中文的意義、或者日期維表、資料量可能個位數也可能幾百上千也可能上萬。
數倉建模方法
維度建模法
意義
以已分析決策的需求出發建立模型,建構的資料模型為分析需求服務,重點在於解決使用者快速完成分析的問題,同時還有較好的大規模複雜查詢的回應效能
事實表
週期快照事實表
事務事實表
累計快照事實表
無事實的事實表
聚集事實表
合併事實表
維度表
星型模型
所有維度表連接在事實表上,維表不會關聯其他維表
星座模型
星型模型延伸而來,多張事實表共享維度信息
雪花模型
事實表和維表關聯,維表可以擁有其他維表,關聯較多,效能低
維度建模過程
選擇業務流程
聲明粒度
在同一事實表中,必須具有相同的粒度,並且在同一事實表中不要混用多種不同的粒度,不同的粒度資料建立不同的事實表。對需求不明朗的資料我們建立原子粒度。
確認維度
確認事實
範式建模法
資料庫6種範式
第一範式(1NF)
強調的是列的原子性,即列不能夠再分成其他幾列。
第二範式(2NF)
滿足第一範式的前提下還要滿足兩個條件,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴主鍵,而不能只依賴主鍵的一部分。
第三範式(3NF)
滿足2nf,非主鍵列必須直接依賴主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴非主鍵列 B,非主鍵列 B
Boyce-Codd範式(BCNF 巴斯-科德範式)
第四範式(4NF)
第五範式(5NF)
建模步驟
1.概念模型
2.邏輯模型
3.物理模型
數倉核心建設思想
從設計、開發、部署和應用層面,避免重複建設和指標冗餘建設,從而保障數據口徑的規範和統一,最終實現數據資產的全鏈路關聯、提供標準數據輸出以及簡歷統一的數據公共層
資料中台建置流程
impala
資料類型
shell命令
架構
模組
impalad
接收client的請求,query執行並返回中心協調點
子節點上的守護進程,負責向statestore保持通信,報告工作
statestore
負責收集分佈在各個impalad進程的資源資訊、各節點的健康狀態,同步節點信息
負責query的協調調度
catalog
分發表的元資料資訊到各impalad中
接收statestore的所有請求
hiveMetastore
hdfs
ddl
impala不支援 WITH DBPROPERTIES (列如:給庫增加創建人信息,創建日期)
刪庫
drop database
impala不支援alter database
dml
資料導入(基本上與hive相同),impala不支援持 load data local inpath…
數據導出(impala不支援 insert overwrite…語法匯出數據,可以用impala -o代替)
不支援export和import命令
查詢
基本的語法跟 hive 的查詢語句大致一樣
impala不支援分桶
impala不支援cluster by,sort by,distributed by
Impala 不支援 COLLECT_SET(col)和 explode(col)函數
Impala 支援開窗函數
impala自訂函數
udf
儲存和壓縮
最佳化
1.盡量stateStore和catalog盡量部署在同一台伺服器,盡量保證他們的通訊
2.透過impala dameon的記憶體限制(預設256)以及statestore執行緒數,來提高工作效率
3.sql優化,執行sql前先呼叫執行計劃
4.選擇合適的文件格式進行存儲,提高查詢效率
5.避免產生很多小文件(如果有其他程式產生的小文件,可以使用中間表,將小文件資料存放到中間表。然後透過 insert…select…方式中間表的資料插入到最終表中)
6.使用合適的分區技術,根據分區粒度測算
7.使用 compute stats 進行表格資訊蒐集,當一個內容表或分區明顯變化,重新計算統計相關資料表或分區。因為行和不同值的數量差異可能導致 impala 選擇不同的連接順序時,表中使用的查詢。
8.網路 io 的優化
–a.避免把整個資料傳送到客戶端
–b.盡可能的做條件過濾
–c.使用 limit 字句
–d.輸出檔案時,避免使用美化輸出
–e.盡量少用全量元資料的刷新
9. 使用 profile 輸出底層資訊計劃,在做對應環境最佳化
資料湖理論
spark
內建模組
spark core
實現了 Spark 的基本功能,包含任務調度、記憶體管理、錯誤復原、與儲存系統互動等模組。 Spark Core 中也包含了彈性分散式資料集(Resilient Distributed DataSet,簡稱 RDD)的 API 定義。
spark sql
spark操作結構化資料的程式包,可以支援HQL
spark streaming
流式計算元件,api與spark core高度對應
spark mlib
提供常見的機器學習類別庫
spark graghx
圖計算
運作模式
local模式
standlone模式
yarn 模式
yarn-client
特點:
driver運行在客戶端,適用於互動、調試
yarn-cluster
特點
driver運作在resourceManager啟動的applicationMaster適用於生產環境
sparkcore
rdd
compute
partions
partioner
dependencies
算子
轉換算子
value類型
map(func)
mapPartitions(func)
func 的函數型別必須是 Iterator[T] => Iterator[U]
mapPartitionsWithIndex(func)
func 的函數型別必須是(Int, Interator[T]) => Iterator[U]
flatMap(func)
glom()
將每一個分區形成一個數組,形成新的 RDD 型別時 RDD[Array[T]]
groupBy()
子主題 1
分組,依照傳入函數的回傳值進行分組。將相同的 key 對應的值放入一個迭代器.
filter
sample(withReplacement, fraction, seed)
以指定的隨機種子隨機抽樣出數量為 fraction 的數據,withReplacement 表示是抽出的數據是否放回,true 為有放回的抽樣,false 為無放回的抽樣,seed 用於指定隨機數生成器種子。
distinct([numTasks]))
對來源 RDD 進行去重後傳回一個新的 RDD。預設情況下,只有 8 個並行任務來操作,但可以傳入一個可選的 numTasks 參數來改變它。
coalesce(numPartitions)
縮減分區數,用於大數據集過濾後,提高小數據集的執行效率。
repartition(numPartitions)
根據分區數,重新透過網路隨機洗牌所有資料。
coalesce 和 repartition 的區別
1. coalesce 重新分區,可以選擇是否進行 shuffle 過程。由參數 shuffle: Boolean = false/true 決定。
2. repartition 實際上是呼叫的 coalesce,進行 shuffle。
sortBy(func,[ascending], [numTasks])
使用 func 先對資料進行處理,依照處理後的資料比較結果排序,預設為正序。
pipe(command, [envVars])
管道,針對每個分割區,都執行一個 shell 腳本,傳回輸出的 RDD。
雙value類型
union
subtract (otherDataset)
計算差的一種函數,去除兩個 RDD 中相同的元素,不同的 RDD 將保留下來
intersection(otherDataset)
對來源 RDD 和參數 RDD 求交集後傳回一個新的 RDD
cartesian(otherDataset)
笛卡兒積
zip(otherDataset)
將兩個 RDD 組合成 Key/Value 形式的 RDD,這裡預設兩個 RDD 的 partition 數量以及元素數量都相同,否則會拋出例外。
key/value類型
partitionBy(partitioner)
對 pairRDD 進行分區操作,如果原有的 partionRDD 和現有的 partionRDD 是一致的話就不進行分區, 否則會產生 ShuffleRDD,即會產生 shuffle 過程
reduceByKey(func, [numTasks])
在一個(K,V)的RDD 上調用,返回一個(K,V)的RDD,使用指定的reduce 函數,將相同key 的值聚合到一起,reduce 任務的個數可以通過第二個可選的參數來設定。
groupByKey()
groupByKey 也是對每個 key 進行操作,但只產生一個 seq。
reduceByKey 和 groupByKey 的差異
1. reduceByKey:依照 key 進行聚合,在 shuffle 之前有 combine(預先聚合)操作,回傳結果是 RDD[k,v]。 2. groupByKey:依照 key 進行分組,直接進行 shuffle。 3. 開發指導:reduceByKey 比 groupByKey,建議使用。但是需要注意是否會影響業務邏輯。
aggregateByKey
參數:(zeroValue:U,[partitioner: Partitioner]) (seqOp: (U, V) => U,combOp: (U, U) => U)
在kv 對的RDD 中,,按key 將value 分組合併,合併時,將每個value 和初始值作為seq 函數的參數,進行計算,返回的結果作為一個新的kv 對,然後再將結果按照key 進行合併,最後將每個分組的value 傳遞給combine 函數進行計算(先將前兩個value進行計算,將返回結果和下一個value 傳給combine 函數,以此類推),將key 與計算結果作為一個新的kv 對輸出。
foldByKey
參數:(zeroValue: V)(func: (V, V) => V): RDD[(K, V)]
aggregateByKey 的簡化操作,seqop 和 combop 相同
combineByKey[C]
參數:(createCombiner: V => C, mergeValue: (C, V) => C, mergeCombiners: (C, C) => C)
作用:針對相同 K,將 V 合併成一個集合
子主題 3
sortByKey([ascending], [numTasks])
在一個(K,V)的 RDD 上調用,K 必須實作 Ordered 接口,傳回一個依照 key 進行排序的(K,V)的 RDD
mapValues
針對於(K,V)形式的類型只對 V 進行操作
join(otherDataset, [numTasks])
在類型為(K,V)和(K,W)的 RDD 上調用,返回一個相同 key 對應的所有元素對在一起的(K,(V,W))的 RDD
cogroup(otherDataset, [numTasks])
在類型為(K,V)和(K,W)的 RDD 上調用,傳回一個(K,(Iterable<V>,Iterable<W>))類型的 RDD
action
reduce(func)
透過 func 函數聚集 RDD 中的所有元素,先聚合分區內數據,再聚合分區間數據
collect()
在驅動程式中,以數組的形式傳回資料集的所有元素。
count()
傳回 RDD 中元素的個數
first()
傳回 RDD 中的第一個元素
take(n)
傳回由 RDD 的前 n 個元素組成的陣列
takeOrdered(n)
傳回該 RDD 排序後的前 n 個元素所組成的陣列
aggregate
參數:(zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U)
aggregate 函數將每個分區裡面的元素透過 seqOp 和初始值聚合,然後用combine 函數將每個分區的結果和初始值(zeroValue)進行 combine 運算。這個函數最終傳回的類型不需要和 RDD 中元素類型一致
fold(num)(func)
折疊操作,aggregate 的簡化操作,seqop 和 combop 一樣。
子主題 9
spark內核
spark核心元件
driver
excutor
spark通用運作流程
1) 任務提交後,都會先啟動 Driver 程式; 2) 隨後 Driver 向群集管理器註冊應用程式; 3) 之後群集管理器根據此任務的設定檔分配 Executor 並啟動; 4) Driver 開始執行main 函數,Spark 查詢為懶執行,當執行到Action 算子時開始反向推算,根據寬依賴進行Stage 的劃分,隨後每一個Stage 對應一個Taskset,Taskset 中有多個Task,查找可用資源Executor 進行調度; 5) 根據本地化原則,Task 會被分發到指定的 Executor 去執行,在任務執行的過程中,Executor 也會不斷與 Driver 進行通信,報告任務運作。
部署模式
standlone
hadoop yarn
yarn-client
yarn-cluster
mesos
k8s
wordcount
sc.textFile(“xx").flatMap(_.split(" ")).map((_,1)).reduceByKey(_ _).saveAsTextFile(“xx")
最佳化
數據傾斜
記憶體模型
常見演算法
kafka
Hbase
定義
Hbase是高可靠性、高效能、面向列、可伸縮的分散式儲存、即時儲存的noSql系統
特點
1.海量存儲
Hbase適合儲存PB數量級數據,PC數量等級的數據在幾十到幾百毫秒內回傳數據
2.列式存儲
hbase存儲才有的是列族存儲,列族下麵包含很多列
3.極易擴展
Hbase 的擴展性主要體現在兩個方面,一個是基於上層處理能力(RegionServer)的擴展,一個是基於儲存的擴展(HDFS)。 透過橫向添加 RegionSever 的機器,進行水平擴展,提升Hbase 上層的處理能力,提升 Hbsae 服務更多 Region 的能力。
4.高並發
由於目前大部分使用 Hbase 的架構,都是採用的廉價 PC,因此單一 IO 的延遲其實並不小,通常在幾十到上百 ms 之間。這裡說的高併發,主要是在並發的情況下,Hbase 的單一IO 延遲下降並不多。能獲得高併發、低延遲的服務。
5.稀疏
稀疏主要是針對 Hbase 列的彈性,在列族中,你可以指定任意多的列,在列資料為空的情況下,是不會佔用儲存空間的。
Hbase架構
架構圖
client
包含了存取HBase的接口,也包含cache來加速HBase的訪問,例如cache包含了.META訊息
zookeeper
主要做master的高可用、reginserver的監控、元資料的入口、叢集配置的維護工作
透過zk保證叢集只有一個master在運行,master故障時透過競爭機制產生新的master
透過zk來監控regionserver的狀態,當regionserver異常的時候透過回呼的形式通知Master regionserver的上下線訊息
透過zk儲存元資料的統一入口信息
hdfs
為HBase提供底層資料儲存服務
提供元資料和表格資料的底層分散式儲存服務
資料多副本,保證的高可靠度和高可用性
HMaster
為 RegionServer 分配 Region
維護整個叢集的負載平衡
維護集群的元資料資訊
發現失效的 Region,並將失效的 Region 分配到正常的 RegionServer 上
當 RegionSever 失效的時候,協調對應 Hlog 的拆分
HReginServer
主要對接用戶的讀寫請求
管理 master 為其指派的 Region
處理來自客戶端的讀寫請求
負責和底層 HDFS 的交互,儲存資料到 HDFS
負責 Region 變大以後的拆分
負責 Storefile 的合併工作
角色
HMaster
1.監控 RegionServer
2.處理 RegionServer 故障轉移
3.處理元資料的變更
4.處理 region 的分配或轉移
5.在空閒時間進行資料的負載平衡
6.透過 Zookeeper 發布自己的位置給客戶端
RegionServer
1.負責儲存 HBase 的實際數據
2.處理分配給它的 Region
3.刷新快取到 HDFS
4.維護 Hlog
5.執行壓縮
6.負責處理 Region 分片
其他組件
Write-Ahead logs(wal)
HBase 的修改記錄,當對 HBase 讀寫資料的時候,資料不是直接寫進磁碟,它會在記憶體中保留一段時間(時間以及資料量閾值可以設定)。但把資料保存在記憶體中可能有更高的機率會造成資料遺失,為了解決這個問題,資料會先寫在一個叫做 Write-Ahead logfile 的檔案中,然後再寫入記憶體中。所以在系統故障的時候,資料可以透過這個日誌檔案重建
region
Hbase 表的分片,HBase 表會根據 RowKey值被切分成不同的 region 儲存在 RegionServer中,在一個 RegionServer 中可以有多個不同的 region。
store
HFile 儲存在 Store 中,一個 Store 對應 HBase 表中的一個列族。
MemStore
顧名思義,就是內存存儲,位於內存中,用來保存當前的數據操作,所以當數據保存在WAL 中之後,RegsionServer 會在內存中存儲鍵值對。
HFile
這是在磁碟上保存原始資料的實際的實體文件,是實際的儲存文件。 StoreFile 是以 Hfile的形式儲存在 HDFS 的。
HBase操作
HBase資料結構
RowKey
與nosql資料庫一樣,rowkey是存取資料的主鍵。訪問HBase的行有三中方式
1.透過單一rowkey訪問
2.透過rowkey的range(正規)
3.全表掃描
RowKey 行鍵 (RowKey)可以是任意字串(最大長度是64KB,實際應用中長度一般為10-100bytes),在 HBASE 內部,RowKey 儲存為位元組陣列。儲存時,資料會依照 RowKey 的字典序(byte order)排序儲存。設計 RowKey 時,要充分排序儲存這個性,將經常一起讀取的行儲存放在一起。 (位置相關性)
column famlily
列族:HBASE 表中的每個列,都歸屬於某個列族。列族是表的 schema 的一部 分(而列不是),必須在使用表之前定義。列名都以列族作為前綴。例如 courses:history,courses:math都屬於 courses 這個列族。
cell
由{rowkey, column Family:columu, version} 唯一確定的單元。 cell 中的資料是沒有類型的,全部是字節碼形式存貯。
time stamp
HBase中透過rowkey和column確定的為一個存貯單位稱為cell。每個cell保存著多個同一份資料的多個版本。版本透過時間戳來索引。時間戳的類型是 64 位元整數。時間戳可以由 HBASE(在資料寫入時自動 )賦值,此時時間戳記是精確到毫秒 的目前系統時間。時間戳記也可以由顧客明確賦值。如果應用程式要避免資料版 本衝突,就必須自行產生具有唯一性的時間戳記。在每個 cell 中,不同版本的資料都依照時間倒序排序,也就是最新的資料排在最前面。 為了避免因資料存在過多版本造成的管理 (包括存貯和索引)負擔,HBASE 提供 了兩種資料版本回收方式。一是保存資料的最後 n 個版本,二是保存最近一段 時間內的版本(例如最近七天)。使用者可以針對每個列族進行設定。
命名空間
命名空間結構
Table
表,所有的表都是命名空間的成員,即表必屬於某個命名空間,如果沒有指定,則在 default 預設的命名空間中。
RegionServer group
一個命名空間包含了預設的 RegionServer Group。
Permission
權限,命名空間能夠讓我們定義存取控制清單 ACL(Access Control List)。
Quota
限額,可以強制一個命名空間可包含的 region 的數量。
HBase資料原理
HBase唸原理
1)Client 先存取 zookeeper,從 meta 表讀取 region 的位置,然後讀取 meta 表中的資料。 meta中又儲存了用戶表的 region 資訊;
2)根據 namespace、表名和 rowkey 在 meta 表中找到對應的 region 資訊;
3)找到這個 region 對應的 regionserver;
4)找出對應的 region;
5)先從 MemStore 找數據,如果沒有,再到 BlockCache 裡面讀;
6)BlockCache 還沒有,再到 StoreFile 上讀(為了讀取的效率);
7)如果是從 StoreFile 裡面讀取的數據,不是直接回傳給客戶端,而是先寫入 BlockCache,再回傳給客戶端。
HBase寫流程
1)Client 向 HregionServer 發送寫入請求;
2)HregionServer 將資料寫到 HLog(write ahead log)。為了資料的持久化和恢復;
3)HregionServer 將資料寫到記憶體(MemStore);
4)回饋 Client 寫入成功。
數據flush過程
1)當 MemStore 資料達到閾值(預設是 128M,舊版本是 64M),將資料刷到硬碟,將記憶體中的資料刪除,同時刪除 HLog 中的歷史資料;
2)並將資料儲存到 HDFS 中;
3)在 HLog 中做標記點。
資料合併流程
1)當資料區塊達到 4 區塊,Hmaster 觸發合併操作,Region 將資料區塊載入到本機,進行合併;
2)當合併的資料超過 256M,進行拆分,將拆分後的 Region 分配給不同的 HregionServer管理;
3)當HregionServer宕機後,將HregionServer上的hlog拆分,然後分配給不同的HregionServer加載,修改.META.;
4)注意:HLog 會同步到 HDFS。
hive和HBase整合使用
透過hive-hbase-handler-1.2.2.jar整合
建立 Hive 表,關聯 HBase 表,插入資料到 Hive 表的同時能夠影響 HBase 表。
在 HBase 中已經儲存了某一張表 hbase_emp_table,然後在 Hive 中建立一個外部表來關聯 HBase 中的 hbase_emp_table 這張表,使其可以藉助 Hive 來分析 HBase 這張表中的資料。
HBase最佳化
高可用(多個Hmaster)
在 HBase 中 Hmaster 負責監控 RegionServer 的生命週期,平衡 RegionServer 的負載,如 果 Hmaster 掛掉了,那麼整個 HBase 叢集將陷入不健康的狀態,並且此時的工作狀態並不 會維持太久。所以 HBase 支援對 Hmaster 的高可用配置。
預分區
手動預分區
create 'staff1','info','partition1',SPLITS => ['1000','2000','3000','4000']
表示[min,1000),[1000,2000),[2000,3000),[3000,4000),[4000,max)五個分區
產生 16 進位序列預分區
create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
表示16進位分15個分區
依照檔案中設定的規則預分區
create 'staff3','partition3',SPLITS_FILE => 'splits.txt'
splits.txt內容如下
aaaa bbbb cccc dddd
javaAPI建立分割區
//自訂演算法,產生一系列 Hash 雜湊值儲存在二維數組中 byte[][] splitKeys = 某個雜湊值函數 //建立 HBaseAdmin 實例 HBaseAdmin hAdmin = new HBaseAdmin(HBaseConfiguration.create()); //建立 HTableDescriptor 實例 HTableDescriptor tableDesc = new HTableDescriptor(tableName); //透過 HTableDescriptor 實例和雜湊值二維數組建立帶有預先分區的 HBase 表 hAdmin.createTable(tableDesc, splitKeys);
rowkey設計
rowkey是一條資料的唯一標識,需要合理設計rowkey讓rowkey均勻分佈在region上以防止資料傾斜
1.產生隨機數、hash、雜湊值
eg:原 本 rowKey 為 1001 的 , SHA1 後變成:dd01903921ea24941c26a48f2cec24e0bb0e8cc7 原 本 rowKey 為 3001 的 , SHA1 後變成:49042c54de64a1e9bf0b33e00245660ef92dc7bd 原 本 rowKey 為 5001 的 , SHA1 後變成:7b61dec07e02c188790670af43e717f0f46e8913 在做此操作之前,一般我們會選擇從資料集中抽取樣本,來決定什麼樣的 rowKey 來 Hash後作為每個分割區的臨界值
2.字串反轉
eg:20170524000001 轉成 10000042507102
3.字串拼接
20170524000001_a12e 20170524000001_93i7
記憶體優化
HBase 操作過程中需要大量的記憶體開銷,畢竟 Table 是可以快取在記憶體中的,一般會分配整個可用記憶體的 70%給 HBase 的 Java 堆。但不建議分配非常大的堆內存,因為 GC 過程持續太久會導致 RegionServer 處於長期不可用狀態,一般 16~48G 內存就可以了,如果因 為框架佔用記憶體過高導致系統記憶體不足,框架一樣會被系統服務拖死。
基礎優化
1.允許在 HDFS 的檔案中追加內容
hdfs-site.xml、hbase-site.xml 屬性:dfs.support.append 解釋:開啟 HDFS 追加同步,可以優秀的配合 HBase 的資料同步持久化。預設值為 true。
2.優化 DataNode 允許的最大檔案開啟數
hdfs-site.xml 屬性:dfs.datanode.max.transfer.threads 解釋:HBase 一般都會在同一時間操作大量的文件,根據集群的數量和規模以及數據動作, 設定為 4096 或更高。預設值:4096
3.優化延遲高的數據操作的等待時間
hdfs-site.xml 屬性:dfs.image.transfer.timeout 解釋:如果對於某一次資料操作來講,延遲非常高,socket 需要等待更長的時間,建議把 該值設定為更大的值(預設為 60000 毫秒),以確保 socket 不會被 timeout 掉。
4.優化資料的寫入效率
mapred-site.xml 屬性: mapreduce.map.output.compress mapreduce.map.output.compress.codec 解釋:開啟這兩個資料可以大幅提高檔案的寫入效率,減少寫入時間。第一個屬性值修改為true,第二個屬性值修改為:org.apache.hadoop.io.compress.GzipCodec 或其他壓縮方式
5.設定 RPC 監聽數量
hbase-site.xml 屬性:hbase.regionserver.handler.count 解釋:預設值為 30,用於指定 RPC 監聽的數量,可以根據客戶端的請求數進行調整,讀寫請求較多時,增加此值。
6.優化 HStore 檔案大小
hbase-site.xml 屬性:hbase.hregion.max.filesize 解釋:預設值 10737418240(10GB),如果需要執行 HBase 的 MR 任務,可以減少此值,因為一個 region 對應一個 map 任務,如果單一 region 過大,會導致 map 任務執行時間過長。該值的意思是,如果 HFile 的大小達到這個數值,則這個 region 會被切割成兩個 Hfile。
7.優化 hbase 用戶端緩存
hbase-site.xml 屬性:hbase.client.write.buffer 解釋:用於指定 HBase 用戶端緩存,增大該值可以減少 RPC 呼叫次數,但是會消耗更多內存,反之則反之。一般我們需要設定一定的快取大小,以達到減少 RPC 次數的目的。
8.指定 scan.next 掃描 HBase 所取得的行數
hbase-site.xml 屬性:hbase.client.scanner.caching 解釋:用於指定 scan.next 方法取得的預設行數,值越大,消耗記憶體越大。
9.flush、compact、split 機制
當 MemStore 達到閾值,將 Memstore 中的資料 Flush 進 Storefile;compact 機制則是把 flush出來的小檔案合併成大型的 Storefile 檔案。 split 是當 Region 達到閾值,會把過大的 Region一分為二。
涉及屬性: 即:128M 就是 Memstore 的預設閾值 hbase.hregion.memstore.flush.size:134217728 即:這個參數的作用是當單一 HRegion 內所有的 Memstore 大小總和超過指定值時,flush 該HRegion 的所有 memstore。 RegionServer 的 flush 是透過將請求新增一個佇列,模擬生產消費模型來非同步處理的。那這裡就有一個問題,當佇列來不及消費,產生大量積壓請求時,可能會導致記憶體陡增,最糟的情況是觸發 OOM。 hbase.regionserver.global.memstore.upperLimit:0.4 hbase.regionserver.global.memstore.lowerLimit:0.38 即:當MemStore 使用記憶體總量達到hbase.regionserver.global.memstore.upperLimit 指定值時,將會有多個MemStores flush 到檔案中,MemStore flush 順序是按照大小降序執行的,直到刷新到MemStore 使用記憶體到MemStore 使用記憶體略小於lowerLimit
蒲隆地
flink
Datax1
presto
Oozie
數據資產
springboot
面試官蝦仁豬心面試題
Linux
自我介紹
1分鐘自我介紹: 我在上家公司主要做了中國大地保險數據平台,主要接入的是小米,京東,車300,大地保險公司內部產生以及銀行相關的保險數據;數倉分了很多主題,包括訂單主題、客戶主題、理賠主題、逾期主題、審批主題、投訴主題;我開發的業務涉及到訂單主題、用戶主題、逾期主題,工作中做的和數倉建模、數據處理、數據品質監控、主題指標計算相關;主要應用的技術有hive,spark,hue,impala,hadoop、infomatical等;平台每天新增1TB左右的資料。
業務介紹