1. 程式人生 > >JAVA與大資料面試總結(二)

JAVA與大資料面試總結(二)

Java基礎知識

Java中常用演算法:冒泡、選擇、快速

冒泡:兩兩比較,每一輪(0~length-i)挑出一個最值,並將其移除,迴圈遍歷1~length

 

選擇:外面定義從0~length-1,先選定一個最先面的下目標作為最小下標,將其所對應的值逐一與其他比較,如果有人小於這個值,將其下標交換位置,一輪下來,如果最小下標指向的值不再是剛定義的值,就將其所對應的值交換位置,迴圈遍歷  裡面迴圈是i+1~length

 

快速:先選定一個值作為中間值,如果比這個數值小的放在左邊,比這個值大的放在右邊,再分別從左、右條一個作為中間值遞迴遍歷

樹:

二叉樹中的中序遍歷:順序就是在地面上的投影

紅黑樹就是二叉樹的一種,treeset就是利用這個原理  去重加排序

連結串列:寫快讀慢,隨機寫,讀的時候要從頭開始遍歷,節點的引用指向下一個節點的物件

陣列:寫慢讀快,寫的時候要遍歷下標,將其放入,讀取的時候直接根據縣標找到指定的值

 

Hashmap:

原理:是連結串列和陣列的結合體,對於不同hashcord的key以陣列的形式存放,對於hashcord相同的key以連結串列的形式存放。Hashset基於hashmap

陣列的長度是16,裝載因子是0.75,對key取hash值,莫以集合長度,如果key的equals相同,則將其value值覆蓋,如果不同則追加(放入連結串列)。

讀的時候對key取hash,找到陣列中對應的位置,再比較equals方法找到對應的key所對應的value

 

當集合的長度達到0.75*16=12時,進行對集合進行擴容:建立一個新集合是原來陣列長度的兩倍,並將原來的資料從新取hash移動到新集合中。

 

Stringbuffer:現成安全,stringbuild:現成不安全,String:執行緒安全,不可變的,String的值會先放在常量池中,如果下一次再建立時,先從常量池中查詢是否有物件的值,如果存在將將其索引指向常量池中的值,如果不存在則建立,並將值放在常量池中。 String是被final修飾的不能被繼承。String的本質是char型別的陣列

 

陣列實在記憶體裡一系列連續的儲存空間,有下標,查詢效率快

List集合的本質是陣列,長度不固定,可以擴充套件

 

集合排序,讓集合中的物件實現comparable介面(和別人比較)或者compartor介面(和自己比較)然後呼叫collections是sort方法

 

阻塞佇列:多執行緒環境下,當佇列中沒有空間時,生產者暫時停止生產,當佇列中沒有資料時暫時停止消費,提醒生產。就是作為緩衝區,解耦提高效能。

打比方說,賣電影票,生產者生產的票放在前臺賣,消費者從前臺買票,當生意不好時,票賣不出去,前臺提醒生產者暫時不要生產票,當處於熱季時,生產的表不夠消費,讓其等待,通知生產者生產。

 

執行緒池:不用建立和銷燬執行緒,提高效能。獲取執行緒

有固定數量的執行緒池(Fied)、帶著緩衝區的執行緒池(cached)、帶著任務排程的執行緒池(scheduled),可以設定執行緒執行的優先順序。一個執行緒的執行緒池(single)

資料庫連線池就是獲取連線。Druid 效能好,穩定

設計思想都是:減少資源的頻繁創建於銷燬。、

 

執行緒join,將執行緒的並行執行變成序列執行。

在共享變數上加volatile關鍵字,告訴編譯器針對此共享變數,不進行編譯。從而保證執行緒安全

 

程序中可以有多個執行緒,程序之間沒有共享記憶體。

高併發:好多人同時歐一件事

Web中的高併發出現在HTTPserver與資料庫連線:

資料庫:

使用快取、Redis是基於記憶體的keyvalue形式的菲關係型分散式資料庫快取,策略使用的是lru(最近最少使用,長度固定)

資料庫連線池、儘量接受減少資料庫連線

表設計、建立合適的索引

SQL優化:避免三表以上關聯、兩表join小標放前

 

隨機讀寫表:randomAccessFile

序列化:objectOutputstream,不能跨平臺、將物件從記憶體中存入網路\磁碟

反序列化:objectinputstream,把物件從網路、磁碟中讀到記憶體

 

設計者模式:

單例模式,保證只能有一個例項,懶漢式:當第一次呼叫是例項化。餓漢:在類初始化時,就已經自動的例項化自己。---防止頻繁建立物件導致oom(沒存溢位)

適用於:建立物件時,消耗大量資源

工廠模式:我們在建立物件時,直接從工廠中取物件。遮蔽了底層實現。解耦

適用於:Spring框架

動態代理:當我們項呼叫一個介面,我們把呼叫介面的方法和引數通過一個代理傳遞對方,代理通過反射來例項化這個介面的例項,並且invoke這個介面例項。

構建者模式

物件的引數有很多,呼叫的引數個數又不固定。使用構建者模式就不用再過多的構造方法,防止程式碼冗餘。

 

Web伺服器:Tomcat、NGINX:靜態代理伺服器,不處理業務邏輯,負載均衡、地址分發支援高併發、

Spring IOC:依賴注入,也叫做控制反轉,

Aop:面向切面程式設計

 

事物:一些業務的一次操作作為一個事物,要麼同時成功,要麼同時失敗。

ACID:原子性、一致性、隔離性、永續性

Orm:物件關係對映。

Jpa:java持久層的api,是一種介面、規範,使用註解的方式來配置資料庫操作,不用自己實現service只需要繼承介面,遮蔽了底層實現,節省程式碼量。

 

Mvc:model---view----controller

 

註解本身不做任何事情,只是像xml檔案一樣起到配置作用。註解代表著某種業務意義,註解背後的工作原理類似於原始碼實現。

 

資料庫:MySQL、Oracle

MySQL:儲存資料量不大,支援事物,主鍵可以自增長

Oracle:儲存資料量比較大,支援高併發,主鍵自增要使用序列sequence

 

Union all:直接連線,獲取所有值

Union:取唯一值,union all+去重

 

資料庫優化:

索引優化:儘可能將經常查詢的兩件做為索引

SQL語句:

儘可能避免select *

Where代替having,where執行速度快

Where執行的循序是,從下至上的

儘可能命中索引,

避免三表關聯。

Union、in代替or

使用exists代替in

 

資料庫引擎:Innodb支援事物

 

資料庫事物隔離級別:

未提交讀:資料還沒有提交到記憶體中

提交讀:出現幻讀,兩次讀取的結果不一樣,加了行鎖-在讀的時候在中間寫入資料了

可重複讀:樂觀鎖=行鎖加區間鎖,可以並行讀,序列寫

序列:悲觀鎖:順序讀寫—序列讀、序列寫

 

Hadoop

元件:mr、hdfs、yarn

Hdfs 程序:

Namenode:儲存元資料,元資料包括namespace(目錄結構)、blockmap:檔案所在的機器地址  資源管理、任務排程。

Datanode:任務的具體執行者,存放資料

Secondaryname:用於存放於增量資料合併成一個新檔案傳送給namenode

減少hdfs開啟時間。

 

Yarn:

ResourceManage:監控節點狀態、分配任務、控制整個系統

NodeManage:

負責執行計算任務

 

APPmaster:管理一個任務、具體任務排程者

 

Hadoop叢集的搭建:

在一臺機器上下載安裝jdk、hadoop,編寫配置檔案制定各個程序所在位置,以及制定namenode、dataname,節點之間配置免密登入,通過scp傳送jdk、hadoop,以及配置檔案。在主節點上執行hdfs-format namenode 命令格式化,start-hdfs.sh 開啟叢集,通過jsp測試檢視。

 

資源排程演算法:

FIFO,先進先出—hdfs

公平排程:每個任務執行一段時間,交替執行

能力排程:基於時間片輪迴,根據每個任務需要的資源,分配相應的任務。---yarn

 

MapReduce的流程:

input---->split---->map------>shuffer------>reduce

 

Mr資料傾斜:部分reduce節點上的key過多,執行資料過慢,導致整個任務執行的慢。

隨機數+key

 

Hadoop rpc通訊:

 

Hdfs讀寫原理:

客戶端項namenode發出請求,namenode檢視資料存放的快資訊,將地址傳送給客戶端,客戶端根據地址找到資料的指定位置讀取資料。讀取完成之後DataNode向namenode彙報情況。

 

客戶端項namenode傳送寫請求,namenode讀取快資訊,開始分配塊地址,並將理想的狀態的節點位置返回給客戶端,客戶端通過rpc向DataNode序列寫資料。寫完之後,會把儲存資訊反饋給namenode。

 

Ha:通過ookeeper故障切換

 

Hadoop優化:

通過優化演算法Gzip演算法、合併小檔案,減少namenode的記憶體、機架感知、本地讀。

 

Mr優化:

減少reduce任務數,減少rpc通訊

自定義分割槽。

 

Hive的原理:

Hive遮蔽的底層的mr實現。元資料存放在其他資料庫,資料存放在hdfs。

 

Hive優化:

大小表join時,小表放在前面,hive會將小表放入記憶體,提高效率

在map端進行join,

減少job數

Hive自定義函式,

實現udf重寫evaluate方法,maven打包上傳,add jar 將java中的類對映到hive函式自定義中。

Hive內外表:

外表:資料並沒有移動到自己的資料倉庫中,也就是所外表的資料並不由自己來管理。只有使用權。

內部表:具有資料的所有權。

Hive資料傾斜:

配置項,還是解決mr的資料傾斜。

大小表join時,將小表放在前面,載入到記憶體中,減少資源記憶體

合併小檔案,儘可能在map端join---減少reduce數

 

Hive中的sort By 不是全域性的,資料進入reduce端之前進行排序

OrderBy:全域性有序,只有一個reduce

 

分割槽:分割槽依據的欄位不是表中的,有這些維度—地區、時間;查詢是按區查詢,優化查詢

分桶:創表時,桶的個數就固定,對錶中的欄位進行分桶,桶內按字典排序,提高計算效能,防止資料傾斜。

資料廠庫:

複製層:表示的是將資料複製過來,不改變資料結構

原子層:3NF,維度表----欄位少=id+內容

彙總層:提高效能

展示層:計算結果

好處-----方便,好維護,便於管理

 

Hbase原理:

資料節點Regionserver下面有多個region,每個region存放hbase表裡若干個列簇的資料,最終資料按照hfile方式儲存在hdfs上。Hbase自身儲存的有元資料表mate(region存放在那臺機器上)和root(裡面是一個表有哪些region),這兩張表的元資料存放在zookeeper上,各個節點時間同步。

 

Rowkey設計原理:

  1. 不宜過長,因為資料持久化檔案hfile中是安裝keyvalue形式儲存,key=rowkey+列簇+列,如果過長極大的影響hfile儲存效率。
  2. rowkey儘可能與業務邏輯相關,將經常放在條件裡面的欄位作為rowkey,因為只有rowkey有個索引,儘可能命中索引。
  3. rowkey雜湊,負載均衡,防止寫熱點,取hash、反向rowkey

hbase優化:

1.預分割槽,建立表時,先指定若干分割槽,防止寫熱點

2.建立二級索引,1.利用Phoenix直接建立二級索引,2.使用協處理器observer,在寫入資料之前,建立二級索引-----索引的索引,把rowkey與列簇資料的反向對映建立索引,檢索時線檢索這個索引,找到對應的rowkey,再根據rowkey查詢資料。

3.分頁,指定一次查詢數量,批量查詢

4.Redis快取,將一些常用的資料放到緩衝,先查快取,再查hbase。

 

Hbase優點:

查詢和寫入資料快以順序讀寫還隨機讀寫。將檔案先快取到menstore中在裡面排序,再並將其記錄日誌儲存到hdfs中。

 

Kafka:分散式訊息佇列,組成部分有producer用來獲取資料,併發送topic主題、broker(伺服器)、consumer消費之前將訊息存放在中間伺服器中,

Kafka分割槽:

Kafka將topic從物理上把broker劃分成一個或多個分割槽,預設是hash分割槽演算法。

建立分割槽,相當於增大了並行度。

為了更好的負載均衡、訊息的順序性。可以傳送時指定分割槽。

日誌儲存策略配置:由於寫入了海量資料之後,佔用大量磁碟空間,如果不定時清理,可能磁碟空間不夠用。Kafka預設儲存7天。

Kafka資料丟失與資料重複

Produce:

設定ack=all,設定冪等—多次重複操作的效果與一次操作的效果一樣。

冪等,資料傳送給每個分割槽時,將資料做一下標記,當再次傳送資料時,如果該分割槽有此標記資料則不再發送。

Consumer:業務邏輯與偏移量不是一個原子操作。

將業務邏輯與偏移量的提交寫在同一事物中,保證他們要麼同時成功,要麼同時失敗。並且儲存的結果與偏移量在同一個地方,保證能夠回滾。

Sparkstreaming與kafka整合,如何保證資料不丟失。

Sparkstreaming裡面使用direct,並手動提交偏移量。

Zookeeper在kafka中起到的作用:每個topic又可以劃分多個分割槽,沒每個分割槽儲存在一個獨立的broker上,所有這些topic與broker的對應關係都有zookeeper來維護。分割槽的leader 與follower的故障切換。

Kafka的特點:吞吐量大,主要用於大量資料的處理。

Flume:一個分散式的日誌採集工具

Sqoop:一個關係型資料庫與大資料叢集之間的資料遷移工具

Redis:一個基於記憶體的菲關係型資料庫,一般講熱點資料寫在Redis中用來提升效能

Java:面向物件程式設計,Scala是面向物件程式設計又是面向函數語言程式設計。

Scala中的函式是一個物件,可以作為引數傳遞。

 

Spark

Sparkcore sparkstreaming sparkSQL

Rdd:彈性分散式資料集。

本質上是一個可容錯的之都的分割槽記錄集合。

每一個計算的階段設定一個stage,然後所有的stage會生成邏輯的有向五環圖,當觸發action的時候,才會按照DAG進行計算。

每個分割槽的每次transformation稱為一個task。

窄依賴:子rdd的一個分割槽依賴於父rd的一個分割槽,本地執行,不經過網路通訊。

寬依賴:子rdd的一個分割槽依賴於父rd的多個分割槽,shuffle操作,需要網路通訊。

Transformation:表示rdd的一次計算,生成的也是rdd,只記錄不操作。Rdd與rdd之間的轉換關係稱為血緣(linkage)。

Action:將rdd轉化成飛rdd儲存到hdfs,觸發job的執行。Collect,saveastaxtFile

Rdd常用函式:

Sc.parallelize

Reduce 、reducebykey、groupbykey

 

Spark優化

1.使用kyro序列化

2.高效能運算元:mappartition—transformation

                    Foreachpartition---action

3.共享廣播變數:broadcost

4.增大shuffle並行度。

 

資料傾斜:

  1. 聚合:將key加隨機數---聚合----取字首----再聚合
  2. Join操作:左表加字首,右表擴充n倍。

將相同的key放在一個節點上。

Rdd是基於記憶體的資料集合

Mr:是將資料雷擊寫到磁碟上,完了再統一進行reduce

 

Rdd轉化成datafrom---自定義case class ,加隱士轉換todf

普通的rdd裡面沒有元資料。

Df是一種特殊的rdd,主要用來操作關係型資料庫資料,每個欄位都有欄位屬性和欄位描述。

Dataset是rdd+schema提供了面向物件的方式來操作資料。

 

視窗計算:sparkstreaming中將多批資料化成一個區間,區間按照約定好的時間滑動,通常用來計算一段時間的資料。

 

有狀態計算:updatastatusbykey

設定checkpoint,實現updatestatebykey

Acc:可變的,累加器

用於統計處理的條數,程序間的

Broadcast:廣播變數,不可變的,提高效能。

不能廣播rdd其他都能廣播。

 

Rdd的本質就是一個list集合。