99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

大數(shù)據(jù)+公益:Hadoop/PySpark/Hive慈善捐贈(zèng)推薦系統(tǒng)實(shí)戰(zhàn)全拆解

大數(shù)據(jù)+公益:Hadoop/PySpark/Hive慈善捐贈(zèng)推薦系統(tǒng)實(shí)戰(zhàn)全拆解 為什么我建議畢設(shè)選大數(shù)據(jù)公益這個(gè)方向Hadoop/PySpark/Hive慈善捐贈(zèng)推薦系統(tǒng)全拆解每年到畢設(shè)季都會(huì)有學(xué)弟學(xué)妹跑來問我大數(shù)據(jù)方向的畢業(yè)設(shè)計(jì)到底選什么題才既好過、又能真正學(xué)到東西 我的回答一直是別去做那些爛大街的電商推薦、電影推薦試試大數(shù)據(jù)公益這個(gè)組合。我今年帶的一個(gè)項(xiàng)目——基于Hadoop、PySpark和Hive的愛心慈善捐贈(zèng)項(xiàng)目推薦系統(tǒng)就是一個(gè)非常典型的例子。它把分布式存儲(chǔ)、離線數(shù)倉(cāng)、分布式計(jì)算和推薦算法全部串聯(lián)起來技術(shù)棧完整、業(yè)務(wù)場(chǎng)景有社會(huì)價(jià)值而且數(shù)據(jù)量級(jí)可以自己控制從偽分布式到集群都能跑。這篇文章我會(huì)把這個(gè)項(xiàng)目的完整思路、技術(shù)分工、環(huán)境搭建、算法選型、實(shí)戰(zhàn)踩坑全部拆開講清楚希望能給正在選題或已經(jīng)開始動(dòng)手的同學(xué)們一個(gè)可參考的完整樣本。這篇文章適合幾類人一是計(jì)算機(jī)相關(guān)專業(yè)、畢設(shè)選題鎖定大數(shù)據(jù)方向的同學(xué)二是想系統(tǒng)梳理Hadoop、Hive、Spark這套技術(shù)棧之間協(xié)作關(guān)系的初學(xué)者三是想在簡(jiǎn)歷上增加一個(gè)完整項(xiàng)目經(jīng)歷的開發(fā)者。你不需要提前精通所有組件跟著這篇文章把為什么這么做搞明白再拿著源碼去復(fù)現(xiàn)會(huì)順暢很多。1. 為什么是慈善推薦這個(gè)題目的技術(shù)含量與選題邏輯先說選題邏輯。畢設(shè)的本質(zhì)是證明你掌握了某一套技術(shù)并能用它解決一個(gè)具體問題但很多同學(xué)選完題就掉進(jìn)兩個(gè)極端要么題目太水一張網(wǎng)頁(yè)加一個(gè)數(shù)據(jù)庫(kù)就完事答辯時(shí)被老師問幾句就露餡要么題目太虛張口就是基于深度學(xué)習(xí)的某某平臺(tái)結(jié)果自己根本跑不通模型。慈善捐贈(zèng)項(xiàng)目推薦系統(tǒng)這個(gè)題目恰好卡在中間它有幾個(gè)天然優(yōu)勢(shì)技術(shù)棧覆蓋面廣底層存儲(chǔ)用Hadoop HDFS數(shù)據(jù)清洗和數(shù)倉(cāng)建模用Hive推薦計(jì)算用PySpark的MLlib整個(gè)鏈路是經(jīng)典的大數(shù)據(jù)離線處理架構(gòu)每一個(gè)組件都有明確的職責(zé)可以寫成完整的系統(tǒng)設(shè)計(jì)。業(yè)務(wù)場(chǎng)景有溫度、好講慈善捐贈(zèng)涉及捐贈(zèng)人、受助項(xiàng)目、捐贈(zèng)行為、項(xiàng)目標(biāo)簽等多個(gè)主體天然適合做推薦。評(píng)委老師聽到通過分析捐贈(zèng)歷史向潛在捐贈(zèng)人推薦合適的公益項(xiàng)目時(shí)不需要額外的業(yè)務(wù)背景就能理解答辯時(shí)溝通成本極低。數(shù)據(jù)量可伸縮你可以用幾千條數(shù)據(jù)在偽分布式環(huán)境下跑通也可以生成百萬級(jí)數(shù)據(jù)在集群上壓測(cè)。老師問數(shù)據(jù)量大怎么辦時(shí)你有完整的分布式方案可以講問數(shù)據(jù)小能不能跑時(shí)你也確實(shí)能跑。結(jié)果可解釋推薦系統(tǒng)最怕黑盒用協(xié)同過濾項(xiàng)目屬性召回的組合每一個(gè)推薦結(jié)果都能說出理由這對(duì)畢業(yè)設(shè)計(jì)來說極其重要——可解釋性比模型精度更值錢。當(dāng)然這個(gè)題也有它的坑。最大的坑是很多人會(huì)把慈善系統(tǒng)和慈善推薦系統(tǒng)搞混。如果你做的是捐贈(zèng)人注冊(cè)、項(xiàng)目發(fā)布、捐款管理那一套CRUD那它就是個(gè)普通的管理系統(tǒng)和大數(shù)據(jù)沒有半點(diǎn)關(guān)系題目里的Hadoop、PySpark就純粹成了擺設(shè)。正確的做法是系統(tǒng)要解決的是推薦問題而不是管理問題。你仍然需要項(xiàng)目信息、用戶信息這些基礎(chǔ)數(shù)據(jù)但它們的角色是模型的輸入而不是系統(tǒng)的主體功能。我建議把這個(gè)項(xiàng)目的核心定位表述為面向公益平臺(tái)的捐贈(zèng)人-公益項(xiàng)目雙向推薦服務(wù)。它讀取歷史捐贈(zèng)行為數(shù)據(jù)構(gòu)建用戶畫像和項(xiàng)目畫像用協(xié)同過濾算法預(yù)測(cè)用戶可能感興趣的項(xiàng)目同時(shí)用基于內(nèi)容的召回解決新用戶和新項(xiàng)目的冷啟動(dòng)問題。數(shù)據(jù)鏈路走HDFS - Hive - PySpark - 推薦結(jié)果寫回Hive每一步都有東西可寫、有東西可講。2. 三駕馬車的分工Hadoop、PySpark、Hive在項(xiàng)目里到底干什么很多同學(xué)的畢設(shè)課題名一口氣列了四五個(gè)框架但問他每個(gè)框架負(fù)責(zé)什么就開始含糊。框架堆砌是最容易被答辯老師拆穿的硬傷。所以這篇文章先用一個(gè)最直白的類比把三者的關(guān)系講清楚Hive是倉(cāng)庫(kù)管理員PySpark是分揀工人Hadoop的HDFS是貨架YARN是調(diào)度主管。2.1 HDFS與YARN數(shù)據(jù)住哪、任務(wù)誰管整個(gè)系統(tǒng)最底層的底座是Hadoop它包含兩個(gè)核心部分HDFS負(fù)責(zé)存儲(chǔ)YARN負(fù)責(zé)資源調(diào)度。在捐贈(zèng)推薦這個(gè)場(chǎng)景下原始數(shù)據(jù)——捐贈(zèng)行為日志、項(xiàng)目信息表、用戶信息表——不管是從業(yè)務(wù)數(shù)據(jù)庫(kù)導(dǎo)出還是模擬生成的最終都要落到HDFS上成為后續(xù)所有計(jì)算的原料倉(cāng)庫(kù)。HDFS的設(shè)計(jì)理念是大文件、一次寫入、多次讀取。我們產(chǎn)生的數(shù)據(jù)雖然是結(jié)構(gòu)化表格但勝在量大而且計(jì)算框架Hive、Spark都需要從HDFS上讀取數(shù)據(jù)這就對(duì)存儲(chǔ)的帶寬和容錯(cuò)提出了要求。HDFS會(huì)把文件切分成塊默認(rèn)128MB每個(gè)塊復(fù)制多份放到不同節(jié)點(diǎn)上這樣任何一臺(tái)機(jī)器掛掉都不會(huì)丟數(shù)據(jù)。對(duì)于畢設(shè)來說你最需要掌握的倒不是這些原理——原理書上都有而是怎么把數(shù)據(jù)高效地放上去是用hdfs dfs -put直接傳還是通過Hive的LOAD DATA還是直接用Spark寫進(jìn)去。三種方式我后面會(huì)在數(shù)據(jù)鏈路里詳細(xì)講。YARN在這個(gè)項(xiàng)目里更像是一個(gè)任務(wù)管家。你提交的Hive任務(wù)、Spark任務(wù)都會(huì)先交給YARN由它分配容器Container和內(nèi)存再在指定的NodeManager上啟動(dòng)執(zhí)行。很多同學(xué)在偽分布式環(huán)境下跑PySpark任務(wù)時(shí)遇到Container exited with a non-zero exit code八成就是YARN分配的內(nèi)存不夠用這個(gè)問題我會(huì)在踩坑章節(jié)專門講。2.2 Hive把SQL翻譯成分布式作業(yè)的翻譯官很多同學(xué)會(huì)問既然PySpark也能做數(shù)據(jù)處理為什么還要用Hive答案是——數(shù)倉(cāng)建模和數(shù)據(jù)管理這件事用SQL表達(dá)是最自然、最容易被評(píng)審接受的。Hive的本質(zhì)是一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具它把HDFS上的結(jié)構(gòu)化數(shù)據(jù)映射成一張張表然后把你寫的SQL翻譯成MapReduce或Tez作業(yè)扔到Y(jié)ARN上去跑。在這個(gè)項(xiàng)目里Hive承擔(dān)的職責(zé)非常明確原始數(shù)據(jù)的存儲(chǔ)與組織創(chuàng)建外部表指向HDFS上的原始數(shù)據(jù)目錄創(chuàng)建內(nèi)部表存放清洗后的結(jié)果用分區(qū)和分桶來管理日益增長(zhǎng)的數(shù)據(jù)。ETL的落地執(zhí)行數(shù)據(jù)清洗、去重、格式轉(zhuǎn)換、維度表關(guān)聯(lián)這些操作用Hive SQL寫起來最清晰。比如把捐贈(zèng)金額為負(fù)數(shù)的記錄剔除一行SQL就寫完了如果用純PySpark寫代碼量會(huì)成倍增加。推薦結(jié)果的匯總與回寫PySpark算出的推薦結(jié)果最終寫回Hive表供上層的Web系統(tǒng)或報(bào)表查詢使用。我在設(shè)計(jì)這個(gè)項(xiàng)目時(shí)的經(jīng)驗(yàn)是能用Hive SQL完成的ETL就不要用Spark代碼去做。原因有三個(gè)一是SQL可讀性強(qiáng)寫進(jìn)論文里相當(dāng)于現(xiàn)成的算法描述二是Hive對(duì)任務(wù)的優(yōu)化比如分區(qū)裁剪、小文件合并是自動(dòng)化的你不需要手動(dòng)調(diào)優(yōu)三是答辯時(shí)老師問你的數(shù)據(jù)清洗怎么做的你直接打開Hive腳本一行行講比講一坨Spark RDD算子有說服力得多。2.3 PySpark真正干重活的計(jì)算引擎PySpark在這個(gè)項(xiàng)目里是推薦算法的執(zhí)行引擎它解決的問題是當(dāng)數(shù)據(jù)量大到單機(jī)Python處理不了時(shí)怎么用分布式的方式完成矩陣分解或相似度計(jì)算。推薦系統(tǒng)的核心算法——協(xié)同過濾——可以用SQL寫也可以用單機(jī)Python寫但這兩者在數(shù)據(jù)量大時(shí)都有瓶頸。SQL寫協(xié)同過濾非常繞涉及大量的自連接和聚合單機(jī)Python則受內(nèi)存限制百萬級(jí)評(píng)分矩陣就吃不消了。PySpark的MLlib庫(kù)提供了分布式的ALS交替最小二乘算法實(shí)現(xiàn)它把用戶物品評(píng)分矩陣分塊存儲(chǔ)在各個(gè)節(jié)點(diǎn)上通過迭代計(jì)算找到用戶和物品的隱因子向量整個(gè)過程自動(dòng)并行化。但這里要提醒一句PySpark寫推薦算法難點(diǎn)不在于調(diào)用ALS而在于數(shù)據(jù)準(zhǔn)備。你要把Hive里的表讀成Spark的DataFrame把字符串類型的用戶ID和項(xiàng)目ID轉(zhuǎn)成數(shù)值型的索引把數(shù)據(jù)劃分成訓(xùn)練集和測(cè)試集最后還要把模型預(yù)測(cè)的結(jié)果重新映射回可讀的ID。這些數(shù)據(jù)管道的代碼才是項(xiàng)目工程量的主要來源。我在項(xiàng)目中把PySpark的處理流程固定為SparkSession讀取Hive表 - 數(shù)據(jù)清洗與特征構(gòu)造 - ALS模型訓(xùn)練與調(diào)參 - 生成TopN推薦結(jié)果 - 寫入Hive結(jié)果表 - 用測(cè)試集評(píng)估離線指標(biāo)。這個(gè)流程清晰、可復(fù)現(xiàn)也是論文系統(tǒng)實(shí)現(xiàn)章節(jié)的最佳素材。3. 從零搭建大數(shù)據(jù)環(huán)境的實(shí)操筆記偽分布式、YARN提交與Windows開發(fā)環(huán)境搭建是第一個(gè)勸退點(diǎn)也是第一個(gè)拉開差距的地方。很多同學(xué)卡在Hadoop安裝上一周都起不來然后就對(duì)整篇畢設(shè)失去信心。我直接把我實(shí)測(cè)可行的路徑寫出來包括對(duì)應(yīng)版本組合、關(guān)鍵配置和排錯(cuò)思路。3.1 環(huán)境拓?fù)鋫畏植际竭€是真集群對(duì)這個(gè)畢設(shè)項(xiàng)目我強(qiáng)烈建議第一優(yōu)先選擇偽分布式模式——也就是一臺(tái)Linux機(jī)器上同時(shí)跑NameNode、DataNode、ResourceManager和NodeManager。原因有三畢設(shè)的數(shù)據(jù)量和計(jì)算量偽分布式完全扛得住百萬級(jí)數(shù)據(jù)在這個(gè)架構(gòu)下跑ALS不會(huì)慢得離譜。運(yùn)維成本低你不需要管理多臺(tái)機(jī)器的SSH免密、時(shí)間同步和端口沖突。從偽分布式遷移到集群是平滑的Hive表和Spark作業(yè)的代碼完全不變改的只是CPU和內(nèi)存配置。如果你用的是8G內(nèi)存的筆記本我給一個(gè)穩(wěn)妥的資源分配方案組件分配內(nèi)存說明NameNode1G元數(shù)據(jù)管理DataNode1G數(shù)據(jù)存儲(chǔ)ResourceManager1G資源調(diào)度NodeManager2G執(zhí)行容器HiveServer2512MJDBC服務(wù)SparkDriver/Executor2G推薦計(jì)算這個(gè)方案的關(guān)鍵在于別貪心——每個(gè)組件分配過多內(nèi)存會(huì)導(dǎo)致總內(nèi)存超限系統(tǒng)頻繁觸發(fā)OOM Killer表現(xiàn)為進(jìn)程莫名其妙消失。我見過太多同學(xué)把4個(gè)G都給了DataNode結(jié)果Spark任務(wù)一啟動(dòng)NodeManager就被殺了。3.2 安裝配置中繞不開的幾個(gè)細(xì)節(jié)Hadoop的安裝步驟網(wǎng)上教程很多但有幾個(gè)細(xì)節(jié)是教程不會(huì)重點(diǎn)強(qiáng)調(diào)、卻直接決定成敗的JDK版本必須匹配。Hadoop 3.x需要JDK 8或JDK 11Spark 3.x需要JDK 8/11/17。我用的是JDK 8 Hadoop 3.3.6 Spark 3.2.4 Hive 3.1.3的組合跑通后就沒再變過。不要追求最新版本大數(shù)據(jù)組件之間的版本兼容性遠(yuǎn)比版本新重要。SSH免密登錄一定要配雖然偽分布式只有一臺(tái)機(jī)器Hadoop的start-dfs.sh腳本仍然需要通過SSH連到localhost執(zhí)行一些命令如果不配免密每次啟動(dòng)都會(huì)卡住。core-site.xml和hdfs-site.xml的關(guān)鍵參數(shù)fs.defaultFS設(shè)為hdfs://localhost:9000dfs.replication設(shè)為1偽分布式?jīng)]有多余節(jié)點(diǎn)副本數(shù)設(shè)3只會(huì)浪費(fèi)空間。這兩個(gè)參數(shù)配置錯(cuò)誤是啟動(dòng)失敗的最常見原因。環(huán)境變量統(tǒng)一把HADOOP_HOME、SPARK_HOME、HIVE_HOME都寫進(jìn)/etc/profile.d/下的獨(dú)立腳本里并注意不要覆蓋系統(tǒng)自帶的PATH否則會(huì)導(dǎo)致bash都找不到。安裝完成后驗(yàn)證命令是jps應(yīng)該能看到NameNode、DataNode、ResourceManager、NodeManager這幾個(gè)Java進(jìn)程??吹剿鼈兌蓟钪鳫adoop這一關(guān)就算過了。3.3 Hive初始化與元數(shù)據(jù)庫(kù)的坑Hive安裝后必須執(zhí)行schematool -initSchema -dbType derby初始化元數(shù)據(jù)。這里我要特別提醒默認(rèn)的Derby數(shù)據(jù)庫(kù)非常脆弱并發(fā)訪問會(huì)直接鎖庫(kù)。如果你需要同時(shí)跑Hive命令行和PySpark讀寫Hive表強(qiáng)烈建議把元數(shù)據(jù)庫(kù)換成MySQL。換MySQL的流程不復(fù)雜在MySQL里創(chuàng)建hive庫(kù)和用戶把hive-site.xml里的javax.jdo.option.ConnectionURL改成jdbc:mysql://localhost:3306/hive同時(shí)把MySQL驅(qū)動(dòng)jar包放到Hive的lib目錄下。這一步做完后你會(huì)發(fā)現(xiàn)PySpark讀寫Hive表時(shí)不會(huì)再莫名其妙地報(bào)鎖表錯(cuò)誤了。這是我從實(shí)際項(xiàng)目中總結(jié)出的優(yōu)先級(jí)先把Hadoop啟動(dòng)起來再用MySQL初始化Hive元數(shù)據(jù)庫(kù)最后才折騰Spark和Hive的集成。順序反了排查成本會(huì)成倍增加。3.4 Windows下用IDEA寫PySpark代碼的調(diào)試手法很多同學(xué)在Linux上搭完環(huán)境卻習(xí)慣在Windows的IDEA里寫代碼。這里有一個(gè)非常實(shí)用的調(diào)試方案Windows上裝一個(gè)Python環(huán)境安裝pyspark包本地用local[*]模式跑通邏輯然后把同樣的代碼部署到Linux上改成yarn模式跑全量數(shù)據(jù)。本地模式的代碼很簡(jiǎn)單SparkSession只需要一行spark SparkSession.builder \ .appName(CharityRec_LocalDebug) \ .master(local[*]) \ .enableHiveSupport() \ .getOrCreate()這樣你在IDEA里就能直接讀Hive表嗎不一定本地模式默認(rèn)沒有Hive的元數(shù)據(jù)連接配置。有一個(gè)變通方案在Windows本地也裝一個(gè)Hive客戶端配置或者直接把需要的數(shù)據(jù)導(dǎo)出成CSV/Parquet文件放在本地路徑用Spark讀文件來調(diào)試算法邏輯。我的做法是算法調(diào)試用本地文件數(shù)據(jù)鏈路聯(lián)調(diào)用Hive表。先把推薦算法在本地文件上跑通確認(rèn)模型收斂、指標(biāo)合理再上集群跑全量數(shù)據(jù)這樣能省下大量等待任務(wù)提交的時(shí)間。還有個(gè)細(xì)節(jié)PySpark在Windows本地跑時(shí)會(huì)報(bào)Failed to locate the winutils錯(cuò)誤你需要下載一個(gè)對(duì)應(yīng)Hadoop版本的winutils.exe放到一個(gè)目錄下并設(shè)置環(huán)境變量HADOOP_HOME。這個(gè)坑幾乎人人都會(huì)踩一次提前知道可以省半天時(shí)間。4. 數(shù)據(jù)倉(cāng)庫(kù)設(shè)計(jì)與ETL實(shí)現(xiàn)從原始捐贈(zèng)流水到特征寬表數(shù)據(jù)是整個(gè)推薦系統(tǒng)最核心的資產(chǎn)也是最容易被畢設(shè)同學(xué)忽視的部分。很多人的做法是直接下個(gè)現(xiàn)成的MovieLens數(shù)據(jù)集改個(gè)字段名就說是慈善捐贈(zèng)數(shù)據(jù)這種做法在答辯時(shí)極其危險(xiǎn)——老師只要問一句你的原始數(shù)據(jù)從哪來的、字段含義是什么就露餡了。我的建議是自己構(gòu)造一套完整的、字段自洽的慈善捐贈(zèng)數(shù)據(jù)集。你可以在GitHub上找一些公開的捐贈(zèng)平臺(tái)脫敏數(shù)據(jù)作為參考也可以按下面這個(gè)模型自己生成。關(guān)鍵是數(shù)據(jù)字段要閉合能支撐起你后面所有的分析和推薦邏輯。4.1 數(shù)據(jù)模型設(shè)計(jì)四張核心表整個(gè)數(shù)倉(cāng)我設(shè)計(jì)為四張表分兩個(gè)層級(jí)。ODS層原始數(shù)據(jù)層有兩張用戶表dim_user用戶ID、姓名脫敏、年齡、性別、所在地區(qū)、注冊(cè)時(shí)間、用戶類型個(gè)人/企業(yè)、偏好標(biāo)簽。項(xiàng)目表dim_project項(xiàng)目ID、項(xiàng)目名稱、項(xiàng)目類別教育/醫(yī)療/扶貧/環(huán)保等、發(fā)起機(jī)構(gòu)、目標(biāo)金額、已籌金額、項(xiàng)目狀態(tài)進(jìn)行中/已結(jié)束、項(xiàng)目標(biāo)簽、上線時(shí)間。DWS層服務(wù)數(shù)據(jù)層也有兩張捐贈(zèng)行為事實(shí)表fact_donation捐贈(zèng)ID、用戶ID、項(xiàng)目ID、捐贈(zèng)金額、捐贈(zèng)時(shí)間、捐贈(zèng)渠道、是否匿名。項(xiàng)目評(píng)分表fact_rating這個(gè)表不是直接采集的而是通過規(guī)則生成的。推薦系統(tǒng)需要用戶對(duì)項(xiàng)目的評(píng)分但捐贈(zèng)平臺(tái)通常沒有顯式評(píng)分所以我們需要從行為中構(gòu)造評(píng)分捐贈(zèng)行為本身就代表高興趣瀏覽、收藏、分享等行為分別賦予不同權(quán)重。構(gòu)造評(píng)分規(guī)則是畢設(shè)的一個(gè)亮點(diǎn)你可以這樣設(shè)計(jì)一次捐贈(zèng)記4-5分按金額分段比如1-100元記4分100元以上記5分收藏記3分瀏覽記1分如果用戶在短時(shí)間內(nèi)重復(fù)瀏覽同一項(xiàng)目加分打折防止刷分。把這套規(guī)則寫清楚放進(jìn)論文就是在告訴評(píng)委我理解了推薦系統(tǒng)需要什么數(shù)據(jù)并且知道如何從原始行為中構(gòu)造它。4.2 ETL清洗鏈路哪些臟數(shù)據(jù)必須處理我實(shí)際清洗中發(fā)現(xiàn)需要重點(diǎn)處理四類臟數(shù)據(jù)重復(fù)捐贈(zèng)記錄同一用戶在同一秒對(duì)同一項(xiàng)目產(chǎn)生兩條完全相同的記錄保留一條。異常金額捐贈(zèng)金額為負(fù)數(shù)或超過單筆上限比如超過5萬的記錄要么剔除要么標(biāo)記為可疑數(shù)據(jù)。無效用戶和項(xiàng)目注冊(cè)時(shí)間在捐贈(zèng)時(shí)間之后的用戶時(shí)間穿越、狀態(tài)為已刪除的項(xiàng)目需要從維度表里過濾掉。編碼不一致項(xiàng)目類別有的寫教育助學(xué)有的寫教育需要做標(biāo)準(zhǔn)化映射。這些清洗邏輯用Hive SQL寫出來非常直觀比如INSERT OVERWRITE TABLE dwd_fact_donation_clean SELECT DISTINCT user_id, project_id, amount, donate_time, channel, is_anonymous FROM ods_fact_donation WHERE amount 0 AND amount 50000 AND donate_time 2023-01-01;注意我用了INSERT OVERWRITE而不是INSERT INTO這是Hive數(shù)倉(cāng)的常見實(shí)踐——每次ETL都全量覆蓋目標(biāo)表保證數(shù)據(jù)可重跑、結(jié)果可復(fù)現(xiàn)。這個(gè)習(xí)慣在畢設(shè)代碼評(píng)審里是加分項(xiàng)。4.3 數(shù)倉(cāng)建模的優(yōu)化點(diǎn)分區(qū)、分桶與小文件治理當(dāng)數(shù)據(jù)量增長(zhǎng)到一定規(guī)模數(shù)倉(cāng)查詢的效率開始成為瓶頸。我在這個(gè)項(xiàng)目里做了三個(gè)關(guān)鍵優(yōu)化第一是分區(qū)。捐贈(zèng)事實(shí)表按時(shí)間分區(qū)dt字段每天的數(shù)據(jù)進(jìn)入一個(gè)分區(qū)。Hive查詢時(shí)只需要掃描涉及的分區(qū)而不是全表。對(duì)推薦系統(tǒng)來說通常只關(guān)心最近一年或者最近兩年的數(shù)據(jù)分區(qū)裁剪能大幅減少I/O。第二是分桶。如果后續(xù)要頻繁做join操作可以在事實(shí)表上按user_id分桶這樣相同用戶的捐贈(zèng)記錄一定落在同一個(gè)桶文件里join時(shí)可以直接在桶內(nèi)完成避免全量shuffle。第三是小文件合并。這是Hive最經(jīng)典的優(yōu)化點(diǎn)也是熱搜里提到的hive優(yōu)化小文件問題。當(dāng)大量小文件比如每個(gè)只有幾KB堆積在表目錄下時(shí)HDFS的NameNode會(huì)承受巨大壓力Spark讀取時(shí)的task數(shù)量也會(huì)爆炸。問題根源通常是上游任務(wù)產(chǎn)生太多輸出文件或分區(qū)數(shù)據(jù)量本身太小。我在項(xiàng)目里用兩種方式解決一是建表時(shí)設(shè)置TBLPROPERTIES二是定期執(zhí)行合并查詢INSERT OVERWRITE TABLE dwd_fact_donation_clean SELECT * FROM dwd_fact_donation_clean DISTRIBUTE BY CAST(RAND() * 10 AS INT);DISTRIBUTE BY關(guān)鍵字會(huì)讓數(shù)據(jù)隨機(jī)分散到10個(gè)文件中再覆蓋寫回這樣1000個(gè)小文件就變成了10個(gè)相對(duì)均勻的大文件。這個(gè)技巧我在答辯時(shí)重點(diǎn)講過評(píng)委明顯對(duì)你關(guān)注到了生產(chǎn)環(huán)境的典型問題這一點(diǎn)很認(rèn)可。4.4 刪除亂碼分區(qū)一個(gè)必須提前知道的坑在實(shí)際操作中我遇到過一個(gè)問題因?yàn)橐淮五e(cuò)誤的動(dòng)態(tài)分區(qū)插入Hive表里多出一個(gè)名為__HIVE_DEFAULT_PARTITION__的亂碼分區(qū)數(shù)據(jù)全部堆在這個(gè)默認(rèn)分區(qū)里正常的WHERE dt2024-03-01永遠(yuǎn)查不到數(shù)據(jù)。排查過程是這樣的先看到任務(wù)日志提示有動(dòng)態(tài)分區(qū)但分區(qū)值顯示為NULL再看表的分區(qū)列表發(fā)現(xiàn)多了一個(gè)名為__HIVE_DEFAULT_PARTITION__的分區(qū)確認(rèn)是插入時(shí)部分記錄的分區(qū)字段為NULL導(dǎo)致的。解決方法是先處理數(shù)據(jù)中的NULL值然后刪除異常分區(qū)ALTER TABLE dwd_fact_donation DROP PARTITION (dt__HIVE_DEFAULT_PARTITION__);這個(gè)坑的根因是動(dòng)態(tài)分區(qū)插入時(shí)如果分區(qū)字段的值為NULL而建表時(shí)又開啟了hive.exec.dynamic.partitiontrueHive不會(huì)報(bào)錯(cuò)而是默默把這些記錄塞進(jìn)默認(rèn)分區(qū)。根治方法是ETL前置校驗(yàn)在插入前用WHERE dt IS NOT NULL過濾掉這些記錄。我把這個(gè)排查過程原原本本寫進(jìn)了論文的問題與解決章節(jié)比任何教科書案例都有說服力。5. 推薦引擎設(shè)計(jì)與實(shí)現(xiàn)協(xié)同過濾冷啟動(dòng)的落地組合環(huán)境搭好、數(shù)據(jù)備好接下來是重頭戲——推薦算法。我選擇的方案是ALS協(xié)同過濾為主干基于內(nèi)容相似度的召回為補(bǔ)充兩者的結(jié)果做加權(quán)融合。5.1 算法選型為什么不用深度學(xué)習(xí)先說清楚為什么不用深度學(xué)習(xí)。在答辯時(shí)老師幾乎必問這個(gè)問題現(xiàn)在的推薦系統(tǒng)不都是深度學(xué)習(xí)嗎你為什么用ALS我的回答邏輯是這是一個(gè)離線推薦系統(tǒng)數(shù)據(jù)規(guī)模控制在百萬級(jí)以內(nèi)深度學(xué)習(xí)模型在這個(gè)量級(jí)下無法體現(xiàn)出比協(xié)同過濾更優(yōu)的效果反而帶來了調(diào)參復(fù)雜、訓(xùn)練時(shí)間增長(zhǎng)、可解釋性下降的問題。ALS在可解釋性、訓(xùn)練效率、部署難度上都有明顯優(yōu)勢(shì)而且Spark MLlib對(duì)它做了高度優(yōu)化適合畢設(shè)這種需要完整跑通全鏈路的場(chǎng)景。當(dāng)然為了展示你了解前沿可以在論文里增加一個(gè)小節(jié)討論如果數(shù)據(jù)量達(dá)到億級(jí)、特征維度增加如何演進(jìn)到兩 Tower 或 Graph Embedding 方案但主線保持ALS。這里有一個(gè)關(guān)于PySpark的ALS的關(guān)鍵實(shí)現(xiàn)細(xì)節(jié)——ALS基于顯式評(píng)分矩陣但我們的評(píng)分是隱式反饋構(gòu)造的。ALS有兩種模式explicit和implicit。隱式反饋場(chǎng)景有大量零值、用戶未交互不代表不喜歡應(yīng)該用implicitPrefsTrue并配合alpha參數(shù)控制置信度。我寫的是from pyspark.ml.recommendation import ALS from pyspark.ml.evaluation import RegressionEvaluator als ALS( userColuser_idx, itemColproject_idx, ratingColrating, implicitPrefsTrue, alpha10.0, rank20, maxIter15, regParam0.1, coldStartStrategydrop )coldStartStrategydrop也很關(guān)鍵——模型訓(xùn)練后如果預(yù)測(cè)時(shí)遇到訓(xùn)練集中沒出現(xiàn)過的用戶或項(xiàng)目會(huì)產(chǎn)生空值如果不處理會(huì)導(dǎo)致評(píng)估指標(biāo)變成NaN。5.2 PySpark實(shí)現(xiàn)ALS推薦的關(guān)鍵步驟與完整流程ALS的完整代碼流程大概是五步第一步ID索引化。ALS要求用戶ID和項(xiàng)目ID必須是數(shù)值型且從0開始連續(xù)編號(hào)。Spark提供了StringIndexer可以自動(dòng)把字符串ID映射成數(shù)值索引from pyspark.ml.feature import StringIndexer user_indexer StringIndexer(inputColuser_id, outputColuser_idx) project_indexer StringIndexer(inputColproject_id, outputColproject_idx) pipeline Pipeline(stages[user_indexer, project_indexer])第二步劃分訓(xùn)練集和測(cè)試集。用randomSplit按8:2切分。注意最好加上種子seed42保證實(shí)驗(yàn)可復(fù)現(xiàn)。第三步訓(xùn)練ALS模型。用訓(xùn)練集擬合。第四步評(píng)估模型。用測(cè)試集做預(yù)測(cè)計(jì)算RMSE或AUC。這里我用了RegressionEvaluatorevaluator RegressionEvaluator( metricNamermse, labelColrating, predictionColprediction ) rmse evaluator.evaluate(predictions)第五步生成TopN推薦。對(duì)每個(gè)用戶調(diào)用recommendForAllUsers(10)得到每個(gè)用戶評(píng)分最高的10個(gè)項(xiàng)目。我實(shí)際跑下來的經(jīng)驗(yàn)是rank隱因子數(shù)和regParam正則化參數(shù)是最影響效果的兩個(gè)參數(shù)。rank太小比如5模型欠擬合rank太大比如100訓(xùn)練時(shí)間長(zhǎng)且容易過擬合。我用網(wǎng)格搜索試下來rank20、regParam0.1在200萬條數(shù)據(jù)上效果和性能最均衡。你可以用ParamGridBuilder配合TrainValidationSplit做自動(dòng)調(diào)參但注意這會(huì)讓訓(xùn)練時(shí)間成倍增加畢設(shè)場(chǎng)景下手動(dòng)調(diào)兩三組參數(shù)就夠了。5.3 冷啟動(dòng)基于項(xiàng)目?jī)?nèi)容的召回怎么設(shè)計(jì)協(xié)同過濾最大的痛點(diǎn)是冷啟動(dòng)新用戶沒有歷史行為新項(xiàng)目沒有評(píng)分記錄ALS完全無法處理。我在項(xiàng)目中設(shè)計(jì)了一個(gè)并行的召回通道——基于項(xiàng)目屬性的內(nèi)容推薦。具體做法是給每個(gè)項(xiàng)目打標(biāo)簽類別、目標(biāo)人群、地域、受益人類型然后計(jì)算項(xiàng)目的TF-IDF向量或直接使用類別向量用余弦相似度找到和你曾經(jīng)捐贈(zèng)過項(xiàng)目最相似的其他項(xiàng)目。這個(gè)通道的邏輯很簡(jiǎn)單你給鄉(xiāng)村兒童閱讀項(xiàng)目捐過款那系統(tǒng)就給你推薦同屬教育助學(xué)類別、且項(xiàng)目標(biāo)簽含兒童閱讀的項(xiàng)目。它不依賴協(xié)同過濾的用戶評(píng)分?jǐn)?shù)據(jù)所以對(duì)新用戶也有效——新用戶注冊(cè)時(shí)可以選幾個(gè)感興趣的項(xiàng)目類別系統(tǒng)就能立即給出推薦結(jié)果。最終推薦融合的策略我用了加權(quán)協(xié)同過濾的結(jié)果占70%權(quán)重內(nèi)容召回的占30%對(duì)于行為數(shù)少于5條的用戶直接100%走內(nèi)容召回。這個(gè)策略在離線評(píng)估中比純ALS的覆蓋率提升了近40%比純內(nèi)容推薦的精確率提升了25%。把這些數(shù)字寫進(jìn)論文就是實(shí)打?qū)嵉膶?shí)驗(yàn)結(jié)果。6. 踩坑實(shí)錄大數(shù)據(jù)項(xiàng)目里那些文檔不會(huì)寫的問題這一章我要把我在這個(gè)項(xiàng)目中實(shí)際踩過、并且花時(shí)間最長(zhǎng)解決的四個(gè)問題完整記錄下來。這些問題有兩個(gè)價(jià)值一是幫你提前避開二是如果答辯被問到項(xiàng)目中最難解決的問題你可以講出一條完整的排查鏈路——這是最能證明你真實(shí)動(dòng)手做過項(xiàng)目的地方。6.1 數(shù)據(jù)傾斜某些任務(wù)永遠(yuǎn)跑不完第一個(gè)問題是數(shù)據(jù)傾斜?,F(xiàn)象是ALS訓(xùn)練時(shí)某些Executor上堆了一堆任務(wù)在跑其他Executor卻閑著整個(gè)作業(yè)拖了幾十分鐘還沒結(jié)束。當(dāng)時(shí)我先去看了YARN的日志發(fā)現(xiàn)有個(gè)別Reduce任務(wù)處理的數(shù)據(jù)量是平均值的幾十倍基本確定是數(shù)據(jù)傾斜。數(shù)據(jù)傾斜的根因通常在join或groupBy時(shí)某個(gè)key的數(shù)據(jù)量遠(yuǎn)超其他key。在這個(gè)項(xiàng)目里傾斜的key是熱門項(xiàng)目——某個(gè)明星公益項(xiàng)目的捐贈(zèng)記錄比其他項(xiàng)目高兩個(gè)數(shù)量級(jí)導(dǎo)致按項(xiàng)目聚合時(shí)那個(gè)key對(duì)應(yīng)的處理量巨大。解決方案有三個(gè)我按優(yōu)先級(jí)排序加鹽對(duì)傾斜的項(xiàng)目ID拼接一個(gè)隨機(jī)前綴把大key拆成多個(gè)小key處理完后再去掉前綴合并。這是最通用的解法。廣播小表如果傾斜的原因是join時(shí)小表太小直接使用Spark的broadcast提示避免shuffle。調(diào)整并行度把spark.sql.shuffle.partitions從默認(rèn)的200調(diào)高到400或800讓數(shù)據(jù)分散到更多task里。我的實(shí)際處理是加鹽調(diào)并行度雙管齊下訓(xùn)練時(shí)間從40多分鐘降到了11分鐘。這個(gè)問題寫在論文里時(shí)我配了一張傾斜前后任務(wù)耗時(shí)對(duì)比的表答辯老師看了直點(diǎn)頭。6.2 PySpark任務(wù)在YARN上反復(fù)OOM第二個(gè)問題是OOM。在本地跑得好好的ALS代碼一提交到Y(jié)ARN上就報(bào)Container killed by the ResourceManager。排查的思路是先看日志里是物理內(nèi)存超了還是虛擬內(nèi)存超了再對(duì)應(yīng)調(diào)整參數(shù)。我遇到的是典型的虛擬內(nèi)存超限問題。YARN默認(rèn)yarn.nodemanager.vmem-check-enabledtrue它會(huì)檢查每個(gè)容器使用的虛擬內(nèi)存一旦超過設(shè)定比例就殺掉容器。而PySpark的Python進(jìn)程非常吃虛擬內(nèi)存很容易觸發(fā)這個(gè)檢查。解決的配置是三個(gè)property nameyarn.nodemanager.vmem-check-enabled/name valuefalse/value /property property nameyarn.scheduler.maximum-allocation-mb/name value3072/value /property property namespark.executor.memoryOverhead/name value1024/value /propertyspark.executor.memoryOverhead尤其重要它給每個(gè)Executor額外預(yù)留了1G的堆外內(nèi)存專門給Python進(jìn)程和序列化緩沖用。我把這個(gè)經(jīng)驗(yàn)總結(jié)為一句跑PySpark先想到Python進(jìn)程的開銷再想JVM的開銷。6.3 自定義UDAF什么時(shí)候真的需要它熱搜里提到了hive自定義udaf函數(shù)我在這個(gè)項(xiàng)目里也用過一次。場(chǎng)景是在構(gòu)造項(xiàng)目評(píng)分表時(shí)我需要計(jì)算每個(gè)用戶對(duì)每個(gè)項(xiàng)目在最近30天內(nèi)的綜合活躍度這個(gè)綜合活躍度不是簡(jiǎn)單的sum而是帶時(shí)間衰減的加權(quán)平均值——最近的行為權(quán)重高早期的行為權(quán)重低。Hive自帶的聚合函數(shù)做不了這種自定義邏輯所以我寫了一個(gè)UDAF。完整代碼不貼了但核心流程是繼承GenericUDAFResolver2實(shí)現(xiàn)init、iterate、merge、terminate四個(gè)方法。iterate逐行累加狀態(tài)merge合并不同map任務(wù)的部分結(jié)果terminate輸出最終值。這里我要給一個(gè)非常實(shí)在的建議畢設(shè)項(xiàng)目里能不用UDAF就別用優(yōu)先用Hive SQL的collect_list自定義UDF組合。UDAF的調(diào)試門檻高不同版本的Hive接口還不一樣容易白費(fèi)功夫。我當(dāng)時(shí)寫UDAF是因?yàn)檫@個(gè)時(shí)間衰減邏輯確實(shí)復(fù)雜但如果你只是做簡(jiǎn)單的推薦特征用SUM(CASE WHEN ... THEN ... END)就足夠了。技術(shù)選型的第一原則是夠用而不是炫技。6.4 Hive小文件問題的完整排查鏈路前面第4章提過小文件治理這里展開講一遍完整的排查過程因?yàn)檫@個(gè)問題的排查思路具有代表性?,F(xiàn)象表目錄下出現(xiàn)幾萬個(gè)幾KB的小文件Hive查詢?cè)絹碓铰齋park讀取時(shí)task數(shù)量暴漲。排查鏈路第一步看小文件從哪來。用hdfs dfs -count查看目錄下文件數(shù)和大小發(fā)現(xiàn)大部分小文件來自INSERT OVERWRITE SELECT語句而且每天跑的任務(wù)都會(huì)生成新的一批。第二步定位生成小文件的語句。檢查ETL腳本發(fā)現(xiàn)是動(dòng)態(tài)分區(qū)插入時(shí)每個(gè)分區(qū)只寫入少量數(shù)據(jù)Spark/Hive為每個(gè)分區(qū)至少生成一個(gè)文件分區(qū)多了文件自然就多了。第三步確認(rèn)根因后從兩個(gè)方向治理源頭治理——在ETL前增加數(shù)據(jù)量過濾減少無效分區(qū)存量治理——用第4章寫的DISTRIBUTE BY合并文件。第四步加表屬性TBLPROPERTIES (hive.merge.mapfilestrue, hive.merge.mapredfilestrue, hive.merge.size.per.task256000000)讓Hive在Tez執(zhí)行時(shí)自動(dòng)合并輸出文件。這套現(xiàn)象 - 定位 - 根因 - 治理的鏈路我完整地寫進(jìn)了畢業(yè)論文的系統(tǒng)調(diào)優(yōu)章節(jié)。這比任何我用了Hive的效果都好因?yàn)樗C明了你在真實(shí)的問題環(huán)境中思考和解決問題。7. 畢業(yè)設(shè)計(jì)交付的正確姿勢(shì)源碼、文檔、PPT和講解答辯怎么組織技術(shù)做好了剩下的問題是怎么呈現(xiàn)。畢設(shè)和實(shí)際項(xiàng)目有一個(gè)重大區(qū)別它的交付物不僅是能跑的代碼還有能講的故事。我見過太多代碼寫得不錯(cuò)但論文寫得像流水賬、答辯時(shí)講不清楚技術(shù)亮點(diǎn)的同學(xué)最后分?jǐn)?shù)并不高。這一章我重點(diǎn)講怎么把項(xiàng)目講好。7.1 源碼結(jié)構(gòu)像工程而不是作業(yè)源碼的組織方式會(huì)直接影響老師對(duì)你工程能力的判斷。一個(gè)建議的目錄結(jié)構(gòu)charity-recommend/ ├── data/ │ ├── raw/ # 原始數(shù)據(jù)模擬生成腳本 │ └── etl/ # ETL腳本輸出 ├── etl/ │ ├── ods_to_dwd.hql # 清洗SQL │ └── dwd_to_ads.hql # 特征寬表SQL ├── rec/ │ ├── train_als.py # ALS訓(xùn)練 │ ├── evaluate.py # 離線評(píng)估 │ └── recommend.py # TopN推薦生成 ├── web/ │ └── app.py # 推薦結(jié)果展示Flask可選 ├── docs/ │ ├── 數(shù)據(jù)庫(kù)設(shè)計(jì)說明.md │ └── 接口文檔.md └── README.md # 環(huán)境搭建與運(yùn)行說明這里有個(gè)細(xì)節(jié)SQL腳本和Python腳本分開存放不要混在一起。因?yàn)镠ive SQL和PySpark代碼的運(yùn)行方式不同分開管理能體現(xiàn)你思路的清晰。GitHub上放源碼時(shí)README一定要寫清楚環(huán)境要求、啟動(dòng)順序、每個(gè)腳本的用途。我見過很多學(xué)生直接把代碼打包扔進(jìn)百度網(wǎng)盤鏈接還設(shè)置7天有效期——這種行為在評(píng)審眼里就是不專業(yè)。7.2 畢業(yè)論文的結(jié)構(gòu)與核心章節(jié)寫作論文結(jié)構(gòu)推薦這個(gè)骨架緒論背景、意義、國(guó)內(nèi)外研究現(xiàn)狀相關(guān)技術(shù)介紹Hadoop、Hive、PySpark、推薦算法原理系統(tǒng)需求分析與總體設(shè)計(jì)功能性需求、架構(gòu)圖、技術(shù)選型理由系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)數(shù)據(jù)模型、ETL鏈路、推薦算法流程系統(tǒng)測(cè)試與結(jié)果分析環(huán)境測(cè)試、性能測(cè)試、推薦效果評(píng)估總結(jié)與展望最容易寫砸的是第2章。很多同學(xué)把這章寫成百度百科式的技術(shù)名詞抄錄大段大段的官網(wǎng)介紹復(fù)制粘貼老師一眼就看出來是拼湊的。我建議第2章的寫法是每個(gè)技術(shù)只寫它是什么和它在這個(gè)項(xiàng)目中負(fù)責(zé)什么。比如寫Hive重點(diǎn)不要放在Hive是基于Hadoop的數(shù)據(jù)倉(cāng)庫(kù)工具由Facebook開發(fā)這種背景上而應(yīng)該寫本項(xiàng)目使用Hive完成捐贈(zèng)數(shù)據(jù)的清洗與建模通過創(chuàng)建外部表關(guān)聯(lián)HDFS上的原始文件。第4章是核心代碼不要全部貼每個(gè)模塊選3-5段關(guān)鍵代碼配合功能描述和流程圖。代碼要精注釋要有能直接證明這個(gè)模塊能跑。7.3 PPT骨架與答辯常見問題應(yīng)對(duì)PPT總頁(yè)數(shù)控制在15-20頁(yè)結(jié)構(gòu)是題目頁(yè) - 背景與意義2頁(yè)- 相關(guān)技術(shù)2頁(yè)- 系統(tǒng)架構(gòu)2頁(yè)- 數(shù)據(jù)模型2頁(yè)- 推薦算法實(shí)現(xiàn)3頁(yè)- 結(jié)果展示3頁(yè)- 總結(jié)與展望1頁(yè)。答辯時(shí)老師最愛問的問題我給一份清單你的數(shù)據(jù)量有多大足夠說明問題嗎 ——答案是模擬生成了200萬條捐贈(zèng)記錄同時(shí)用公開脫敏數(shù)據(jù)做了驗(yàn)證數(shù)據(jù)規(guī)模可以調(diào)整影響的是計(jì)算時(shí)間而不是算法有效性。ALS的隱因子是什么意思 ——一定要能解釋清楚隱因子是用戶和物品在潛在特征空間中的向量表示通過矩陣分解得到例如教育偏好醫(yī)療關(guān)注度這類不可直接觀察的特征。你的推薦和淘寶的商品推薦有什么關(guān)系和區(qū)別 ——可以從數(shù)據(jù)稀疏度、行為語義、冷啟動(dòng)難度三個(gè)角度回答這能顯示你的思考深度。如果數(shù)據(jù)量再擴(kuò)大十倍你的系統(tǒng)哪里會(huì)先撐不住 ——需要你指出瓶頸比如ALS訓(xùn)練的shuffle成本會(huì)顯著上升、單節(jié)點(diǎn)元數(shù)據(jù)管理的壓力增大并說明可以怎么優(yōu)化換分布式訓(xùn)練的Spark集群、引入增量更新。這幾道題的答案一定要寫進(jìn)論文的第5章或者答辯PPT的附錄里。我甚至建議你在準(zhǔn)備階段就對(duì)著鏡子把答案說幾遍——答辯時(shí)的臨場(chǎng)表達(dá)和你在鍵盤上敲出來的文字完全是兩種要求。8. 寫在最后如果讓我重新做一遍這個(gè)項(xiàng)目會(huì)有什么不同項(xiàng)目交付到現(xiàn)在說實(shí)話我最大的感受是這個(gè)題目最值錢的部分不是算法多先進(jìn)、技術(shù)多炫酷而是它逼著你把一整套大數(shù)據(jù)技術(shù)棧真實(shí)地串起來走了一遍——從環(huán)境搭建、數(shù)據(jù)建模、ETL清洗、算法訓(xùn)練到結(jié)果評(píng)估每一個(gè)環(huán)節(jié)都有實(shí)際產(chǎn)物每一個(gè)環(huán)節(jié)都能在答辯時(shí)講出我做過、我踩過坑、我會(huì)解決的底氣。如果重新做一遍我會(huì)在三個(gè)地方做出改變一是在數(shù)據(jù)層面會(huì)更早地對(duì)接真實(shí)的公開慈善數(shù)據(jù)做補(bǔ)充驗(yàn)證而不是只靠模擬數(shù)據(jù)。模擬數(shù)據(jù)在字段邏輯上容易自洽但真實(shí)數(shù)據(jù)的噪聲和臟數(shù)據(jù)會(huì)更考驗(yàn)ETL設(shè)計(jì)。二是在推薦算法層面會(huì)嘗試在ALS基礎(chǔ)上增加一個(gè)基于規(guī)則的緊急救助項(xiàng)目推薦通道。慈善領(lǐng)域有一個(gè)特點(diǎn)時(shí)效性強(qiáng)的求助項(xiàng)目需要被更多人看到這和純興趣推薦的目標(biāo)有一定沖突但結(jié)合起來能極大提升推薦結(jié)果的社會(huì)價(jià)值。這也是這個(gè)題目區(qū)別于商業(yè)推薦系統(tǒng)的地方。三是會(huì)在交付物里增加一個(gè)簡(jiǎn)單的可視化展示界面用Flask搭一個(gè)極簡(jiǎn)后臺(tái)把推薦結(jié)果以網(wǎng)頁(yè)形式展示出來。技術(shù)上不難但答辯時(shí)的演示效果會(huì)好很多——評(píng)委看到的不只是命令行輸出的結(jié)果而是一個(gè)系統(tǒng)。最后分享一個(gè)很小的實(shí)用技巧提交Hive任務(wù)時(shí)養(yǎng)成用hive -f etl.hql --hiveconf dt2024-03-01傳參的習(xí)慣把日期和關(guān)鍵參數(shù)參數(shù)化不要寫死在SQL里。這樣當(dāng)你需要重跑某個(gè)時(shí)間段的數(shù)據(jù)時(shí)只需要改參數(shù)而不是改代碼。這個(gè)習(xí)慣在大廠面試的你如何設(shè)計(jì)可重跑的數(shù)倉(cāng)任務(wù)問題里也是實(shí)實(shí)在在的加分項(xiàng)。希望這篇文章能幫到正在和Hadoop、PySpark、Hive搏斗的你。這個(gè)選題不難但也不水關(guān)鍵是踏踏實(shí)實(shí)把每一步走通。有任何環(huán)境搭建、代碼調(diào)試或者答辯準(zhǔn)備的問題歡迎在評(píng)論區(qū)交流。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
97精品人人A片免费看| 色色爽爽天天| 在线理论片| www.婷婷五月天| 久re热视频| 密视AV综合在线| 五月综合亚洲| 人妻在线网站| 色播激情婷婷| 99热这里有精力| 综合啪啪| 日韩AC在线免费观看| 婷婷五月天资源| 婷婷婷狠狠| 99在这里有精品| 97色一二三| www五月| 丁香五月婷婷欧美激情-中文天堂最新版在线观看 | 人妻中文字幕网| 狠狠色狠狠鲁| 96精品久久久久久久久| 伊人久久丁香狠狠婷婷综合香蕉 | 欧美日韩成卜| 激情五月天开心| 九九自拍网| 免費观看aV在线网址| 操逼巨乳91| 五月亭亭激情综合| 伊人婷婷五月| 丁香六月婷月91婷月| 九九在线视频| 久久久99视频| 97激情五月天| 97人妻碰碰碰久| 超碰免费人| 激情四射五月天| 亚洲色婷婷激情| 婷婷丁香五月天色色| 五月丁香好婷婷A片网| 天天色伊人| 99热综合网| 婷婷综合在线播放| 欧美精品999| 男人的天堂五月丁香| 99热91| 开心激情站婷婷五月天| 丁香五月婷婷狠狠色| 久久久国产精品黄毛片| 亚洲视频99| 亚洲激情免费视频| 五月婷婷丁香婷婷| 丁香五月婷婷激情蜜桃| 日韩五月天婷婷| 色五月大| 激情五月天99色| 欧美成人一区二区三区在线视频 | 91久久日日| 色一情一乱一乱一区91| 日本爆乳片手机在线播放| 婷婷香五月| 久热这里只有精品3| 久久久久久久五月婷婷六月丁香综合,开心激情综合网 | 中文字幕日产A片在线看| 97精品欧美91久久久久久久| 中文中文在线| 91九色中文字幕女在线观看| 色 噜噜 九月 婷婷| 91女人18毛片水多国产| 九色PORNY自拍成人精彩视频| 婷婷五月天综合久久| www.丁香黄色五月天人与| 大香蕉五月丁香| 婷婷色av| 日韩另类在线观看| 97色久| 婷婷在线免费| 碰99在线| 久久婷婷草| 婷婷五月综合啪| 亚洲视频在线网站| 操久久网| 色婷婷裸体色性在线| 精品三区影院| 激情小说婷婷| 五月天网址在线刘玥| 超碰69天堂| 看全色黄大色大片| 激情网开心网| 六月激情婷婷| 日木WWW视频| 4399精品一区二区| 久久婷婷五月丁香网| 久久久久久xxxxx| 狠狠色综合网| 婷婷丁香激情五月| 色色色在线观看| 99免费| 色色婷婷综合| 激情五月图| 五月香蕉综合| 91操熟女| 操人久久| 79精品视频| 天天日夜夜曹| 五月丁香六月激情欧美综合| 婷婷丁香18| 色婷六月| 亚洲99精品欧美一区| 色色色色色色色色网站| 婷色五月| 色婷婷人人| 永久热91| 亚洲成人电影aaaa| 另类图片五月天| 99精品免费| 久久丁香五月天| 色婷婷久久久| 五月丁香网站在线播放| 亚洲1区| 综合五月天| 三十熟女| 九九热只有这里是精品| 天天骑日日爽| 婷婷金品综合视频| 婷婷色网| 久色大| 九八Av| 丁香五月婷婷激情网| 国产日韩亚洲欧美在线观看| 色婷婷狠狠禁久久| 色波激情五月天| 色宗合,宗合网| 色色五月婷婷丁香| Caoub青青超碰| 五月激情综合婷婷| 97色色网| 丁香色播五月天| 伊人久久婷婷| 久久激情视频| 色五月六月| 图片区 小说区 区 亚洲五月| 色噜噜夜夜夜综合网| 日本欧美国产| 丁香五月 无码| 激情五月天网页| 婷婷久草| 日本在线噜噜| 国产欧美va| 日婷婷| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 99精品久久久| 丁香五月婷婷激情小说| 狠狠搞狠狠操| 免费看无码视频A级| se99视频| 中文无码婷婷| 公的粗大挺进了我的密道| 日韩ac不卡无码| 亚洲激情婷婷| 五月天婷婷色播综合在线| 亚洲激情久久| 五月婷婷深爱六月| 欧美性生交A片免费看| 视频这里只有精品| 99热10在线高清播放| 色五月丁香激情视频| 中国女人做爰A片| 激情五婷网| 久草五月婷婷| 激情综合色| 久久99大| 久婷| 毛片新网地| a在线观看| 婷婷午夜精品久久久| 中文无码婷婷| 久久婷婷五月草视频| 天天干天天日蜜臀av| 亚洲色 视频| 色色综合院| www.黄色片-久久成人国产精品在线播放-999AV | 超碰人人超碰| 猫咪伊人AV| 五日激情综合| 天天粽合合合合| 婷婷色色网站| 久久免片| 五月婷婷之综合激情| 懂色av粉嫩AV蜜臀AV| 中文AV网站| 色噜噜狠狠色综合成人99| 激情久久久| 99热色在线精品| 亚洲碰碰碰| 99视频这里有精品| 狠狠干 狠狠操| 97色图片中文字幕视频在线观看| a久久| 在线观看中文字幕| 婷婷丁香五另类网站| 色婷婷五月丁香色| 蜜臀AV在线观看| 色五月亚洲五月天| 99九九精品视频| www.色婷婷| 五月丁香婷婷中文网| 婷婷欧美激情综合| 九九伦子片| 国产日比| 九月av| 日韩一区二区三区无码| 99热18| 热99热久| 色五月,com| 欧洲综合视频| 91无码高清| 六月丁香婷啪射| 丁香婷婷色色| 99久免费视频| 五月停停99| 亚洲九九视频| 五月丁香人妻| 亚洲旡码| 综合99久久天天综合| 99久久99热这里只有精品| 婷婷色五月丁香六月欧美啪| 日韩色五月| 婷婷五月丁香综合网| 久久伊人大香蕉| 噜噜噜噜综合在线| 五月婷婷免费看| 婷婷伊人激情婷婷| 色播五月丁香婷婷| 五月婷婷co.m| 亚洲五月综合色播| 99综合久久| 1024在线观看免费视频| 超极99精品| 色综合色欲综合天天免费| 丁香五月性爱爱五月| 无码一区精品一区视频| 亚洲国产精品VA在线看黑人| 97人妻超级碰碰碰碰碰| 丁香五月婷婷色综合| 大香蕉啪啪啪| 六月婷婷八月丁香| 婷婷综合亚洲| 色五月婷婷av| 99热91| 五月综合激情| 99热这里有精品| 另类五月激情| 婷婷五月天小说| 激情网五月天| 久久久久久久久人妻| 丁香婷婷射| 另类丁香五月天区图| 亚洲国产色婷婷| 狠狠干综合| 大香蕉综合网| 婷婷区日本| 色天天久婷婷| 五月婷婷丁香在线| 成人五月丁香社区| 97人人射| 在线五月婷| 久久99免费视频网站| 99爱在线视频观看| 五月天婷婷激情在线色图| 99热免费看| 亚洲欧美一区二区三区四区爱爱动图| 天天干天天做| 色色色综合色| 天天日色情| 日本婷婷色| 日韩在线观看亚洲| 狠狠爱婷婷色| 97操操| 99热大全在线观看| 综合久久人妻| 婷婷五月激情五月激情| 成人国产网站在线免费看| 色五月亚洲| 九色综合五月天婷五月| 婷婷欧美综合| 丁香五月天欧美在线| 思思热久热| 综合AV在线| 久久人妻视频| 五月丁了香蕉综合| www.狠狠操.co m| 成人AV在线电影| 精品国产va久| 欧美乱码国产一级A片| 久久99精品视频| 人妻久久久| 雪千夏麻豆| 精品99视频| 99综合免费视频| 激情性爱五月天网页| 久久激情四射| 开心深爱五月天| 久久99这里只有精品视频| 九九久热| 欧美在线| 丁香色情五月综合激情| 色99在线| 人人播| 激情av| 综合超碰熟| 婷婷放心五日爱| 狠狠色精品综合| 六月撸婷婷| 激情视频网址| 99在线小视频| 婷婷五月天人妻| 久色激情| 91久女| 精品思思久久| 超碰免费人妻| 五月天基地| www,欧美干干干干干干| 九九無妻| 五月丁香成人| 九九精品免费| 亚洲国产网址| 区区欧美你爱| 久久一级AV| 狠狠干婷婷| 天天弄天天操| 日韩视频女神99| 99色在线观看| 综合激情五月天| 日本在线观看91| 九热...av| 精品乱码久久久久| 婷婷五月超碰| 情趣视频66| 一本大道伊人AV久久综合| 色婷婷亚洲| 色五月婷婷在线观看| 少妇人妻偷人精品无码视频新浪| 青草网在线观看| WWW99热| 无码动漫AV| 99热视精品| 大香蕉九九| 99免费综合网| 狠狠插狠狠操| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 99久在线精品99re8热| 丁香六月欧美| 狠狠干在线| 日韩欧美成人一区二区三区| 丁香五月天BBw| 婷婷色色五月| 狠狠操.COM| 九九aV| 久久这里只有精彩| 丁香五月性| 久热只有这里有精品| 九九RE视频在线精品| 丁香五月人妻| a网站免费观看| 日韩狠狠色| 久久婷婷网| 色婷婷亚洲| 激情婷婷色色| 熟女乱论网| 久久九九免费视频| 久久99久久99精品免观看粉嫩| 丁香五月天堂网| 俺也去五月婷婷丁| 五月天婷婷婷| 开心五月婷婷婷美女| 激情六月婷婷| 99热 这里只有精品 国产 日韩| 色色色综合网| 操你av| 狠狠色婷婷丁香五月| 五月丁香婷婷激情视频| 中文字幕,综合,91| 五月丁香啪啪啪| 色五月开心婷婷| 三人荫蒂添的好舒服A片| 激情婷婷五月色| 国产性爱大片久久| AV操逼网| 春色激情第四色| 色婷婷亚洲综合网站| 色偷偷综合| 婷婷激情性爱| 成人片黄网站色大片免费毛片| 26uuu欧美亚洲日韩| 丁香五月激情综合久久| 色五月天激情| 婷婷五月天激情综合网| 丁香五月香蕉| 婷婷丁香五月综合| 天天插天天插天天插天天插| 五月丁香六月久久| 激情五月九九九| 久久久com| 久久精品一区二区三区四区| 五月亭亭直播| 色婷婷综合中心| 视频1区2区| 大香网伊人久久综合| 五月中旬婷婷丁香六| 婷婷玖玖五月天| 91欧美| 亚洲激情另类| 亚洲麻豆乱码国产2028| 日本久久99| 亚洲无码影音| 亚洲激情四射| 99ri精品视频在线观看| 五月天综合婷婷| 久久视这里只有精品| 婷婷五月综合中文字幕| 五月婷婷色| 五月婷婷片| 激情五月激情综合俺也去婷婷小说| 91啦丨九色丨刺激中文| 日韩国产在线精品| 欧美性做爰大片免费看办公室| 久热这里只有精品6| 天天草人人摸| 丁香5月激情网| 99啪在线视频| 色情成人五月天| 婷婷激情五月综合| 色五月琪琪| 逼里香不卡| 天天综合.com| 玖玖资源站国产| 中文av在线观看| 可以免费看的av网站| 97干97色| 九九色大香蕉| 欧美VA视频| 色 噜噜 九月 婷婷| 亚洲精品又粗又大又爽A片| 五月丁香激情四射| 99九九在线| 欧美 日韩 成人| 婷婷五月天改成什么了| 亚洲99综合| 任你干嘛免费视频播放| 丁香六月色| 五月做爱| 九九综合88| 五月婷婷丁香91| 国产成人精品亚洲线观看| 97人妻碰碰中文无码久热丝袜| 第五色婷婷| 婷婷五月天堂一本在线| 五月激情婷婷在线| 天天激情站| 婷婷五月图片小说视频| 色爱终和网| 99er在线观看| 99青青草| 久久久无码精品成人A片小说| 色播五月网| 久久美女五月天| 婷婷丁香五月婷婷| 99色网站| 五月色网| 一级片操逼视频| 国产成人AV不卡| 五月婷婷很很色| 大操人妻| 六月丁香狠狠爱| 99噜噜| 大香蕉五月丁香| 天天日天天添| 2050人人操免费工开爱| 国内自拍97在线| 亚洲av另类在线观看| 丁香五月停停av| 久久aaaaa| 久久婷婷五月综合啪| 成人AV中文字幕| AV在线免费播放| 《诡秘之主》在线观看| 嫩草AV久久伊人妇女超级a| 日日爱699| 99热都是精品| 天天爽夜夜操| 狠狠操狠狠色| 婷婷五月天奸女| 天天射影| 婷婷丁香激情综合色情| 五月天在线视频尤物视频在线看| 亚洲99热| 2022久久婷婷| 9 99免费视频| 五月花成人网| 九九在线精点品| 久久综合干| 亚洲黄色影视| www.爱婷婷.com| 97人人操在线| 五月丁香婷在线| 色婷婷精品视频| 99超级碰免费视频| 97操碰人人| 婷婷五月天av网| 久久九九在线视频| 色五月综合激情| 免费观看欧美成人AA片爱我多深| 金品在线视频99| 婷婷丁香社区网| 欧美成人精品老美女噜噜噜| 色色色色色色色色网站| 夜色.cnm| 丁香六月视频| 操人91| 最近中文字幕2019视频1| 91色在线 | 日韩| 99这里的视频都是精品| www,超碰| 色吊丝99| 亚洲小说欧美激情| 婷婷网五月天| 婷婷综合97| 婷婷五月综合啪| 日本久久精品| 综合色影院| www夜夜操wwwcon| 人妻无码精品一区| 综合99久久天天综合| 四虎婷婷五月天| 97综合在线| 一区二区传媒视频| 思思热国产| 五月天激情四射| 狼友超碰| 五月丁香六月天| 狠狠噪| 99热在这里只有免费精品| 日日爽夜夜爽| 丁香九色不卡aaa| 日韩成人网站精品久久大全| 日日操夜夜爽| 在线成人网站| 婷婷伊人久久| 青青草色在线视频观看| 另类激情五月在线视频欧美| 激情五月瑟瑟| 激情婷婷啪啪| 日美三级| 五月综合婷婷五月| 久久五月婷综合网| 激情五月色播五月| 婷婷五月色花丁香社区| 337午夜福利| 国产成人AV| 婷婷五月丁香在线观看| 大伊香蕉精品视频在线| 男人综合网| 国产精品扒开腿做爽爽爽A片唱戏| 日本精品在线噜噜噜| 亚洲AV网站在线观看| 9久精品视频| 久久久无码精品成人A片小说| av人人操| 六月丁丁香| 久久狠婷婷| 婷婷无码五月天| 日韩xx在线| 色婷婷成人五月| 色综合久久88色综合天天| 另类五月激情| 久久色五月天| 午夜五月天| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 五月色网| 婷婷五月婷婷| 五月天激情国产综合AV| 青青操成人福利| 丁香五月天激情视频| 五月亭亭色| 亚洲乱码w在线观看| 人妻视频在线| 精品一区二区三区四区五区六区| 狠狠久综合| 久热精品9999| 日韩欧美颜射| 噜噜噜色噜噜| 玖玖精品婷婷| 丁香五月电影| 久久机热这里只有 | 色播五月丁香综合| 天天日,天天插| 五月天播播综合| 九月丁香八月婷婷加勒比| 日韩五月丁香| 日韩999| 在线理论片| 99热在这里只有精品| 大香蕉婷婷五月| 深爱五月婷婷| 九九热最新视频| 婷婷香香五月| 99热人人操人人操| 亚洲99热| 天天碰夜夜爽| 日日操夜夜操狠狠操| 激情婷婷护士激情| 色五月欧美| 久久婷婷五月综合伊人| 久热婷婷| 蒲京久久无码视频| 这里只有精品视频99| 婷婷五月天激情AV影院| 五月丁香婷婷综合久久| 懂色av粉嫩AV蜜臀AV| 超碰成人在线观看| 亭亭五月色男人| 天天日天天插天天操| 墨西哥毛片内射精| 五月天婷婷色色| 夜夜爽天天爽| 91综合视频丁香| 国产9色在线/日韩| 五月天综合影院| 中文字幕丰满乱孑伦无码专区| 精品视频网| 久99| 五月天婷婷色色| 欧美人妻一区二区| 五月丁香激情综合网官网| 超碰99热精品| 狠狠干狠狠操狠狠爱| 日日日日日| 欧美日韩成人免费在线| 丁香六月成人| 我要射综合| 天天激情综合| 色色99| 99久在线精品99re5热视频| 偷偷与邻居做爰完整视频| 亚韩在线视频| 免费97碰碰| 另类激情五月天| 久久婷婷色丁香| 色婷婷手机在线| 爆乳熟女一区二区三区爆乳| 丁香六月激情国产| 第四色色色色色丁香五月天| 尤物一区二区| 日产精品久久久久久久蜜臀| 亚洲九区| 六月激情网| 色综合激情| AV成人在线播放| 99re这里| 五月婷亚洲精品| 综合激情深爱| 这里只有精品在线免费视频| 99秘 在线| 我要色综合五月婷婷| 99热99日…..| 热久久99视频| 五月天天天开心激情网| 色色色com| 九九操屄| 久久性综合| 丁香婷婷五月色综合| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 这里只有精品99www| 91免费在线视频6| 99爱免费在线观看| 天天噜天天爱| 天天免费日日夜夜夜夜| 丁香五月激情五月开心五月| 亚洲a色| 五月天伊人网| 在线观看免费狠狠色丁香香综合| 激情AV在线| 性高潮久久久久久-九九九九九九九九九九热-成人AV| 国产精品VA在线| 天天干天天拍| 久久五月综合| 97在线观视频免费观看| 91精品91久久久久77777| 丁香婷婷影院| 综合狠狠干| 丁香色五月直播| 色婷丨日丨天丨综合久久| 插插插色综合网| 这里只有精品视频在线看| 狠狠色噜噜| 99爱视频| 五月丁香啪啪| 中文字幕丰满乱孑伦无码专区 | 激情九九这里只有精品| 九色无码| 天天拍天天操| 婷婷基地成人五月天| 99热在线看| 99精品久久| 天天射综合网天天插| 老司机伊人| 91天天操天天干天天射| 国产一区二区av免费| 大香蕉啪啪啪啪啪啪| 欧美日朝成人| 中文字幕乱轮| 亚洲色在线观看| 丁香五月天AV在线| 日韩一级片| 成人婷婷五月| 婷婷午夜精品久久久| 色色亚洲| 97色色婷婷五月天| 婷婷五月激情欧美大胆视频| 99热老网站| 久久狠色噜噜狠狠狠狠97| www,99热| 精品无码久久久久久久久| 丁香九色不卡aaa| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 欧美丁香五月97色| 久热这里只有精品66| 99色色| 日本V在线观看不卡视频网站| 久久人人九| 99热这里只有精品33| 色婷婷综合亚洲| 伊人久久大香线蕉精品| 人妻精品在线| 舔色婷婷| 五月激情四射网站| 久鲁鲁色网| 99视频网址| 噢美99| henhencao国产在线| 五月天激情四射网站| 激情五月天婷婷播播久久综合91| 久久婷婷六月综合| 十一月婷婷激情四射| 99ER热精品视频| 国产韩日亚洲美州欧亚综合在线| 狠狠色噜噜狠狠狠狠综合| 人人色人人弄人人操| 玖热精品综合视频| 久久久久久9| 丁香六月青青草| 开心五月色婷| 五月天电影网| 思思热99er在线视频| 五月天堂色| 激情久久婷婷| 激情丁香五月天图片| 色狠狠色综合久久久绯色aⅴ影视| 噜噜色五月| 99天堂网| 热九九精品| 玖玖爱资源站| 欧美精产国品一二三区| 五月婷婷九九热| 超碰丁香五月| 久久99热在线观看| 色色色色色日韩午夜激情 | 超碰熟女农村在线69| 少妇高潮呻吟A片免费看软件 | 五月婷婷在线观看| 色婷婷8| 婷婷五月天99| 丁香六月成人| 天天干天天叉| 综合九色| 婷婷五月在线观看| 超级碰碰91| 久久婷婷五月丁香网| 91丨九色丨熟女丰满| 五月天激情网站| 婷婷爱五月| 91九色精品| 91婷色| 五月天色色色| 开心五月六月婷婷| 国产精品第一国产精品| 色播五月丁香婷婷| 色99久草在线| 久久精品性爱| 九九九日本熟女| 99视频精品在线| 久久亚洲色导航| 色135综合网| 亚洲 六月 综合| 久热在线观看视频9| 激情五月天综合| 日韩黄色电影| 夜夜躁爽日日| 亚洲看av的网站| 午夜]香婷婷深深爱| 九九色热| 狠狠色婷婷7777久| 国精产品一区一区三区免费视频| 五月天另类图片| 日本精品干| 丁香五月电影| 午夜精品777| 99啪视频在线观看| 婷婷视频网| 丁香狠狠| 操操操91| 激情久久久| 丁香五月天激情小说| 玖色色综合| www.色五月| 五月婷婷无码专区| 99久久99久久| 99国产精品白浆在线观看免费| 狠狠搞亚洲| www.91操| 丁香五月狠狠在线观看| 日日干日日| 男女啪啪做爰高潮无遮挡| 狠狠操狠狠干综合| 男人天堂99| 丁香香蕉射射射| 婷婷五月天福利| 久久视频这里都是精品| 免费在线a| 婷婷五月天激情网| 国产日韩亚洲欧美在线观看| 这里只有精品免费在线视频| 五月婷狠狠| 任你爽视频| 六月 丁香 视频| 九九99视频精品| 《久久综合九色综合97婷婷| 202丰满熟女妇大| 国产在这里只有精品| 婷婷五月天中文字幕.| 碰碰碰碰碰99| 日本猛少妇色XXXXX猛叫| 激情五月丁香亭亭| 在线综合婷婷| 三级三久久线久久99久目本WW| 婷婷99视频在线| 丁香色婷婷五月天| 激情五月婷婷综合| 日日夜夜噜噜爽爽| 激情婷婷丁香五月天小说| 婷婷久久婷婷| 日韩黄色影院| 国产成人+综合亚洲+天堂| 五月激情六月丁香| 激情九九这里只有精品| 袁子仪视频观看| 97人人操在线| 停停五月色宗合| 91在线资源| 国产69久久久欧美黑人A片| a在线观看| 五月婷婷在线视频| 久久免费视频62| 亚洲综合网激情小说| 亚洲综合五月天婷婷丁香| 99久久久精品| 99热人人艹| 免费精品99| 久机视频这只有精品| 婷婷九月在线| 色五月婷婷亚洲最大| 五月婷婷六月婷| 婷婷播播五月天| 婷婷五月天无码熟女| 激情欧美婷婷| 婷婷五月大| 中文字幕婷婷| 日韩不卡DvD| 天天射天天干天插色综合| 丁香六月婷婷社区| 日本三日本三级少妇三级66| 狠狠色中色| 丁香九月激情在线视频| 亚洲无码影音| 伊人喵咪a V| 色婷插| 婷婷在线日韩综合| 91久久久久| 91操黄| 久久婷婷网址| 99热大| 第五婷婷伊人丁香| 五月丁香色综合| 久久新| 99热e| 日日爱678| 五月丁香婷婷综合在线| 婷婷五月天在线综合导航| 色亚洲中文| 久久66精品| 精品A√| 人人操五月天| 激情综合五月天| 天天天天操| 蜜桃人妻无码AV天堂三区| 北京熟妇搡BBBB搡BBBB| 色欧美色色色| 中文字幕91,综合| 色婷成人狠干| 91尤物九色在线| 激情五月深爱五月观看| 狠狠操天天操天天操| 99热这里只有国产精品| 婷婷六月激情在线视频| 泰州成人视频| 久久婷五月婷| 8090在线影视少妇| 在线色婷婷| 久久久久久久久久久97| www.色婷婷| 最新激情五月天| 日韩在线aaa| 99自拍视频网站| 97在线精品| 六月色丁香婷婷| 热99久| 色婷五月婷婷| 五月丁香婷婷成人综合网| 狠狠色97| 成人精品一区日本无码网| 99热九九九九| 色香蕉影院| 99亚洲色| 九九精品99| 亚洲亚洲人成综合网络| 日本欧美999久久久三级片| 人妻综合网| 五月天婷爱综合| 五月天伊人综合| 日本久久网| 亚洲热久| 色必久悠悠影院| 99综合视频| 五月丁香成人网| 日本天堂久久| 久久永久网址| 丁香婷婷基地| 日产精品一线二线三线芒果| 开心久久网婷婷| 激情小说五月丁香在线视频观看视频| 天天色域综合网| 丁香五月av| 日韩五月婷婷| 狠狠色丁香婷婷基地| 先锋资源91| 中文字幕免费高清电视剧| 99超级碰碰| 亚洲性色XXXXX| 婷婷五月色天| 久久免费试看120秒| 婷婷九月激情| www.婷婷亚洲基地| 国产亚洲成人综合| 亚洲色色在线| 色丁香五月天| 啪啪色激情五月天| 五月天婷婷青青| 九久9精品| 大香蕉75线| 久久婷婷五月草视频| 激情五月五月婷婷| 玖玖色资源| 婷婷香五月综合激情| 色墦五月丁香| 91一起艹| 色婷婷激情四射视频| 九九热9| 久久这里只有精品07| 九九热99免费视频| av五月丁香婷婷网| 26UUU精品一区二区c〇m| 99热在这里只有精品| 99热综合色图| 色99网站| 香蕉曰比| 五月综合婷婷久久在线| 青青青在线视频国产| 婷婷色亚洲| 999婷婷综合| 亚洲色图81p| 99视频久久| 91色欲综合| 五月丁香六月婷婷亚洲视频| 强辱丰满人妻HD中文字幕| 激情综合网络插| 狠狠干婷婷| 精品久色| 狠狠色成人影片| 大香蕉人妻| a网站免费观看| 99免费热视频在线| 丁香五月婷婷激情尤物| 啪啪东京热| 国产欧洲欧洲精品久久| 野外99热| 婷婷五月免费视频| 99热 在线播放| 亚洲热视频| 激情五月天色婷婷综合| 婷婷六月丁香五月| 午夜日韩久久久网站| 日日天天干| 99噜噜| 天天干天天干天天干天天干天| 天天色天天射天天日| 九九香蕉网| 五月天激情黄色小说在线观看| 欧美熟女99| 99热99在线| 国产精品涩涩涩视频网站| 亚洲激情高潮| 丁香五月激情久久麻豆| 日日操天天| 婷婷五月天丁香激情| 丁香成人五月天| 五月天伊人综合| 五月婷婷,六月丁香| www.婷婷网| 中文字幕乱码亚洲精品一区| 都市激情小说婷婷| 无码九九九九| 久激情网| 婷婷综合五月天激情| 免费无码毛片一区二区A片 | 五月激情婷婷国产精品久久久久久| 狠狠色噜噜狠狠狠888| 婷婷综合五月天| 日韩精品AV一区二区三区| 亚洲狠狠狠| 五月丁香欧美综合| 九色婷婷| 五月天久久网站| 超碰9| 国产肥白大熟妇BBBB视频| 色永久| 色综合九九| 久久久天堂国产精品女人| 婷婷五月av| 国产片天天爽夜夜爽| 亚洲日韩久久婷婷伊人| 99热在线看片| 小视频在线亚洲| 99久久五月婷婷| 99热伊人| 99r这里只有精品在线观看| WWW.99视频| 激情文学综合婷婷五月天丁香花| 天天插综合| VA日本视频| 94干大香蕉| www.激情| 日日噜噜夜夜狠狠久久丁香六月| 99er这里只有精品| 第四色色色色色丁香五月天| 色人久久| 亚洲色亚洲精品| 色九网| 91大操| 99热在线观看免费精品| 这里只有精品免费观看网占| 91久久久久久久久| 婷婷六久久| 成人片在线播放| 婷婷亚洲综合| 亚洲尤物在线| 色999五月色| 97丁香视频| 欧美性做爰大片免费看办公室| 久久这里有精品| 内射激情在线| 色婷婷久久综合| 99热一本| 九九亚洲天堂| 国产成人网| 五月天综合色| www.婷婷,com| 五月天无码| 永久免费一区二区三区| 东京热五月婷婷| 天天操综合网| 91狠狠色色丁香婷婷综合久久| renre人人操国产超碰在线| 六月婷婷综合| 色五月婷婷自拍| 丁香花狠狠婷婷亚洲中文字幕| 99精品在这里| 26uuu精品一区二区| 激情五月天色婷婷| WWW五月天| 婷婷99狠狠躁天天躁| 日韩成人综合网| 五月天六月婷婷电影| 丁香六月高清视频| 天天做天天爱天天日| 婷婷久久99| 99热网址| 激情婷婷九月| 九月大香蕉| 色婷婷yy久| 激情五月婷婷综合秋霞| 99综合网| 97久久视频| 天天天天天天操| 欧美综合五月丁香六月婷| 激情综合激情综合| 五月色婷婷综合| 99在线精品视频在线观看| 天天插天天| 天天操夜夜玩!| 激情婷婷另类| 五月丁香六月情婷婷久久| 天天天天天色| 日本五月婷婷久久久六月丁香| 狠狠大香婷婷爱| 噜一噜免费视频| 色欲Av五月天| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 91啪啪视频| 亚洲99综合| 久久丁香五月婷婷| 人妻人人操| AV中文在线| 激情婷婷五月女| 五月丁香婷婷无码A∨| ...婷婷国产成人亚洲日韩| 婷婷天天舔| 五月天五月色| 区区欧美你爱| 人人草人| 99成人| 日韩无码专区| 亚洲中文字幕av| 五月天伊人| 99riav 亚洲| 婷婷九九色| 九热视频精品| 婷婷丁香九月| 色色五月婷婷| 丁香五月婷婷动漫| 亚洲五月天婷婷综合| 天天操天天曰| 91精品婷婷国产综合久久| 色五月AV| 欧美日韩二区在线| 操婷婷基地| 色射影院| 婷婷爱综合| 九九99一区| 狠狠爱婷婷爱| 五月丁香大香蕉| 日本波多野结衣视频| 天天综合色丁香| 伊人久久婷婷| 五月婷婷婷婷婷婷艺术| 思思热视频| 五月婷婷六月丁香在线| 久久久国产精品黄毛片| 九九热青青草| 激情AV| 特级片神马电影| 涩综合网| 青草视频在线观看视频| 日本在线视频看se99| 天天日天天做天天舔| 丁香五月天BBw| 國語久久婷| 国产黄大片在线观看画质优化| 久热久re| 国产亚洲在线观看| 青青草视频福利| 日韩在线99| 99国产精品久久久久久久久久久 | 9久久久久| 9久久狠狠的| 99热99极品观看| 激情婷婷综合| 久狠狠狠| 久草热8精品视频在线观看| 日韩精品电影| 日日色五月天| 99久久99久久| 艳妇野外情欲放荡HD| 成人在线网站| 五月色婷婷AV| 91色婷婷综合久久中文字幕二区| 啄木鸟黑丝一区二区| 色偷偷综合| 婷婷激情五月| 大香蕉丁香| 天天色天天爱天天舔| 色婷六月| 色色色色丁香| 丁香 婷婷 激情 综合 五月| 久久丁香五月婷| 99国产精品白浆在线观看免费| 激情五月婷婷啪啪| 国产va在线视频| 丁香六月啪啪啪| 日本偷拍九九九| 少妇激情五月婷婷| 五月天激情图片| 91碰操| 日本狠狠爽| 婷婷99狠狠| 91操屁股| 俺去也在线官网| 激情综合网五月婷婷| 97色图片中文字幕视频在线观看| 久久九九99字幕| 免费亚洲婷婷| 伊人狠狠丁香婷婷综合尤物| 常久最新免费的色吊丝| 日本三级中国三级99人妇网站| 日本三级中文字幕| 5月婷婷激情在线| 美女婷婷激情亚洲| A一级操| 丁香婷婷深情五月亚洲| 99热丁香五月| 开心激情播播五月天| 少妇2做爰HD韩国电影| 91色色色| 色丁香五月天| 婷婷六月视频| 婷婷五月激情六月| 伊人激情综合| 亚洲久久婷婷| 国产偷人爽久久久久久老妇APP| 婷婷五月激情的图片| 另类图片天天影视在线观看| 在线观看免费狠狠色丁香香综合 | 五月丁香趴趴| 夜夜骑天天玩天天日| 成人AV在线中文版| 色欲日日躁| 亚洲亚洲人成综合网络| 久久99这里| 亚洲综合五月天婷婷丁香| 五月丁香婷婷福利| 久热这里只有| 亚洲成人网无码| 五月天综合在线| 思思视频久久| 日韩无码专区| 国产日韩欧美性生活| 99热伊人| 激情综合网婷婷久久| 99热综合| 国产综合激情五月久久| 成人免费120分钟啪啪| 草美女在线观看视频在线播放| 操一区| 婷婷六月丁香色| 九月丁香很很色| 99热无码| 激情九色|