利剑无意之面试题(三)
- hive的計算是通過什么實現的
?
hive是搭建在Hadoop集群上的一個SQL引擎,它將SQL語句轉化成了MapReduce程序在Hadoop上運行,所以hive的計算引擎是MapReduce,底層存儲采用的是HDFS。
- 為什么不用Java的序列化serilazable
Java的序列化是一個重量級序列化框架(Serializable),一個對象被序列化后,會附帶很多額外的信息(各種校驗信息,header,繼承體系等),不便于在網絡中高效傳輸。所以,hadoop自己開發了一套序列化機制(Writable),特點如下:
1.緊湊
緊湊的格式能讓我們充分利用網絡帶寬,而帶寬是數據中心最稀缺的資源
2.快速
進程通信形成了分布式系統的骨架,所以需要盡量減少序列化和反序列化的性能開銷,這是基本的;
3.可擴展
協議為了滿足新的需求變化,所以控制客戶端和服務器過程中,需要直接引進相應的協議,這些是新協議,原序列化方式能支持新的協議報文;
4.互操作
能支持不同語言寫的客戶端和服務端進行交互;
- MapReduce工作流程
1>輸入分片(input split):在進行map計算之前,mapreduce會根據輸入文件計算輸入分片(input split),每個輸入分片(input split)針對一個map任務,輸入分片(input split)存儲的并非數據本身,而是一個分片長度和一個記錄數據的位置的數組,輸入分片(input split)往往和hdfs的block(塊)關系很密切,假如我們設定hdfs的塊的大小是64mb,如果我們輸入有三個文件,大小分別是3mb、65mb和127mb,那么mapreduce會把3mb文件分為一個輸入分片(input split),65mb則是兩個輸入分片(input split)而127mb也是兩個輸入分片(input split),換句話說我們如果在map計算前做輸入分片調整,例如合并小文件,那么就會有5個map任務將執行,而且每個map執行的數據大小不均,這個也是mapreduce優化計算的一個關鍵點。
2>map階段:就是我們寫的map函數,map函數效率相對好控制,而且一般map操作都是本地化操作也就是在數據存儲節點上進行;map函數每次處理一行數據,map主要用于數據的分組,為下一步reduce的運算做數據準備,map的輸出就是reduce的輸入。
3>combiner階段:combiner階段是可選的,combiner是一個本地化的reduce操作,它是map運算的后續操作,主要是在map計算出中間文件前做一個簡單的合并重復key值的操作,使傳入reduce的文件變小,這樣就提高了寬帶的傳輸效率,畢竟hadoop計算力寬帶資源往往是計算的瓶頸也是最為寶貴的資源,但是combiner操作是有風險的,使用它的原則是combiner的輸入不會影響到reduce計算的最終輸入,例如:如果計算只是求總數,最大值,最小值可以使用combiner,但是做平均值計算使用combiner的話,最終的reduce計算結果就會出錯。
4>Partitioner階段,一個Partitioner對應一個reduce作業,如果我們mapreduce操作只有一個reduce操作,那么Partitioner就只有一個,Partitioner因此就是reduce的輸入分片,這個我們可以編程控制,主要是根據實際key和value的值,根據實際業務類型或者為了更好的reduce負載均衡要求進行,這是提高reduce效率的一個關鍵所在。
5>reduce階段:我們編寫的reduce函數,reduce的輸入是map的輸出,reduce是主要的邏輯運算階段,我們絕大部分業務邏輯都是在reduce階段完成的,并把最終結果存儲在hdfs上的。
- 如何決定一一個job中需要多少個maptask和reducetask ?
?
一、影響map個數,即split個數的因素主要有:
1)HDFS塊的大小,即HDFS中dfs.block.size的值。如果有一個輸入文件為1024m,當塊為256m時,會被劃分為4個split;當塊為128m時,會被劃分為8個split。
2)文件的大小。當塊為128m時,如果輸入文件為128m,會被劃分為1個split;當塊為256m,會被劃分為2個split。
3)文件的個數。FileInputFormat按照文件分割split,并且只會分割大文件,即那些大小超過HDFS塊的大小的文件。如果HDFS中dfs.block.size設置為64m,而輸入的目錄中文件有100個,則劃分后的split個數至少為100個。
4)splitsize的大小。分片是按照splitszie的大小進行分割的,一個split的大小在沒有設置的情況下,默認等于hdfs block的大小。但應用程序可以通過兩個參數來對splitsize進行調節。
map個數的計算公式如下:
splitsize=max(minimumsize,min(maximumsize,blocksize))。
如果沒有設置minimumsize和maximumsize,splitsize的大小默認等于blocksize
?
二、reduce端的個數取決于用戶的需求,默認是有一個reduce,可以在代碼中聲明【由分區決定】
reduce的輸出個數
?
- 手寫Word Count的Mapper和Reducer
?
- hive內部表和外部表的區別?
?
分別從創建和刪除兩方面說:
創建:
外部表需要使用external關鍵字指定,需要使用location指定存儲數據的位置
內部表不需要指定數據存儲的路徑,直接將數據存儲在默認的目錄下
刪除:
外部表的數據由hdfs管理,元數據由hive管理,刪除的時候只刪除元數據,不刪除表數據
內部表的數據和元數據均有hive來管理,刪除的時候全部刪除
- hive的元數據和存儲引|擎
?
元數據包括表的名字,列、分區,目錄等其他屬性信息,存儲在存儲引擎中。
默認使用Derby數據庫,缺點:一次只能打開一個會話。
可以使用MySQL,優點:允許多用戶訪問。
- 請談- - -下hive的特點是什么? hive和RDBMS有什么異同?
?
hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供完整的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
數據庫:用戶與數據庫交互,提交 SQL 語句后,馬上見到執行結果;存放業務數據;數據庫提出范式的概念是為了解決數據冗余和耦合的問題;數據庫給業務數據提供存儲支撐。
數據倉庫:不與用戶交互;存放歷史數據;反范式設計,專門引入冗余數據,保證數據完整。數據倉庫面向分析,里面存放的數據用來做分析和挖掘
- Hive數據傾斜原因
?
key分布不均勻
業務數據本身的特性
SQL語句造成數據傾斜
- 從架構設計、部署方式、使用方法、應用場景等方面,比較tfs、hdfs、fastdfs、 Tachyon的異同。
?
https://georgedage.blog.csdn.net/article/details/102756152
總結
以上是生活随笔為你收集整理的利剑无意之面试题(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利剑无意之面试题(二)
- 下一篇: 用 Flink 取代 Spark Str