1. 程式人生 > >大資料相關面試題整理(簡單)

大資料相關面試題整理(簡單)

1、hadoop:
  1)hadoop是大資料分析的完整生態系統,從資料採集,儲存,分析,轉運,再到頁面展示,構成了整個流程  
  2)採集可以用flume,
  3)儲存用hbase,hdfs,mangodb就相當於hbase,
  4)分析用Mapreduce自己寫演算法,
  5)還有hive做資料倉庫,
  6)pig做資料流處理,
  7)轉儲方面有sqoop,可以將hdfs中的資料轉換儲存到mysql,oracle等傳統資料庫,
這就構成了一整套大資料分析的整個流程


2、Hadoop 叢集可以執行的 3 個模式分別是什麼, 都有哪些注意點?  
  單機模式、偽分散式模式、全分散式模式;


3、Hadoop 的核心配置檔案? 
  1)以前是hadoop-default.xml、hadoop-site.xml
  2)現在是core-site.xml、hdfs-site.xml、mapred-site.xml;都在conf目錄下;


4、hdfs-site.xml 的 3 個主要屬性? 
  1)dfs.name.dir 決定的是元資料儲存的路徑以及 DFS 的儲存方式(磁碟或是遠端)
  2)dfs.data.dir 決定的是資料儲存的路徑
  3)fs.checkpoint.dir 用於第二 Namenode


5、簡述HDFS的原理? 
  1)客戶端向 nameNode 傳送要上傳檔案的請求
  2)nameNode 返回給使用者是否能上傳資料的狀態
  3)加入使用者端需要上傳一個 1024M 的檔案,客戶端會通過 Rpc 請求 NameNode,並返回需要上傳給那些 DataNode(分配機器的距離以及空間的大小等),namonode會選擇就近原則分配機器。
  4)客戶端請求建立 block 傳輸管道 channel 上傳資料
  5)在上傳時 datanode 會與其他的機器建立連線並把資料塊傳送到其他的機器上
  6)dataNode 向 namenode 彙報自己的儲存情況以及自己的資訊
  7)當第一個塊上傳完後再去執行其他的複製的傳送


6、簡述MR(MapReduce)的原理? 
  1)當執行mr程式時,會執行一個Job
  2)客戶端的jobClick會請求namenode的jobTracker要執行任務
  3)jobClick會去HDFS端複製作業的資原始檔
  4)客戶端的jobClick會向namenode提交作業,讓namenode做準備
  5)Namenode的jobTracker會去初始化建立的物件
  6)Namenode會獲取hdfs的劃分的分割槽
  7)Namenode去檢查TaskTracker的心跳資訊,檢視存活的機器
  8)當執行的datenode執行任務時Datenode會去HDFS獲取作業的資源的檔案
  9)TaskTracker會去執行程式碼,並登陸JVM的執行渠道
  10)JVM或執行MapTask或者ReduceTask
  11)執行終結


7、談談資料傾斜,如何發生的,並給出優化方案
     資料的傾斜主要是兩個的資料相差的數量不在一個級別上,在執行任務時就造成了資料的傾斜,可以通過分割槽的方法減少reduce資料傾斜效能的方法,例如:抽樣和範圍的分割槽、自定義分割槽、資料大小傾斜的自定義策略;


8、簡單概括安裝hadoop的步驟
  1)建立 hadoop 帳戶。
  2)setup.改 IP。
  3)安裝 java,並修改/etc/profile 檔案,配置 java 的環境變數。
  4)修改 Host 檔案域名。
  5)安裝 SSH,配置無金鑰通訊。
  6)解壓 hadoop。
  7)配置 conf 檔案下 hadoop-env.sh、core-site.sh、mapre-site.sh、hdfs-site.sh。
  8)配置 hadoop 的環境變數。
  9)Hadoop namenode -format
  10)start-all.sh


9、怎樣快速的殺死一個job
  1)執行hadoop  job -list  拿到job-id
  2)Hadoop job kill hadoop-id


10、簡單概述hadoop的combinet與partition的區別
  1)combine和partition都是函式,中間的步驟應該只有shuffle! 
  2)combine分為map端和reduce端,作用是把同一個key的鍵值對合並在一起,可以自定義的;
  3)partition是分割map每個節點的結果,按照key分別對映給不同的reduce,也是可以自定義的。這裡其實可以理解歸類。


11、hadoop的shuffer的概念
  1)Shuffer是一個過程,實在map端到reduce在調reduce資料之前都叫shuffer,主要是分割槽與排序,也就是內部的快取分分割槽以及分發(是reduce來拉資料的)和傳輸;


12、3 個 datanode 中有一個 個datanode 出現錯誤會怎樣?
    這個 datanode 的資料會在其他的 datanode 上重新做備份。


13、簡單概述一下hadoop1與hadoop2的區別
  1)Hadoop2與hadoop1最大的區別在於HDFS的架構與mapreduce的很大的區別,而且速度上有很大的提升;
  2)hadoop2最主要的兩個變化是:namenode可以叢集的部署了,hadoop2中的mapreduce中的jobTracker中的資源排程器與生命週期管理拆分成兩個獨立的元件,並命名為YARN


14、hadoop的二次排序
  1)Hadoop預設的是HashPartitioner排序,當map端一個檔案非常大另外一個檔案非常小時就會產生資源的分配不均勻,既可以使用setPartitionerClass來設定分割槽,即形成了二次分割槽。


15、mapreduce的combiner的作用是什麼,什麼時候不應該使用?
  1)Mapreduce中的Combiner就是為了避免map任務和reduce任務之間的資料傳輸而設定的,Hadoop允許使用者針對map task的輸出指定一個合併函式。即為了減少傳輸到Reduce中的資料量。它主要是為了削減Mapper的輸出從而減少網路頻寬和Reducer之上的負載。
  2)在資料量較少時不宜使用。


16、你對zookeeper的理解?
  1)隨著大資料的快速發展,多機器的協調工作,避免主要機器單點故障的問題,於是就引入管理機器的一個軟體,他就是zookeeper來協助機器正常的執行。
  2)Zookeeper有兩個角色分別是leader與follower ,其中leader是主節點,其他的是副節點,在安裝配置上一定要注意配置奇數個的機器上,便於zookeeper快速切換選舉其他的機器。
  3)在其他的軟體執行任務時在zookeeper註冊時會在zookeeper下生成相對應的目錄,以便zookeeper去管理機器。


17、hive是怎樣儲存元資料的?
  1)儲存元資料的方式有:記憶體資料庫rerdy,本地mysql資料庫,遠端mysql資料庫;
  2)但是本地的mysql資料用的比較多,因為本地讀寫速度都比較快


18、Hive中外部表與內部表的區別
  1)Hive 建立內部表時,會將資料移動到資料倉庫指向的路徑;若建立外部表,僅記錄資料所在的路徑,不對資料的位置做任何改變。
  2)在刪除表的時候,內部表的元資料和資料會被一起刪除,而外部表只刪除元資料,不刪除資料。這樣外部表相對來說更加安全些,資料組織也更加靈活,方便共享源資料。


19、對於 hive,你寫過哪些 UDF 函式,作用是什麼?
  1)UDF: user  defined  function  的縮寫,
  1)編寫hive udf的兩種方式extends UDF 重寫evaluate第二種extends GenericUDF重寫initialize、getDisplayString、evaluate方法


20、Hive 的 sort by 和 order by 的區別
  1)order by 會對輸入做全域性排序,因此只有一個reducer(多個reducer無法保證全域性有序)只有一個reducer,會導致當輸入規模較大時,需要較長的計算時間。
  2)sort by不是全域性排序,其在資料進入reducer前完成排序.因此,如果用sort by進行排序,並且設定mapred.reduce.tasks>1, 則sort by只保證每個reducer的輸出有序,不保證全域性有序。


21、Hbase 的 rowkey 怎麼建立比較好?列族怎麼建立比較好?
  1)Rowkey是一個二進位制碼流,Rowkey的長度被很多開發者建議說設計在10~100個位元組,不過建議是越短越好,不要超過16個位元組。在查詢時有索引會加快速度。
  2)Rowkey雜湊原則 、 Rowkey唯一原則 、 針對事務資料Rowkey設計 、 針對統計資料的Rowkey設計 、 針對通用資料的Rowkey設計、 支援多3)總結設計列族:
    a、一般不建議設計多個列族
    b、資料塊的快取的設計
    c、激進快取設計
    d、布隆過濾器的設計(可以提高隨機讀取的速度)
    e、生產日期的設計
    f、列族壓縮
    g、單元時間版本


22、hive 如何調優?
  1)在優化時要注意資料的問題,儘量減少資料傾斜的問題,減少job的數量,同事對小的檔案進行成大的檔案,
  2)如果優化的設計那就更好了,因為hive的運算就是mapReduce所以調節mapreduce的引數也會使效能提高,如調節task的數目。


23、hbase 寫資料的原理
  1)首先,Client通過訪問ZK來請求目標資料的地址。
  2)ZK中儲存了-ROOT-表的地址,所以ZK通過訪問-ROOT-表來請求資料地址。
  3)同樣,-ROOT-表中儲存的是.META.的資訊,通過訪問.META.表來獲取具體的RS。
  4).META.表查詢到具體RS資訊後返回具體RS地址給Client。
  5)Client端獲取到目標地址後,然後直接向該地址傳送資料請求


24、hbase宕機瞭如何處理?
  1)HBase的RegionServer宕機超過一定時間後,HMaster會將其所管理的region重新分佈到其他活動的RegionServer上,由於資料和日誌都持久在HDFS中,該操作不會導致資料丟失。所以資料的一致性和安全性是有保障的。
  2)但是重新分配的region需要根據日誌恢復原RegionServer中的記憶體MemoryStore表,這會導致宕機的region在這段時間內無法對外提供服務。
  3)而一旦重分佈,宕機的節點重新啟動後就相當於一個新的RegionServer加入叢集,為了平衡,需要再次將某些region分佈到該server。 
  4)因此,Region Server的記憶體表memstore如何在節點間做到更高的可用,是HBase的一個較大的挑戰。


25、Hbase 中的 metastore 用來做什麼的?
  1)Hbase的metastore是用來儲存資料的,
  2)其中儲存資料的方式有有三種第一種於第二種是本地儲存,第二種是遠端儲存這一種企業用的比較多


26、hbase是怎樣預分割槽的?
  如何去進行預分割槽,可以採用下面三步:
  1)取樣,先隨機生成一定數量的rowkey,將取樣資料按升序排序放到一個集合裡
  2)根據預分割槽的region個數,對整個集合平均分割,即是相關的splitKeys.
  3)HBaseAdmin.createTable(HTableDescriptor tableDescriptor,byte[][] splitkeys)可以指定預分割槽的splitKey,即是指定region間的rowkey臨界值


27、怎樣將 mysql 的資料匯入到 hbase 中?
  1)不能使用 sqoop,速度太慢了,提示如下:
    A、一種可以加快批量寫入速度的方法是通過預先建立一些空的 regions,這樣當資料寫入 HBase 時,會按照 region 分割槽情況,在叢集內做資料的負載均衡。
    B、hbase 裡面有這樣一個 hfileoutputformat 類,他的實現可以將資料轉換成 hfile格式,通過 new 一個這個類,進行相關配置,這樣會在 hdfs 下面產生一個檔案,這個時候利用 hbase 提供的 jruby 的 loadtable.rb 指令碼就可以進行批量匯入。


28、Redis, 傳統資料庫,hbase,hive  每個之間的區別?
  1)Redis 是基於記憶體的資料庫,注重實用記憶體的計算,
  2)hbase是列式資料庫,無法建立主鍵,地從是基於HDFS的,每一行可以儲存很多的列,
  3)hive是資料的倉庫,是為了減輕mapreduce而設計的,不是資料庫,是用來與hadoop做互動的。


29、HBase scan setBatch和setCaching的區別
  1)scan可以通過setCaching與setBatch方法提高速度(以空間換時間),
  2)setCaching設定的值為每次rpc的請求記錄數,預設是1;cache大可以優化效能,但是太大了會花費很長的時間進行一次傳輸。
  3)setBatch設定每次取的column size;有些row特別大,所以需要分開傳給client,就是一次傳一個row的幾個column。


30、flume 不採集 Nginx 日誌,通過 Logger4j 採集日誌,優缺點是什麼?
  1)在nginx採集日誌時無法獲取session的資訊,然而logger4j則可以獲取session的資訊,
  2)logger4j的方式比較穩定,不會宕機。缺點:不夠靈活,logger4j的方式和專案結合過濾緊密,而flume的方式就比較靈活,便於插拔式比較好,不會影響專案的效能。


31、flume 和 kafka 採集日誌區別,採集日誌時中間停了,怎麼記錄之前的日誌。
  1)Flume 採集日誌是通過流的方式直接將日誌收集到儲存層,而 kafka 將日誌快取在 kafka叢集,待後期可以採集到儲存層。
  2)Flume 採集中間停了,可以採用檔案的方式記錄之前的日誌,而 kafka 是採用 offset(偏移量) 的方式記錄之前的日誌。


32、kafka 中怎樣儲存資料結構的,data.....目錄下有多少個分割槽,每個分割槽的儲存格式是什麼樣的?
  1)topic 是按照“主題名-分割槽”儲存的
  2)分割槽個數由配置檔案決定
  3)每個分割槽下最重要的兩個檔案是 0000000000.log 和 000000.index,0000000.log,以預設 1G 大小回滾。


33、mr 和 spark 區別,怎麼理解 spark-rdd
  1)Mr 是檔案方式的分散式計算框架,是將中間結果和最終結果記錄在檔案中,map 和 reduce的資料分發也是在檔案中。
  2)spark 是記憶體迭代式的計算框架,計算的中間結果可以快取記憶體,也可以快取硬碟,但是不是每一步計算都需要快取的。
  3)spark-rdd 是一個數據的分割槽記錄集合,是利用記憶體來計算的,spark之所以快是因為有記憶體的模式


34、你們的叢集規模?
  1)這個得看個人在公司的規模,下面介紹一下我們公司的一些配置:
    聯想System x3750  伺服器,價格3.5萬,記憶體容量32G,產品型別機架式,硬碟介面SSD,CPU頻率2.6GH,CPU數量2顆,三級快取15MB,cpu核心6核,cpu執行緒數12執行緒,最大記憶體支援1.5T,網路是千兆網絡卡,可插拔時硬碟介面12個卡槽,配置1T的容量
詳細:http://detail.zol.com.cn/server/index1101243.shtml
名字                               軟體                     執行管理
Hadoop1                           JDK,hadoop                namenode
Hadoop2                           JDK,hadoop                namenode
Hadoop3                           JDK,hadoop                secondaryNamenode
Hadoop4                           JDK,hadoop                secondaryNamenode
Hadoop5                           JDK,hadoop                datanode
Hadoop6                           JDK,hadoop                datanode
Hadoop7                           JDK,hadoop                datanode
Hadoop8                           JDK,hadoop                datanode
Hadoop9                           JDK,hadoop                datanode
Hadoop10                          JDK,zookeeper,tomcat,mvn,kafka leader
Hadoop11                          JDK,zookeeper,tomcat,mvn,kafka  follower
Hadoop12                          JDK,zookeeper,tomcat,mvn,kafka  follower
Hadoop13                          JDK,hive,mysql,svn,logstarh    hive,mysql,svn
Hadoop14                          JDK,hbase,mysql備份        datanode
Hadoop15                          JDK,nginx,Log日誌手機       datanode
資料就是每天訪問的Log日誌不是很大,有的時候大有的時候小的可憐


35、你在專案中遇到了哪些難題,是怎麼解決的?
  1)在執行任務時發現副本的個數不對,經過一番的查詢發現是超時的原因,修改了配置檔案hdfs-site.xml:中修改了超時時間。
  2)由於當時在分配各個目錄空間大小時,沒有很好的分配導致有的目錄的空間浪費,於是整體商量後把儲存的空間調大了一些。