- 邏輯回歸如何解決過擬合問題?
過擬合大部分原因是由于特征過多導致的,我們可以使用以下兩種方法來解決過擬合的問題。
- 減少特征的數量:手工挑選、相關性分析、聚類、主成分分析。
- 正則化:可以降低某些特征的權值。
- Cassandra、SequoiaDB、MongoDB、HBase性能對比
測試規則:YCSB 測試規則(YCSB是Yahoo提供的NoSQL數據庫性能測試工具)
表設置:表模擬的是日志數據,字段數為10個,每條記錄100字節,副本設置為3,總共30G數據。一致性設為最終一致性級別(不保證任何時刻各個節點上的數據一致,但是一段時間后數據會一致)。
服務器配置:內存64G,操作系統麒麟系統,jdk1.7。
初始設置:硬件高可用性,
測試指標如下:
- 單條記錄導入(每臺服務器24線程):S:8萬ops/second;M:1萬ops/second;H:5.6萬ops/second;C:5.5萬ops/second;
- 批量記錄導入(每臺服務器08線程):S:19萬ops/second;M:1萬ops/second;H:5.6萬ops/second;C:和單條插入性能差不多;
- 單純查詢(每臺服務器36線程,后同):S:4萬ops/second;M:8萬ops/second;H:1萬ops/second;C:4萬ops/second;
- 查詢導入平衡(50%導入,50%查詢):S:1.9萬ops/second;M:1萬ops/second;H:0.8萬ops/second;C:1萬ops/second;
- 更新為主(95%更新,5%查詢):S:5.5萬ops/second;M:0.8萬ops/second;H:1.2萬ops/second;C:3.5萬ops/second;
- 查詢為主(95%查詢,5%更新):S:4.5萬ops/second;M:2.8萬ops/second;H:1萬ops/second;C:4萬ops/second;
- 查詢最新(95%查詢,5%導入):S:4萬ops/second;M:2.5萬ops/second;H:0.5萬ops/second;C:2.5萬ops/second;
Cassandra以及HBase相比MongoDB在寫性能上比較占優勢,在讀方面Cassandra介于MongoDB和HBase之間。更新方面Cassandra性能最佳。
Mysql和mongodb索引原理(說一下B+tree和B-tree區別,為什么為什么一個用b+一個用b-,為什么索引用btree不用平衡二叉樹)?Cassandra的索引實現原理?(參考:http://blog.codinglabs.org/articles/theory-of-mysql-index.html )
首先需要明白的是B+Tree和B-Tree有何不同:B+Tree非葉子節點沒有數據指針,而B-Tree有數據指針,這樣的一個小差別就使B+Tree的一個非葉子節點(通常占用一頁)可以存儲更多的key值,同時由于程序的局部性原理,下一次需要讀的數據可能就已經在緩存當中,因此相比B-Tree更能夠減少IO開銷。
平衡二叉樹(AVL樹):由于每個節點只能擁有兩顆子樹,因此樹的深度相比BTree更深,導致IO開銷更大。
Cassandra的一級索引機制是采用Bloom Filter(參考:http://blog.csdn.net/jiaomeng/article/details/1495500 ):其原理是通過k個哈希函數將key值映射為k個值,之后將長度為m的0-1數組中下標為這k個值的位置置為1。當判斷一個key是否在這個數組中時,只要判斷數組下標為這k個哈希函數計算出的hash值的位置是否全為1即可;優點是所消耗的空間極少,查詢效率極高;缺點是有可能將一個不屬于該數組的key值錯報成屬于該數組。
紅黑樹:自平衡二叉查找樹。其性質如下(參考:https://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91 ):
1) 根節點是黑色;
2) 所有節點都是紅色或黑色;
3) 每個紅色節點必須有兩個黑色子節點;
4) 所有葉子節點都是黑色;
5) 一個節點到其所有葉子節點的簡單路徑所包含的黑色節點個數相同。Spark看過哪些源碼?
主要就是Spark 內核中的源碼,具體有RDD源碼,DAG圖的生成過程,任務調度、還有緩存和checkpoint機制的源碼。
RDD 五要素:輸入、計算函數、分區器、依賴關系、分區最優的計算節點。
DAG圖的生成過程:-
Solr中使用了倒排索引,什么是倒排索引?
倒排索引是全文索引所使用的一種數據結構,定義為:某個單詞在哪個文檔的標記。eg:
倒排索引 怎么判斷一個字符串為空?
字符串為空有兩種情況:第一種是字符串長度為0,第二種是字符串為空指針。HashMap如何遍歷?
直接調用方法entrySet(),該方法返回一個Set,Set中的元素類型為Entry<...>,得到Set之后使用泛型遍歷。finally語句塊什么時候不會執行?參考:https://www.ibm.com/developerworks/cn/java/j-lo-finally/
- try塊還沒有執行,那么finally語句塊也不會執行。這種情況可能發生在try塊上面有語句終止了程序的運行。
- try塊執行了,但是使用了System.exit(0)這時也不會執行。或者被其他線程中斷了該線程的執行,finally也不會執行。
- jdbc中PreparedStatement相比Statement有什么優勢?參考:http://www.importnew.com/5006.html
- 執行速度更快:前者中執行的sql語句如果再次執行時,數據庫并不需要再對這條查詢語句進行詞法語法分析、優化、編譯等過程,因為數據庫將上次的編譯好的查詢保存了。
- 可以防止SQL注入。
數據庫事務的四大特性?
A(原子性):事務中的語句要么全部執行,要么全部不執行。
C(一致性):執行前后數據庫的一致性仍然保持。
I(獨立性):各個并發的事務互不影響。
D(持久性):事務執行完后對數據庫的修改不會因為服務器故障而丟失,這一點依賴于數據庫的備份和恢復機制。jdbc中getgeneratedkeys()方法何時使用?
當向一個自動生成主鍵的表中插入記錄時,該方法可以用來從數據庫中獲取該表為該條記錄生成的主鍵值。參考:http://java-see.iteye.com/blog/1326233 http://stackoverflow.com/questions/1915166/how-to-get-the-insert-id-in-jdbcCassandra數據庫的結構?
無中心節點的分布式數據庫。主要有3大存儲區:CommiLog、MemTable and SSTable。
CommitLog:位于硬盤,存儲用戶提交的數據和操作記錄。
MemTable:位于內存,用戶寫(增加、修改)的數據先存放到這個區域,該區域滿之后再將數據刷新到SSTable。
SSTable:位于硬盤,用于存儲寫入的數據。Cassandra數據庫如何保證可靠性?
需要滿足Quorum機制:每個集合都有交集。(參考:http://www.cnblogs.com/jzhlin/archive/2012/07/23/Quorum.html )
其實不只是Cassandra數據庫,所有的NoSQL數據庫要保證可靠性都應該滿足如下條件:R+W>N。其中,
R:讀請求所需返回成功的節點數量
W:寫請求所需返回成功的節點數量
N:副本數量Hash函數有哪些?
MD5:輸入不定長,輸出為128位定長數字。原理是:
1)定義四個32位的變量(AD),2)將輸入劃分為等長(512位)的塊,3)對于每個塊將它劃分為等長(32位)的16部分,4)將這16部分數據和AD進行運算,并得到新的A'D',5)將A'D'和AD相加并作為下一個塊計算所需的四個變量。6)對每個塊重復這個過程,最后得到的AD就是128位的MD5值。
除了MD5之外,還有DES、RSA、sha1哈希函數。Cassandra數據庫的數據存儲模式?
Cassandra數據庫基本上采用和關系型數據庫類似的模式。只不過在列數據的存儲上有所不同。關系數據庫一個列就存儲一個Value值,而Cassandra數據庫存儲的是一個Cell,該Cell包括三部分數據:name、value、timestamp。而且各個Cell都是按名稱排列的,以支持切片查詢。CAP定理:參考https://en.wikipedia.org/wiki/CAP_theorem
C(一致性):每次讀都能得到最新的數據。
A(可用性):每次請求都會有回應,但并不保證得到的信息是最新的。
P(分區容錯性):即使有個分區因為網絡故障而不能通信也可以保證系統正常運行。遞歸和迭代的區別?
遞歸需要重復的調用自身,且有終止條件。
所謂迭代就是for循環!!!迭代是將大任務劃分為小任務。前序、中序和后序遍歷算法是僅僅針對于二叉樹的么?
是的。要不你給我舉個例子看看三叉樹的中序遍歷是什么樣的!深度優先搜索和廣度優先搜索?
深度優先搜索非遞歸方式實現需要使用棧來作為輔助(參考:http://blog.csdn.net/lalor/article/details/6845788 ),而廣度優先搜索非遞歸實現則需要使用隊列作為輔助。-
PageRank算法原理?(參考:https://zh.wikipedia.org/wiki/PageRank )
該算法是Google提出的一個對網頁進行排序的算法。其原理是一個網頁的PageRank值等于所有鏈向該網頁的——PR值除以鏈出頁面總數——的和,可以用以下公式表示:
PageRank 隨機森林算法原理?怎么解決決策樹過擬合的問題?
隨機森林是由多顆決策樹組合而成的,最后預測結果由所有決策樹的組合投票得到。其算法原理如下:
對于森林中的每棵樹,有放回的抽取N(數據集大小)個樣本(有放回所以可能有重復的記錄),之后再進行分類。但和普通的決策樹分類不同,此次的分類在每個節點都會隨機的選擇m(m << M)個特征(M為總的特征數量)進行分裂,一直到決策樹不再生長為止。
解決過擬合:
因為隨機森林中的決策樹在每個節點進行分裂的時候用的特征都不是所有的特征,因此模型復雜度有所降低,這對過擬合能起到一定作用。解釋一下死鎖?
進程間死鎖需要四個條件:1)進程間不能相互搶占資源;2)進程持有資源并在等待其他資源釋放;3)進程間互斥;4)存在資源競爭。說一下一個排序算法的原理以及它的時間復雜度?
快速排序,時間復雜度為O(nlogn)KNN算法原理?
KNN算法屬于監督式學習算法,其原理是:
1) 給定一個樣本集以及對應的所屬分類標簽;
2) 給定一條測試記錄,將測試記錄的各個特征和樣本集中所有記錄的特征進行比較,選出k個最相似(距離最近)的記錄,并將這k個記錄所對應分類的眾數作為測試記錄的分類結果。基于比較的排序有哪些:冒泡?桶?基數?希爾?堆排序?
冒泡:基于比較
桶:先將數據劃分到k個桶中,在對每個桶中的所有數據進行排序,時間復雜度為max(O(N), sum(O(Nilog(Ni))))。在劃分桶的時候是基于映射函數,而在桶內排序則是基于排序。
基數:將數據的每個字符當做關鍵字進行桶劃分并排序,直到所有關鍵字排序完成。該算法也不能完全算是基于排序的。
希爾:傳統的插入排序是以步長為1進行全排序,而希爾排序是通過不斷減小步長的大小來對部分數據進行排序,當步長減為1時也就是插入排序。該算法是基于比較的排序算法。
堆排序:數據使用一維數組存儲,算法步驟如下(參考:https://zh.wikipedia.org/wiki/%E5%A0%86%E6%8E%92%E5%BA%8F ):
1) 建堆:將數組調整為堆模式(任一父節點都比其子節點小/大)
2) 原地堆排序:將堆頭和堆尾互換,并將堆大小減1,之后重新調整新堆。
3) 重復第二步直到堆的大小為0。
該算法復雜度為O(nlogn),第一步算法復雜度為O(nlogn),第二步也為O(nlogn)。也是基于比較的排序算法。tcp套接字中不會阻塞的是:read?write?accept?bind?
tcp協議三次握手:參考:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html
在上面那篇帖子中講的非常詳細。不會阻塞的就是bind操作,因為該操作不需要等待另一個進程的回復。序列標注模型(參考:http://weibo.com/p/230418c493e7920102v97b?pids=Pl_Official_CardMixFeedv6__4&feed_filter=1 )
HMM:隱馬爾科夫鏈模型,產生式模型,優點是!!!;缺點是:1)引入了兩條獨立性假設,2)需要列出所有可能地觀察序列,在現實中很難做到。
MEMM:最大熵隱馬爾科夫模型,判別式模型,優點是:不需要HMM的獨立性假設;缺點是:僅對局部進行條件概率求解,導致標注偏置。
CRF:條件隨機場模型,判別式模型,優點是:克服了MEMM的標注偏置;缺點是:訓練代價過高,特征函數復雜度大。選擇題:
EM算法能否求得最優解?不是凸函數可能求不到最優解。
Adaboost算法,所有被錯分的樣本權重更新比例相同?
- 相同
當訓練集較少時更難發生過擬合?
- 過擬合是由于特征數量過多,導致模型復雜度過高,從而發生過擬合,和數據量其實沒有什么關系。
在接口中定義的靜態方法可以重寫么?
可以!!!但是不能定義為靜態方法。工廠方法模式中的工廠方法能否為靜態方法?為什么?
不能!由于靜態方法不能被繼承,因此子類不能覆蓋父類的靜態方法。volatile關鍵字
防止由于編譯器優化而導致的臟讀。由該關鍵字修飾的變量在取值的時候會從內存當中讀取,而非從寄存器中。參考:https://zh.wikipedia.org/wiki/Volatile%E5%8F%98%E9%87%8F哈希表的應用領域?
主要應用在查找(例如:Cassandra中一級索引所使用的數據結構bitmap)、編碼(例如:MD5)以及聚類并發操作會帶來哪些不一致?
臟讀:一個事務A修改了數據但還未來得及提交時,另一個事務B開始讀取數據,那么讀取到的數據為A未提交的數據,此為臟讀。
不可重復讀:一個事務A前后兩次讀到的數據不一致,這是由于A在兩次讀取的中間有另一個事務B對數據進行了修改。
丟失修改:事務A修改了數據但未提交,這時事務B也修改了數據且完成了提交,那么事務A提交修改之后,事務B的修改就丟失了。$!, $?, $*用法?
ref: http://blog.sina.com.cn/s/blog_464f6dba0100psy9.htmlSolr的全文索引原理?參考:(http://www.importnew.com/12707.html )
Solr對一個文檔進行索引主要有兩步:1)對文檔進行分詞,2)對詞進行索引;其中,第一步是Solr需要做的,第二步則是由Solr的內核Lucene完成。那么,讓我們來看看Solr的全文索引原理細節:
1) 對文檔進行分詞:將文檔中的每個詞單獨取出并轉換為最基本的形式,比如說drove、driving都會轉換為drive。
2) 對詞進行索引:對于每個單詞,索引都會存儲該單詞所在的文檔編號以及在該文檔中出現的頻率以及位置。
以上就是Solr全文索引的原理。在最后還需要提一點的是Solr搜索結果的排序,排序所使用的算法是TF-IDF算法。Solr與Lucene的關系?與ElasticSearch有何區別?(參考:http://www.aboutyun.com/thread-17406-1-1.html ,https://endymecy.gitbooks.io/elasticsearch-guide-chinese/content/elasticsearch-vs-solr.html )
Slor和ElasticSearch都是基于Lucene開發的。Solr比較適合離線搜索,而ElasticSearch比較適合實時查詢并且更容易擴展。Cassandra項目中遇到的問題?
- 分頁查詢時結果有重復的問題:(參考:http://zhaoyanblog.com/archives/164.html )
這是由于Cassandra各個節點查詢到主鍵時會對主鍵進行排序,之后再將數據發送到連接節點,連接節點收到數據后不會再對數據進行排序,而是直接刪除連續數據當中重復的,這樣做的目的是效率更高,將大文件的排序分拆為小文件的排序。
而當時我們做的時候沒有對主鍵進行排序,而是直接使用Solr返回的順序,這樣的話,重復的數據就不會連續的排在一起,而是隔開了,那么連接節點在分頁顯示時,顯然會顯示這些隔開了的重復數據,從而導致查詢結果變多。 - ByteBuffer不能序列化的問題:
byteBuffer本身沒有實現Serializable接口,因此不能直接序列化。當時我們的解決方法是將byteBuffer中的字節取出來當做字節數組,這樣的話就可以進行序列化。 - 索引插入過慢的問題:
當時我們將Cassandra索引數據插入到Solr后進行測試,發現數據插入非常緩慢,因此我們就懷疑是Solr數據插入過慢的原因,因為我們就改了那一個地方。之后在網上搜索Solr優化,我們發現Solr有一個自動提交的功能,用戶可以設置記錄達到多少之后進行插入,或者相隔多長時間進行插入。而我們之前就是數據插入一條,就commit一次,這樣就導致數據插入特別慢,耗費了大量時間。我們使用了Solr的自動提交之后,數據插入的速度就得到了大大提高。
- Spark和Mapreduce的區別?
- 它們的架構相同,都是主從節點的模式。由一個master管理多個worker。
- Spark適宜處理的數據量相對MapReduce來說更小,因為Spark基于內存的計算更容易出現數據丟失,比如說服務器斷電了,那內存數據全沒了,但是MapReduce的還在硬盤當中。
- Spark是基于內存的計算,中間數據優先存放在內存當中,計算速度相比MapReduce更快。
- Spark的惰性計算和pipeline可以減少不必要的計算。惰性計算保證了有需要再計算,而pipeline則可以節約大量內存空間。
- spark任務生成和調度原理?
- 任務生成過程:
用戶提交應用程序之后,Spark將程序轉換為一個個的Job,之后由DAGSchedule將每個Job轉換為邏輯計劃圖,之后再對其進行依賴性分析劃分為多個Stage,每個Stage中都可以進行Pipeline。到這一步DAGSchedule就把Stage傳送給TaskSchedule,TaskSchedule收到Stage之后就會將Stage劃分為多個Task,并分發到各個節點去執行。 - 任務調度過程:
任務調度分為兩個部分:1)此時該調度哪個Task去運行;2)調度這個Task去哪個節點運行。對于第一個問題,Spark設計了專門的調度算法去管理,最基本的是FIFO、FAIR調度算法,還要一個是調度池調度算法,我想重點講一下調度池調度。調度池調度是針對多線程并發的情況,每個線程都可以擁有自己的一個任務池,之后這個線程提交的任務都提交到自己的任務池里。在多個任務池之間,管理員可以配置任務池的權重,權重越高獲得的資源就越多,這樣就可以分離大任務和小任務。在任務池之內,任務調度的方式是采用FIFO或者FAIR調度算法。這就是調度池調度。那么第二個問題,對于一個確定的Task,應該把它放到哪個節點去執行?對于Spark,它是根據數據本地性來進行調度的,這里所說的數據指的是任務的輸入數據,數據本地性的優先級是緩存>硬盤>任何一個節點。也就是說,任務優先調度到緩存了所需數據的節點,之后才是硬盤當中有數據的節點,最后才是隨意一個節點都行。
你做的Spark任務調度是基于Standalone模式的,那么在Yarn模式下是否可以使用?
可以!因為Yarn是資源調度器,它并不做任務調度。我們所做的就是和任務調度相關。Java類中的equals方法:(參考:http://mt.sohu.com/20160812/n463986365.shtml )
- 如果存在繼承關系,重寫equals方法時需要考慮父類,那么我們就應該使用getClass方法先判斷兩個對象是否為相同類的實例,之后再調用super.equals()方法來判斷父類實例的屬性值是否相同,最后再判斷自身的其他屬性。
- 重寫equals方法時最好重寫hashCode方法,以免由于使用Map類而出現對象中存在同一個類的兩個屬性相同的實例,因為Map類存放對象是通過key值是否相同,而key的值則是根據對象的hashCode得來的。
- Java八大數據類型:byte、short、char、int、float、double、long、boolean。
- B+tree相對于B Tree的優點?
- B+樹由于數據全都存儲在葉子節點,且葉子節點都使用指針相連接,因此可以提高緩存命中率,減少IO次數。
- B Tree由于數據存儲在各個節點當中,因此可以提高隨機查詢的速度,但范圍查詢沒有B+tree的性能好。
- HashMap和ConcurrentMap的區別?
- HashMap不是線程安全的,ConcurrentMap是線程安全的。
- ConcurrentMap的實現原理是通過將數據分成一段一段,每段由HashTable存儲,HashTable線程安全的實現就是在方法前加上Synchronized修飾符。
-
集合類有哪些?(參考:http://wiki.jikexueyuan.com/project/java-interview-bible/collection.html )
主要有四大類:Set/List/Map/Queue
集 合 類 多線程如何實現同步?
- 使用synchronized修飾方法或者代碼塊。
- 使用java.util.concurrent包下的ReentrantLock/ReentrantReadWriteLock類定義鎖對象,之后在需要同步的方法中調用lock()方法即可實現同步。
- 使用信號量Semaphore,使并發訪問的數量控制為1即可。
- OS中的調度算法?(參考:http://blog.chinaunix.net/uid-25132162-id-361291.html )
- 調度算法分為進程調度算法、頁面置換算法、批處理作業調度算法、磁盤調度算法。
String, StringBuilder, StringBuffer的區別與聯系?
String不可變,StringBuffer線程安全且可變,StringBuilder線程不安全但可變。(參考:http://blog.csdn.net/rmn190/article/details/1492013 )數據庫和數據倉庫?
數據庫面向于用戶,主要用于存儲實時發生的數據以及為用戶提供相關的數據操作,比如說增刪改查等;而數據倉庫面向公司內部,一般用于長時間歷史數據的存儲,為數據挖掘分析提供支持。union和unionall的區別?
union和unionall都是對兩個表的數據合并,不同的是,union會去除重復行并排序,而unionall并不去除重復且不排序。(參考: http://www.cnblogs.com/xiangshu/articles/2054447.html )truncate、drop、delete區別?
- truncate和drop都是數據庫定義語言,而delete是數據庫操作語言。
- truncate僅僅刪除數據,而drop不僅會把數據刪除,同時也會把和表相關的觸發器以及索引等刪除。
- 在Oracle當中,truncate和drop等數據庫定義語言不支持回滾,而delete可以回滾。
如何去除兩個表中相同的數據?
首先使用intersect找到兩個表的交集,之后使用delete語句刪除相同的部分即可。volatile修飾符的適用場合?
volatile修飾符可以用于線程安全,但是功能并沒有synchronized修飾符強大。volatile修飾符僅僅能夠保證:某個線程對數據的修改,可以對其他線程可見。但是并不能像synchronized修飾符那樣保證互斥。(參考:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html )ThreadLocal是干嘛的?適用場合是?
- 功能:該類是用于實現線程安全的,可以保證每個線程都有自己獨立的私有變量,線程之間互不影響。比較適合用于存儲每個線程的交易ID或者用戶ID之類的變量。
- 實現:每個線程(Thread)都有一個ThreadLocalMap變量,該變量得key為ThreadLocal類型,值為所需要存儲的私有變量值。通過創建ThreadLocal對象,并調用.set(value)方法,即可完成私有變量得綁定。set方法的實現是:首先通過Thread.currentThread()獲取當前線程,然后得到該線程的ThreadLocalMap變量map,之后通過該map的set方法將變量和線程進行綁定。(參考:http://www.cnblogs.com/mingforyou/archive/2012/03/10/2389284.html )
虛函數是干嘛的?虛函數和非虛函數有何區別?
在java中,所有未使用final修飾的函數都是虛函數,基類中的虛函數可以被派生類覆蓋。而final修飾的函數則是非虛函數,不能被派生類覆蓋。其中,被private修飾符修飾的方法隱含了final修飾符,所以也不能被派生類覆蓋。(參考:http://www.cnblogs.com/Fc-ios/p/3793989.html )但是static修飾符修飾的方法是不是隱含了final修飾符呢?Solr本身的索引機制是什么?比如說倒排索引?倒排索引會不會存偏移量?偏移量有什么用?
Solr索引機制有很多種,其中最為核心的是用于文檔檢索的倒排索引。倒排索引以單詞作為關鍵字,文檔編號以及關鍵詞的出現頻率作為索引數據。在索引數據當中,偏移量一般也會保存,其作用主要是用于Solr的短語查詢(參考:http://www.tuicool.com/articles/jqQJrm )。你們是怎么將Cassandra查詢語句轉換為Solr查詢的?
我們自己寫了一個轉換器(具體如何實現的我并不是很清楚,由其他成員實現的)。我主要負責索引數據的插入以及查詢數據的讀取。一致性哈希是啥?
一致性哈希主要用于分布式存儲系統當中解決負載均衡的問題。傳統哈希在數組長度發生變化時,數據全都需要重新洗牌,因為哈希函數和數組長度相關。與之不同的是,一致性哈希和數組長度并不相關,數組長度的改變并不能影響到所有數據的存儲,只會影響部分數據的存儲。舉個例子來說,在Cassandra數據庫當中就用到了一致性哈希來進行數據的負載均衡。它是這么做的,首先得到哈希函數的取值范圍,之后每個節點分別負責存儲某個值域之間的數據。當Cassandra集群當中的某個節點宕機后,該節點存放的數據就會由它相鄰的節點進行存儲。當Cassandra集群增加節點時,它就會將屬于該節點值域內的數據存儲到這個節點當中。Spark當中的廣播變量
當一個作業的多個任務使用到相同的數據集時才需要使用到,當使用這種廣播變量時,變量被廣播到節點上的副本不能被修改,只能讀。Spark你為什么使用Standalone模式?其他的調度模式是如何的?有什么區別?
因為Spark本身的Standalone模式能夠滿足我們的需求,所以采用這種模式。
因為我們關注的是任務調度,而非資源調度。Standalone以及Yarn等都是資源調度器,和Spark本身的任務調度關系不大,因此我們也并不需要去糾結到底采用哪種模式更好。
目前Spark可以以Standalone、Yarn以及Mesos這三種方式進行部署,這三種調度模式有何區別?Mesos給予應用程序對資源的選擇權,應用程序可以通過自身的調度算法來判斷Mesos所分配的資源對自己是否合適。而Yarn分配資源之后,應用程序沒有選擇權,Yarn直接決定了應用程序的執行位置。單例模式注意點:
- 構造函數設置為私有
- 使用懶漢模式需要使用同步