中軟國際《分佈式計算框架》機試題
實訓項目 : 數據挖掘——流數據分析實訓
項目源碼獲取: 編程
https://pan.baidu.com/s/1glq3tKyl3InURMrjeVCa7g 提取碼:zaj5app
注意事項:考試時間120分鐘,滿分100分。
請建立以本身姓名命名的文件夾,並建立以題號命名的子文件夾,對試題答案進行分類。
請不要在試卷上塗寫與試題無關的標記。框架
(一) 編程題(共100分)
1.某公司2018年第一季度職員工資數據, 格式以下: (40分)
分佈式
1)成功鏈接HDFS服務;(10分)
2)若/salaryInput目錄不存在,建立這個目錄;(10分)
3)成功上傳職員工資數據文件到HDFS分佈式文件系統中存儲。(20分)測試
2.分析HDFS中/salaryInput目錄下的職員工資數據 (60分)
1)計算第一季度每位職員的季度總工資;(10分)
2)計算第一季度每位職員的月度平均工資;(10分)
3)計算第一季度每位職員的月度最大工資;(10分)
4)計算第一季度公司所發的工資總數;(15分)
5)計算出第一季度工資最高的職員姓名。(15分)
提示:每一個小題能夠單獨使用一個MR程序來計算,部分小題能夠使用一個MR程序一塊兒計算。spa
解題實現思路:3d
1、集羣信息
主節點 IP MAC地址
cMaster 192.168.1.120 00:50:56:29:3F:6E
cSlave01 192.168.1.121 00:50:56:21:DC:BB對象
2、項目說明
一、package:
com.hdfs 第1題 com.salary 第2題
二、Class:
testHDFS 1) 成功鏈接HDFS服務;
CreateFolder 2) 若/salaryInput目錄不存在,建立這個目錄;
UploadFile 3) 上傳職員工資數據文件到HDFS分佈式文件系統中存儲。
Quarterly_wage_everyone 一、計算第一季度每位職員的季度總工資
Average_monthly_everyone 二、計算第一季度每位職員的月度平均工資
Max_monthly_everyone 三、計算第一季度每位職員的月度最大工資
Quarterly_wage_total 四、計算第一季度公司所發的工資總數
Quarterly_name_maxwage 五、計算出第一季度工資最高的職員姓名 blog
3、具體實現思路
1-1 testHDFS :
需求:鏈接HDFS服務
思路:要想鏈接HDFS,須要正確寫對鏈接參數。經過操做HDFS上的文件,可直接證實能成功鏈接HDFS服務
實現: 首先以root用戶,嘗試性地加載hdfs API訪問連接,往HDFS上新建/myfile1文件,並追加適當內容;
再讀取/myfile1文件信息的塊大小、文件大小和文件所屬者等信息,最後刪除該文件。測試HDFS服務系統的鏈接性。
1-2 CreateFolder:
需求:若/salaryInput目錄不存在,建立這個目錄。
實現思路:FileSystem實例對象有delete()和mkdirs()方法。
1-3 UploadFile :
需求:上傳職員工資數據文件到HDFS分佈式文件系統中存儲。
思路:FileSystem實例對象有copyFromLocalFile()方法可快速實現。
實現:經過參數鏈接HDFS系統,先定義本地需上傳文件的文件路徑,再設置上傳到HDFS的目標路徑,最後可經過copyFromLocalFile方法進行上傳。排序
2-1 Quarterly_wage_everyone:
需求:1)計算第一季度每位職員的季度總工資。
思路:經過切塊和合並,可將三個文本中相同名字對應的數值相加,要轉換類型。
實現: 內嵌Quarterly_wage_everyoneMapper和Quarterly_wage_everyoneReducer靜態類Quarterly_wage_everyoneMapper內部類繼承 Mapper<LongWritable,Text,Text,IntWritable>,Quarterly_wage_everyoneReducer內部類繼承Reducer<Text,IntWritable,Text,IntWritable>
先在main()方法中設置傳入和傳出文件的路徑等信息,Quarterly_wage_everyoneMapper 將輸入的數據首先按行進行分割,再按每行空格劃分,最後將分割的
name和scoreInt傳入Quarterly_wage_everyoneReducer類。Reducer經過int sum在Iterator<IntWritable> iterator循環基礎上,累加iterator.next().get()數據
最後將key和累加和進行輸出。
2-2 Average_monthly_everyone:
需求:2)計算第一季度每位職員的月度平均工資。
思路:經過切塊和合並,可將三個文本中相同名字對應的數值相加再除以三個月,要轉換類型。
實現: 內嵌Average_monthly_everyoneMapper和Average_monthly_everyoneReducer靜態類,
Average_monthly_everyoneMapper內部類繼承Mapper<LongWritable,Text,Text,IntWritable>,Average_monthly_everyoneReducer內部類繼承 Reducer<Text,IntWritable,Text,IntWritable>先在main()方法中設置傳入和傳出文件的路徑等信息,Average_monthly_everyoneMapper 將輸入的數據首先按行進行分割,再按每行空格劃分,最後將分割的name和scoreInt傳入Average_monthly_everyoneReducer類。Reducer在Iterator<IntWritable> iterator循環基礎上,經過int sum累加iterator.next().get()數據,以及讓int count自加,再經過sum / count方法計算平均工資。最後將key和累加和進行輸出。
2-3 Max_monthly_everyone:
需求:3)計算第一季度每位職員的月度最大工資。
思路:可將三個文本中,相同名字對應的數值進行比較,保留最大值便可。
實現: 內嵌Max_monthly_everyoneMapper和Max_monthly_everyoneReducer靜態類,
Max_monthly_everyoneMapper內部類繼承Mapper<LongWritable,Text,Text,IntWritable>,Max_monthly_everyoneReducer內部類繼承Reducer<Text,IntWritable,Text,IntWritable>先在main()方法中設置傳入和傳出文件的路徑等信息,Max_monthly_everyoneMapper 將輸入的數據首先按行進行分割,再按每行空格劃分,最後將分割的name和scoreInt傳入Max_monthly_everyoneReducer類。Reducer在Iterator<IntWritable> iterator循環基礎上,經過int sum承接來自iterator.next().get()數據,將sum的值強制轉換成int型。設置最大屬性標籤int max,同時在迭代循環中比較標籤值和強制轉換值的大小,經過比較而保留最大的數值,以達到輸出最大工資值的目的。
最後將key和累加和進行輸出。
2-4 Quarterly_wage_total:
需求:4)計算第一季度公司所發的工資總數。
思路:可在1)的基礎上,將各個員工的季度總工資累加求和。
實現: 先在main()方法中設置傳入和傳出文件的路徑等信息,此處爲了統計的便捷性,輸入的結果爲Quarterly_wage_everyone輸出的內容。 Quarterly_wage_totalMapper
將輸入的數據首先按行進行分割,再按每行空格劃分,最後將分割的name和scoreInt傳入Quarterly_wage_totalReducer類。Reducer內設Iterator<IntWritable> iterator循環,
經過int sum累加來自iterator.next().get()的數據,將sum的值強制轉換成int型,再將key和累加和進行輸出結果爲temp。至此,第一次運算完成。在main()方法中設置傳入的數據
來自上一次運行結果temp,以此重複第一次執行流程。
2-5Quarterly_name_maxwage:
需求:5)計算出第一季度工資最高的職員姓名。
思路:實現的方法各類各樣,首先說一下對題目的理解:以第一季度和工資最高爲條件進行求職員姓名。其中,包括:
一、以第一季度我的工資和最高爲參考;二、以第一季度我的月工資最高爲參考。
本例實現前者,以第一季度我的工資和最高爲參考。因此對1)的結果先進行排序,再選中最高者輸出,運算的思路較爲簡便。
實現: 總而言之,就是先對數據集進行降序排列,再利用Top N的方式,將排序比重最大的元素輸出。 先在main()方法中設置傳入和傳出文件的路徑等信息,此處爲了統計的便捷性,輸入的結果爲Quarterly_wage_everyone輸出的內容。SortIntValueMapper類的map()方法將數據集分行,過濾掉尾部空符後轉類型,再將分割數據傳入下一層。SortIntValueReduce類的reduce()方法對數據單元進行元素自循環,經過定義的Text result變量set()一下toString()的單元素,到此可將處理的數據傳出reduce層。到此第一遍運算結束,程序自動進入第二遍處理,即加載Top N過濾。第二遍的運算輸入爲第一次輸出的內容,同時在main()中預加載相應的模塊元素,如:指定job的MapperClass爲KMap、job的ReducerClass爲KReduce;等。顯而易見,程序進入KMap層進行map運算,再進行KReduce的reduce運算,具體請詳見Quarterly_name_maxwage源碼。