中國大數據教育領跑者

IT培訓上市機構

您現在的位置:首頁 > 大數據培訓 > 大數據面試題>大數據面試題整理 -- hadoop 部分(1)>

大數據面試題整理 -- hadoop 部分(1)

2019-04-12 13:29:14 作者:魔據大數據學院

 一、 hadoop 離線部分

 
1. hadoop HA 集群都要啟動哪些進程,他們的作用是什么
 
Namenode:(1) 維護文件系統的目錄樹,管理文件系統的 namespace、(2) 管理元數據信息、(3) 接收用戶的請求
 
DFSZKFailoverController(ZKFC):負責namenode的故障切換
 
QuorumPeerMain:zookeeper 進程
 
DataNode:HDFS 的工作節點,負責實際的數據存儲
 
ResourceManager:YARN 集群中負責資源協調和管理的進程
 
NodeManager:ResourceManager 在每臺機器上的代理,負責容器管理,并監控它們的資源使用情況,以及向 ResourceManager/Scheduler 提供資源使用情況報告。
 
JournalNode:用來同步 active namenode 和standby namenode 之間的元數據
 
2. 簡要說明下安裝配置hadoop的步驟,描述即可,無需列出完整步驟
 
創建 hadoop 用戶,安裝 JDK,安裝 SSH 并配置免密碼通信
 
修改環境變量,配置 hosts
 
解壓 hadoop 安裝包,修改配置文件,分別是 core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、hadoop-env.sh、yarn-env.sh、slaves
 
其中:
 
core-site.xml 主要配置:(1) hdfs 的 namenode 的地址、(2) hadoop 運行時產生文件的存儲目錄
 
hdfs-site.xml 主要配置:(1) 副本數量、(2) namenode 的工作目錄、(3) datanode 的工作目錄、(3) secondary namenode 的地址
 
yarn-site.xml 主要配置:(1) 指定 ResourceManager 的地址、(2) reducer獲取數據的方式
 
mapred-site.xml 主要配置:mapreduce 運行的 framework 為 yarn
 
hadoop-env.sh 和 yarn-env.sh 主要配置:JAVA_HOME
 
slaves:配置 slave 節點
 
將安裝包 copy 到其他機器
 
執行 Hadoop namenode -format 命令
 
start-dfs.sh、start-yarn.sh 啟動集群
 
3. Hadoop HA 模式下集群啟動的步驟
 
下面以7臺虛擬機為例進行說明:
 
安裝時的初始化集群步驟
 
啟動 zookeeper 集群。
 
格式化ZooKeeper集群,目的是在ZooKeeper集群上建立HA的相應節點。/home/hadoop/hadoop/bin/hdfs zkfc –formatZK
 
啟動JournalNode集群。/home/hadoop/hadoop/sbin/hadoop-daemon.sh start journalnode
 
格式化master1的namenode。/home/hadoop/hadoop/bin/hdfs namenode -format -clusterId hellokitty
 
啟動master1上的namenode。/home/hadoop/hadoop/sbin/hadoop-daemon.sh start namenode
 
在master1ha上執行,將master1上的namenode數據同步到master1ha上。/home/hadoop/hadoop/bin/hdfs namenode -bootstrapStandby
 
啟動master1ha的namenode。/home/hadoop/hadoop/sbin/hadoop-daemon.sh start namenode
 
將master1的namenode置成active狀態,分別在 active 和 standby 上執行。/home/hadoop/hadoop/sbin/hadoop-daemon.sh start zkfc
 
格式化并啟動第二套集群,步驟同 4 ~ 8。
 
啟動所有的datanode。/home/hadoop/hadoop/sbin/hadoop-daemon.sh start datanode
 
啟動 yarn。/home/hadoop/hadoop/sbin/start-yarn.sh
 
停止集群的順序
 
在master1上執行:stop-dfs.sh,stop-yarn.sh
在master2上執行:stop-yarn.sh
停止zookeeper
啟動的順序
 
啟動zookeeper
啟動journalnode
在master1上執行命令,啟動 hdfs 和 yarn
在master2上執行命令,啟動 yarn
3. 簡要說明執行命令
 
殺死一個 job
 
yarn application -kill <applicationid>
 
刪除 hdfs 上的 /tmp/aaa 目錄
 
hdfs dfs -rm -r /tmp/aaa
 
加入一個新存儲節點和移除一個節點需要刷新集群狀態的命令
 
新節點加入:hadoop-daemon.sh start datanode、yarn-daemon.sh start nodemanager
 
移除節點:hdfs dfsadmin -refreshNodes、yarn rmadmin -refreshNodes
 
4. 列出 hadoop 的調度器,并說明工作方法
 
默認的調度器 FIFO
 
Hadoop 中默認的調度器,它先按照作業的優先級高低,再按照到達時間的先后選擇被執行的作業。
 
計算能力調度器 Capacity Scheduler ( YARN 默認調度器 )
 
可以看作是 FIFO Scheduler 的多隊列版本。每個隊列可以限制資源使用量。但是,隊列間的資源分配以使用量作排列依據,使得容量小的隊列有競爭優勢。調度時,首先按以下策略選擇一個合適隊列:計算每個隊列中正在運行的任務數與其應該分得的計算資源之間的比值,選擇一個該比值最小的隊列;然后按以下策略選擇該隊列中一個作業:按照作業優先級和提交時間順序選擇,同時考慮用戶資源量限制和內存限制。
 
公平調度器 Fair Scheduler
 
計算能力調度器類似,支持多隊列多用戶,每個隊列中的資源量可以配置,==同一隊列中的作業公平共享隊列中所有資源。當單獨一個作業在運行時,它將使用整個集群==。當有其它作業被提交上來時,系統會將任務(task)空閑資源(container)賦給這些新的作業,以使得每一個作業都大概獲取到等量的CPU時間。
 
適用于異構集群的調度器LATE
 
現有的Hadoop調度器都是建立在同構集群的假設前提下,LATE建立在集群異構的情況。
 
適用于實時作業的調度器 Deadline Scheduler 和 Constraint-based Scheduler
這種調度器主要用于有時間限制的作業(Deadline Job),即給作業一個deadline時間,讓它在該時間內完成。實際上,這類調度器分為兩種,軟實時(允許作業有一定的超時)作業調度器和 硬實時(作業必須嚴格按時完成)作業調度器。
 
Deadline Scheduler主要針對的是軟實時作業,該調度器根據作業的運行進度和剩余時間動態調整作業獲得的資源量,以便作業盡可能的在deadline時間內完成。
Constraint-based Scheduler主要針對的是硬實時作業,該調度器根據作業的deadline和當前系統中的實時作業運行情況,預測新提交的實時作業能不能在deadline時間內完成,如果不能,則將作業反饋給用戶,讓他重調整作業的deadline。
5. hive 保存元數據有哪些方式,各有哪些特點
 
三種方式:1. 內存數據庫 derby、2. 本地 metastore、3. 遠程 metastore
 
內存數據庫 derby
 
使用derby存儲方式時,運行hive會在當前目錄生成一個derby文件和一個metastore_db目錄。==這種存儲方式的弊端是在同一個目錄下同時只能有一個hive客戶端能使用數據庫,否則會提示如下錯誤(這是一個很常見的錯誤)。==
 
hive> show tables;
FAILED:
 Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to 
start database 'metastore_db', see the next exception for details.
NestedThrowables:
java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
本地和遠程 metastore
 
本地元存儲和遠程元存儲的區別是:本地元存儲不需要單獨起 metastore 服務,用的是跟 hive 在同一個進程里的 metastore 服務。遠程元存儲需要單獨起 metastore 服務,然后每個客戶端都在配置文件里配置連接到該 metastore 服務。遠程元存儲的 metastore 服務和 hive 運行在不同的進程里。在生產環境中,建議用遠程元存儲來配置 Hive Metastore。
 
6. mapreduce 如何實現二次排序
 
我是對的,可以參考 mapreduce-demos 的 secondarysort 類。
 
可以考慮將二次排序的字段組合在一起,形成組合 key,可以考慮封裝對象,實現 WritableComparable 接口。
 
定義分區的 Partitioner 類,繼承 org.apache.hadoop.mapreduce.Partitioner 類,根據 key 的第一個字段進行分區。
 
定義分組函數類 GroupingComparator,讓相同 key 的數據變成一組,進入到 reduce。
 
main 方法中設置 job.setGroupingComparatorClass(XXX.class);
 
==TODO: 還有一種方法要補充。記得有一個 sort 什么的東西==
 
7. mapreduce 實現 join 的幾種方法
 
1. map side join:
 
兩份數據中,如果有一份數據比較小,小數據全部加載到內存,按關鍵字建立索引。大數據文件作為 map 的輸入文件,對 map() 函數每一對輸入,都能夠方便地和已加載到內存的小數據進行連接。把連接結果按 key 輸出,經過 shuffle 階段,reduce 端得到的就是已經按 key 分組的,并且連接好了的數據。
 
這種方法,要使用 hadoop 中的 DistributedCache 把小數據分布到各個計算節點,每個 map 節點都要把小數據庫加載到內存,按關鍵字建立索引。
 
但這種方法有明顯的局限性:有一份數據比較小,在map端,能夠把它加載到內存,并進行join操作。
 
2. reduce side join:
 
在 map 階段, 把關鍵字作為 key 輸出,并在 value 中標記出數據是來自 data1 還是 data2。因為在 shuffle 階段已經自然按 key 分組,reduce 階段,判斷每一個 value 是來自 data1 還是 data2,在內部分成 2 組,做集合的乘積。
 
但這種方法有 2 個問題:
 
map階段沒有對數據瘦身,shuffle的網絡傳輸和排序性能很低。
reduce端對2個集合做乘積計算,很耗內存,容易導致OOM。
3. 使用內存服務器,擴大節點的內存空間
 
針對 map join,可以把一份數據存放到專門的內存服務器,在 map() 方法中,對每一個的輸入對,根據 key 到內存服務器中取出數據,進行連接。
 
4. 使用 BloomFilter 過濾空連接的數據,實現 reduce 端 join
 
對其中一份數據在內存中建立 BloomFilter,另外一份數據在連接之前,用 BloomFilter 判斷它的 key 是否存在,如果不存在,那這個記錄是空連接,可以忽略。
 
適用場景
 
連接的列數據量很大,在分布式緩存中無法存儲時,Bloom Filter 可解決這個問題,用很小的內存可有 MAP 端過濾掉不需要 JOIN 的數據,這樣傳到 REDUCE 的數據量減少,減少了網絡傳及磁盤 IO。
 
缺點:Bloom Filter 會有一定的錯誤率,但是錯誤率很低,用空間換取了時間。并且,最終的 JOIN 在 REDUCE 端還要進行比對,所以對最終結果無影響。
 
8. hive 的內部表和外部表的區別
 
內部表導入數據會將 hdfs 中的文件直接移動到 hive 的 warehouse 目錄中去,相當于是剪切。當要刪除這個內部表的時候,warehouse 中存儲的文件也會一起刪除,元數據信息也會刪除。
 
外部表導入數據時數據不會移動到 hive 的數據倉庫中,數據還是在 hdfs 中,當要刪除外部表的時候,僅僅只是刪除了元數據,hdfs 中的數據文件還是存在的。
 
9. hbase 的 rowkey 如何設計,列族如何設計
 
10. mapreduce 如何解決 shuffle 中的數據傾斜問題
 
詳細可以參考美團技術博客。
 
方案一:對 key 進行打散
 
(1) 設置一個hash份數N,用來對條數眾多的key進行打散。
 
(2) 對有多條重復 key 的那份數據進行處理:從 1 到 N 將數字加在 key 后面作為新 key,如果需要和另一份數據關聯的話,則要重寫比較類和分發類,如此實現多條 key 的平均分發。
 
(3) 上一步之后,key 被平均分散到很多不同的 reduce 節點。如果需要和其他數據關聯,為了保證每個 reduce 節點上都有關聯的 key,對另一份單一key的數據進行處理:循環的從1到N將數字加在 key 后面作為新 key
 
以此解決數據傾斜的問題,經試驗大大減少了程序的運行時間。但此方法會成倍的增加其中一份數據的數據量,以增加 shuffle 數據量為代價,所以使用此方法時,要多次試驗,取一個最佳的 hash 份數值。
 
用上述的方法雖然可以解決數據傾斜,但是當關聯的數據量巨大時,如果成倍的增長某份數據,會導致 reduce shuffle 的數據量變的巨大,得不償失,從而無法解決運行時間慢的問題。
 
方案二:增加 reduce 個數
 
針對唯一值較多,單個唯一值的記錄數不會超過分配給 reduce 的內存的情況。如果發生了偶爾的數據傾斜情況,增加 reduce 個數可以緩解偶然情況下的某些 reduce 不小心分配了多個較多記錄數的情況,但是對于第一種數據分布,單個值有大量記錄, 這種值的所有紀錄已經超過了分配給reduce 的內存的情況無效。
 
方案三:增加 reduce 的內存
 
增加 reduce 的內存大小顯然有改善數據傾斜的可能,這種方式尤其適合數據分布第一種情況,單個值有大量記錄, 這種值的所有紀錄已經超過了分配給reduce 的內存,無論你怎么樣分區這種情況都不會改變。當然這種情況的限制也非常明顯, 1. 內存的限制存在,2. 可能會對集群其他任務的運行產生不穩定的影響。
 
方案四:自定義 partitioner
 
對數據進行手工做 sample 采樣,觀察數據的分布情況,然后根據數據分布自定義 partitioner。這種情況需要開發人員熟悉數據的分布類型。這種方式的缺點為:1. 手工做sample 非常耗時間,需要使用者對查詢使用的數據集的分布有領域知識。2. 分配方式是死的,reduce 個數是確定的,一旦某種情況下發生傾斜,很難修正。

相關推薦
[免責聲明]本文來源于網絡轉載,僅供學習交流使用,不構成商業目的。版權歸原作者所有,如涉及作品內容、版權和其它問題請在30日內與本網聯系,我們將在第一時進行處理
六合图库118万众图库

值班手機:18501996998

咨詢QQ: 226594285 / 428683440

校區地址:北京市海淀區中關村科技園首農藍海中心C座-7層

全國咨詢熱線:400-690-5006

點擊關注:

魔據教育官方微博

魔據官方微信