(第7篇)八斗學習課堂筆記-【01、02】推薦系統

第一步:召回階段:用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

我這邊有一些大數據的課程可以分享給你

 

發佈了7 篇原創文章 · 獲贊 0 · 訪問量 3962
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章