第一步:召回階段:用token檢索item,(比如8個item)
第二步:過濾階段:把劣質的item過濾掉,(剩餘5個item)
第三步:排序,把好的item排前面
第四步:截斷,取TopN
其中,第一步和第二步屬於粗排階段,側重於召回;第三、第四步屬於精排階段,側重於準確。
建庫:
==================================================================
【02】MR實踐複習
1、架構
2、mapreduce(複習)
2.1 MR基本概念
(1)通常一個集羣中,有這幾個角色:master、slave、client
(2)數據副本 —— 數據高可用、容災
(3)mapreduce —— 分而治之思想
(4)一個split和一個map是一對一的關係
(5)開發java相當於開發函數,開發python等腳本,相當於規定好標準輸入和輸出
(6)hadoop 1.0 -> hadoop 2.0
- hadoop1.0:
主:jobtracker、namenode
從:tasktracker、datanode
TaskTracker通過slot數目(可配置參數)限定Task的併發度
進程:worker
- hadoop 2.0:
主:ResourceMgr(RM資源調度)、ApplicationManager(AM任務調度)
從:NodeManager(NM)
進程:容器(Container)
* 先排序再溢寫
單機調試:
cat input | mapper | sort | reducer > output
節點上,分發目標path:
/usr/local/src/hadoop-2.6.5/tmp/nm-local-dir/usercache/root/appcache/application_1543137200099_0011/container_1543137200099_0011_01_000001
殺死任務:
yarn application -kill application_1543137200099_0011
2.2 實踐代碼
(1)wordcount
(2)全排序
(a) 單reducer:依賴框架自身的sort功能
方式①:通過加一個很大的base_count,保證key對齊,依賴字典序完成全局排序
第一個代碼:mr_allsort_1reduce_python(base count)
-jobconf "mapred.reduce.tasks=1"
方式②:通過配置完成全排序,不需要設置base_count
第二個代碼:mr_allsort_1reduce_python_2 (通過配置完成)依賴於框架自身的sort功能
# 指定按 key 做 partition
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
# 利用該配置可以完成二次排序
-jobconf org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \
# 利用該配置可以完成key排序
# 1 代表第一列
-jobconf stream.num.map.output.key.fields=1 \
# 設置map分隔符的位置,該位置前的爲key,之後的爲value
# "-k1,1" 表示從第1個字段開始,到第一個字段結束,即第一個字段
-jobconf mapred.text.key.partitioner.options="-k1,1" \
# 設置key中需要比較的字段或字節範圍
# 選擇哪一部分做partition,n是指數字
-jobconf mapred.text.key.comparator.options="-k1,1n" \
-jobconf mapred.reduce.tasks=1
(b) 多reducer
mr_allsort_python(多桶)
適合大數據
-jobconf mapred.reduce.tasks=2 \
# 二次排序的時候需要指定哪個是key,2代表前面兩個字段區域作爲key
-jobconf stream.num.map.output.key.fields=2 \
# 指定第一個字段是key,指定partition階段的key值,用於分發
-jobconf num.key.fields.for.partition=1 \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
// mapred.text.key.partitioner.options,
// 這個參數可以認爲是 num.key.fields.for.partition的升級版
// 它可以指定不僅限於key中的前幾個字段用做partition,
// 而是可以單獨指定 key中某個字段或者某幾個字段一起做partition。
(3)白名單——分發
-file:把本地的文件分發到各個節點
-cachefile:把hdfs的壓縮文件分發到各個節點
-archivefile:把hdfs的壓縮目錄分發到各個節點
# 操作
tar cvzf w.tar.gz white_list_1 white_list_2
(4)壓縮
# 指定map的輸出是否壓縮,有助於減小數據量,減小io壓力
# 通過該方法可以控制map個數,形成壓縮文件之後不會再進行split
mapred.compress.map.output
# 指定map的輸出壓縮算法
mapred.map.output.compression.codec
(5)join
例如:相同的key,value拼成一起
-jobconf stream.num.map.output.key.fields=2 \
-jobconf num.key.fields.for.partition=1
3、一個簡易demo,檢索系統
名單信息:
# python main.py 9999
通過網頁打開9999端口,並輸入userid
一起學習一起討論的可以加我V一起分享:我的名字叫甘世玉, v:姓名全拼1026
我這邊有一些大數據的課程可以分享給你