【小(xiǎo)編推薦】Pinot-LinkedIn如(rú)何将大(dà)數‌£γ↔(shù)據做(zuò)到(dào)實時(shí)與民λ$ (mín)主化(huà)

2015-07-17   |♥✘™₩   發布者:梁國(guó)芳&©±≈nbsp;  | &n→®bsp; 查看(kàn):3320次→ε∏

IT新聞
 回國(guó)創業(yè)已經兩個(gè$↓φ")月(yuè)了(le),最近(jìn)Pi¶€not開(kāi)源的(de)消息布滿了©$(le)我的(de)朋(péng)友(yǒu)圈。作(zuò)為(wèi)₽∑≤±在世界上(shàng)第一(yī)個(gè)嘗試使用(yòng),并推廣¥♥®Pinot作(zuò)為(wèi)分(fēn  •)析型工(gōng)具的(de)LinkedIn團隊,對(duπ¥πì)我們的(de)Pinot團隊由衷贊賞。我代表≠∑≈我的(de)團隊在這(zhè)裡(lǐ)與社區(qū)‍•‌™的(de)小(xiǎo)夥伴們分(fēn)享下(xià)一(​≥  yī)些(xiē)體(tǐ)會(huì)和‌÷±€(hé)經驗。 

一(yī)切都(dōu)來(lái)源于LinkedIn S♠♥ε±ponsored Update這(zhè)個(gè)≈↕​♠LinkedIn廣告業(yè)務轉型到(>★dào)移動端成功的(de)産品開(kāi)發。2↕♦013年(nián),LinkedIn緻力于構建300萬的(de♠↔♥£)企業(yè)與2.3億(2013年(nián)第二季度的(>¥λ​de)用(yòng)戶數(shù))全球用(yòng)戶聯通(tōng)的(♦±♦‌de)橋梁,幫助企業(yè)直接推送最相(xiàng)關λε$∏的(de)信息流到(dào)用(yòng)戶首頁。•"這(zhè)是(shì)一(yī)個(gè)重要(yào)的(de)戰  ↓略性産品。之前的(de)應用(yòng)都(dōu)是(shλ&ì)先有(yǒu)網頁端産品,然後才會(huì)建₽✘立移動端的(de)應用(yòng)。而Sponsor¶★&♦ed Update是(shì)第一(yī)個←★(gè)同時(shí)在Web和(hé)Mobile App上(shàng)發π Ω±布的(de)LinkedIn商業(yè)應用(yòngα•÷)。實質上(shàng),Sponsored U§≥←pdate是(shì)鏈接網頁端和(hé)手機(jī) ₽β‌端的(de)廣告業(yè)務,貨币化(huà)是(shì)業(yè)務重點。然÷"§↔而,LinkedIn把用(yòng)戶體(tǐ)驗<>放(fàng)在首位來(lái)考量,努力尋找 ≠φ收入和(hé)互動的(de)平衡點,避免用(yòng¥↓)戶被鋪天蓋地(dì),或是(shì)不(bù)相(xiàng)幹的(de ±)廣告影(yǐng)響。而尋找平衡點的(d<₹e)關鍵在于對(duì)數(shù)據的(de)應用(y₹π•òng),使有(yǒu)償廣告與自(zì)然信εφγλ息合理(lǐ)地(dì)更新。但(dàn)是(sh§±§±ì)多(duō)平台的(de)特性,更增加☆>了(le)我們分(fēn)析的(de)複雜(zá)度。

圖1 2014年(nián)10月(yuèΩεφ),我和(hé)Parveen在紐約舉辦∞£&™的(de)Starta+Hadoop會(huì)議(yì)上(shàng)一(yī)起做(zuò)了(le)分(fēn)享  ♥‍。

做(zuò)好(hǎo)數(shù)據分(fēn)析,必先做(zuò←×)好(hǎo)數(shù)據點采集的(deβΩ'♦)工(gōng)作(zuò)。對(du쮀↑≥)于Sponsored Update來(lái)說(shuō),是(sh₽£↔&ì)網頁和(hé)移動端同時(shí)采集,而且由λ¶₹于産品剛剛落地(dì),對(duì)數(shù)據≠ ©✔量和(hé)種類也(yě)有(yǒu)很(hěn)多(δ×'duō)要(yào)求。那(nà)時(shí)候我們分(fēn)析團隊的®§↕∑(de)廣告數(shù)據分(fēn)析經理(lǐ)<♥單元明(míng),将很(hěn)多(duō)時σ‍(shí)間(jiān)都(dōu)花(huā)在配合産品經理✔αγ (lǐ)和(hé)業(yè)務人(rén)員(yuán)建立大(d∏±®∏à)量的(de)頁面标簽,追蹤代碼以及核心的(de)KPI定義上(sh&γ♥✘àng)。大(dà)緻分(fēn)為(wè§↑ ≤i)幾類思路(lù):第一(yī),維度需求:比如(<↔§₽rú)用(yòng)戶的(de)地(dì)↔♠≥區(qū),職業(yè)級别,職業(yè)功能(néng),行(xíng)業(↓< yè),技(jì)能(néng),人(rén)脈數(sh ↕>®ù)量等等;第二,行(xíng)為(wèi)數(shù)據:比如(rú®‍♦)用(yòng)戶多(duō)少(shǎo)次登陸L"™inkedIn,互動級别,這(zhè)些(xiē)用(yòng)戶關注了(l¥₹& e)哪些(xiē)公司,訪問(wèn)了(le)哪些(xiē)公司的(de)主•¥≈☆頁等等;第三,分(fēn)群用(yòng)戶:根據一(yī)些(xiē)" €維度區(qū)分(fēn)用(yòng)戶,每個(gè)群組所看(kàn)¥ ±∑到(dào)的(de)有(yǒu)償廣告更新與自(zì)然♠←信息更新的(de)頻(pín)次是(shì)不(bù)一(yī₽δ∞→)樣的(de)。這(zhè)個(gè)部分(fēn),我們團隊的(de)‍§​元明(míng)帶領整個(gè)Link₽§<€edIn廣告數(shù)據分(fēn)析組,每周7天在線将各♠>種分(fēn)析标簽、數(shù)據采集↔÷的(de)計(jì)劃和(hé)商業(yè)分✘≈®✔(fēn)析KPI與整個(gè)的(de)管理←±(lǐ)層,廣告産品,移動端和(hé)工(gōng)程部門(mén)進行(x∏♠$>íng)各種分(fēn)析結果的(de)溝通(tōng)。

然而,當時(shí)我負責整個(gè)商業(yè)分(fēn)析部門("φmén)的(de)數(shù)據解決方案,按照(zhào)query的(d®₽ ♣e)時(shí)間(jiān)、用(yò∑≤ng)戶維度、用(yòng)戶行(xíng)為(wèi)維度、不(bù)‌₽★☆同的(de)群組維度估算(suàn)了(le‍®)一(yī)下(xià),如(rú)果要(yào)做(zuò)任意時(shí♦ ​)間(jiān)範圍內(nèi)的(de)任意維度組合的(de)指标✔✘​運算(suàn),用(yòng)2000台左右的(←→​εde)Hadoop集群,在有(yǒu)很(hěn)重的(de)Queu✔☆e的(de)基礎上(shàng),即使跑一(<★yī)天的(de)Hadoop腳本,也(y‌≥₩™ě)不(bù)能(néng)跑完所有(yǒu)的(de)分(fēnσ♣✘)析組和(hé)。而且,每天産品經理(lǐ)要(yào)對✔¶≈£(duì)超過數(shù)十億行(xíng)的$​(de)數(shù)據進行(xíng)實時(shí)的(de)分(fēn)↔¶析,我們當時(shí)的(de)BI解決方案<‌刷新一(yī)次要(yào)滞後5分(fēn)鐘(zh✘£©§ōng),速度很(hěn)慢(màn)。而新産品對>≠ε(duì)分(fēn)析的(de)要(yào)求就(jiù)是®↓β(shì)不(bù)斷提出假設,不(bù)斷分(fēn)析變量的(de☆☆₹∞)過程,維度無法确定下(xià)來(lái),如(rú)果分(fēn)析師(sβ↑ φhī)要(yào)增加分(fēn)析維度的(de)需求,那(nà ♦↓)麽我們商業(yè)數(shù)據分(fēn)析部要♥&™(yào)跑更多(duō)的(de)腳本。我們都(dōu)知(zhī)道(★>$↔dào),維度越多(duō),要(yào)預先聚合運←δ≈♠算(suàn)的(de)可(kě)能(néng)性是( ®shì)2的(de)N次方增加。

Sponsored Update是(shì)LinkedIn首頁上(sh☆↓àng)的(de)産品,生(shēng)成的(de)數(₽φ↔ shù)據量很(hěn)大(dà),而且每一(yī)條更新背後都(dō¥↑↔βu)有(yǒu)各種多(duō)維度的(de)邏輯。這(zhè) <€ 樣的(de)挑戰,不(bù)能(néng)用(yò♦>≠ng)傳統的(de)辦法解決,這(zhè)就(jiù♦☆ε∞)是(shì)我們一(yī)直在尋找各種方案的(de)♣'≠₽原因。當時(shí)的(de)Pinot是(shì)完全服務于線上(sh ↓×àng)交易型數(shù)據庫的(de)一(yī)種方案。在我​®φ 們與LinkedIn的(de)工(gōng)程資深主管溝通(tōng)<'←後,我們決定在沒有(yǒu)OLAP分(fēn)析案例的(de$↔₽±)情況下(xià)嘗試Pinot。

為(wèi)何使用(yòng)Pinot

使用(yòng)Pinot的(de)原因♥♥α。在LinkedIn和(hé)工(gōng)程師(shī)團隊保∞₹持良好(hǎo)的(de)關系很(hěn)關鍵(好(hǎo)∏Ω像在哪裡(lǐ)都(dōu)一(yī)樣啊λ£),我最初在嘗試senseidb,但(dàn)是(shì)s ∑γenseidb的(de)主程已經去(qù)了(le)Twi©​εσtter。當時(shí)管理(lǐ)Li₩>♦nkedIn搜索的(de)主管就(jiù)向₽‍§我介紹了(le)Pinot開(kāi)發團隊→π↑,一(yī)共隻有(yǒu)3個(gè)人(rén)的(de♦Ω​)團隊,還(hái)有(yǒu)一(yī)個(gè)工(g'∏βōng)程師(shī)是(shì)新加入的(de)。Pi​☆ ✔not當時(shí)主要(yào)是(shì)支持Link€∞<§edIn線上(shàng)的(de)系統,β≈λ每個(gè)QPS要(yào)求小(xiǎo)于600毫秒₹φ(miǎo),産品支持SQL的(de)Rest API,數(sh©☆‌®ù)據源可(kě)以是(shì)kafka,可(kě)¥£‌以是(shì)從(cóng)Hadoop Avro format直接建s≥₩egment導入Pinot,支持filter,gr©‍↔oup by。他(tā)們團隊小(xiǎo),任務重,主要(yào)​→專注于線上(shàng)服務,本來(lái)沒有(yǒu₩™ε)時(shí)間(jiān)支持我們線下(xià)分(fēn)析案✔ 例。好(hǎo)在他(tā)們團隊主管與我們分(fēn)析團隊有(yǒu)♦•♦✘很(hěn)多(duō)合作(zuò),我們不(bù)斷向他(tā)勾₹♦畫(huà)Pinot的(de)未來(lái)$δ"€,可(kě)以支持OLAP查詢,最終才得(de)₩♠到(dào)4台機(jī)器(qì),包括:16 core,48G,€≈SSD的(de)機(jī)器(qì),于是(shì)我們開✘β​(kāi)始嘗試。

圖2  Pinot能(néng)夠滿足的(de)技(jì±→)術(shù)場(chǎng)景

圖3  Pinot的(de)Architecture

圖4  Pinot用(yòng)到(dào)的≈ (de)index,包括實現(xiàn)前面提到(dào)得¥‌'(de)到(dào)多(duō)值filter

很(hěn)興奮地(dì)裝載了(le)1€π∞天1B的(de)數(shù)據,跑了(le)些(xiē☆≠δ≈)query後,查Log,發現(xiàn)掃描的(de)數÷&>λ(shù)據越多(duō),query就(jiù)越容易斷線,第♠‌一(yī)個(gè)結論就(jiù)是(shì)小(xiǎo)qu£☆ery多(duō)次發送沒有(yǒu)問(w ₽®εèn)題,Concurrent很(hěn∏± )好(hǎo),小(xiǎo)任務,小(xiǎo)步快•​≈(kuài)跑沒有(yǒu)問(wèn)題,步子(zǐ)邁↕ 太大(dà)慢(màn)跑就(jiù)不(bù)行(xíng),将timeo<•≠ut設置得(de)很(hěn)大(dà)也(yě)是(shì)這(zhè♣§∏₩)個(gè)問(wèn)題。最終我們決定,前端先将大✔×∏≤(dà)的(de)query根據每次可(kě)以掃描的(de♥÷")數(shù)據量将query拆成多(duōε↓)個(gè)query,然後控制(zhì)并發度,保"±π證query能(néng)夠在10秒(miǎo)內(nèi)•&↕返回結果。這(zhè)樣的(de)結果符合我的(de)預期。如(rú)♠‌果放(fàng)在Hadoop裡(lǐ)面‍♦跑,我要(yào)等很(hěn)久才有(₽∏β↕yǒu)結果。

後台完成之後,我給産品經理(lǐ)和(hé)分(fēn)析師(shī)迅速搭建ββΩ$起網頁端界面,允許任意篩選和(hé)整合數(shù)據,保證新的(de)數(sσ≠ hù)據從(cóng)Hadoop到(dào)Pinot的(de)導入。而λΩγπ在用(yòng)戶看(kàn)來(lái),是(shì)質的(de)飛(fπ≈∑'ēi)躍:從(cóng)前要(yào)等一(yī)天才能(néng)看(kε™&àn)到(dào)結果,現(xiàn)在10幾秒(miǎo)鐘(zhōngδγ)就(jiù)解決了(le)。這(zhè)使我們的(dσε★e)分(fēn)析師(shī)可(kě)以在短(duǎn₹λ)時(shí)間(jiān)內(nèi),對(duì)産品表現(σφxiàn)做(zuò)出判斷。

緊接著(zhe)我們要(yào)求加了(le)兩個(gè)特性•¶:支持count unique user和(hé)filter ♣✔≠₽on tuple。剛開(kāi)始的(de)時(shí)候,我在準備€'•♦avro format數(shù)據的(de)時(shí)候β≈≤,就(jiù)将user分(fēn)别存在不(bù'σ£α)同的(de)segment文(wén)件(jiàn)✘±裡(lǐ)面,而且要(yào)保證每次生(shēn  g)成的(de)segment文(wén)件(jiàn)裡(lǐ)面都(dōγ↑>λu)是(shì)consistent存放(fàng)相(xi₩"©®àng)同的(de)KEY區(qū)間(jπ©iān)。這(zhè)樣就(jiù)能(néng)将count¥↔ unique變成count很(hěn)多(duō)©€小(xiǎo)query,然後做(zuò)tota∞Ωl merge的(de)簡單方法。其實還(hái)是(shì)c×δ§✔ount運算(suàn),隻是(shì)保證每個(ε☆gè)segment文(wén)件(jiàn)沒有(yǒu)重複的&‌∑<(de)KEY。後來(lái)Pinot團隊增加hyper logl← og的(de)功能(néng)。Filter o✔•α≥n multiple value也(yě)是(shì)一(yī)個(gè)β₽₹<很(hěn)好(hǎo)的(de)特性,Link£₽→edIn每個(gè)用(yòng)戶都(dōu)有( ♠↑$yǒu)不(bù)同的(de)技(jì)能(néng),而且每個↑↓>(gè)user的(de)技(jì)能(néng)長(cháng)←&度都(dōu)不(bù)一(yī)樣。而搜索變得(de)↑σ®十分(fēn)簡單:例如(rú)我們想要(yào)←&尋找有(yǒu)Java或Scala技(jì)能(néng)的£≥↔(de)人(rén),隻需要(yào)寫skills in☆§₩ (Java或Scala)就(jiù)可(kě)以得(d₹‍e)到(dào)了(le),而背後實現(xiàn)全靠bitm ε'ap index。

那(nà)時(shí)候隻有(yǒu)3個(gè)人(rén)的(de)↑σ₹←Pinot團隊做(zuò)出這(zhè)樣優秀的(de)産品,十分(fēn∞$)了(le)不(bù)起。之後我們團隊和(hé)Pin£ ot團隊開(kāi)展了(le)很(hěn)多(duō♠©)更深入的(de)聯合開(kāi)發,也(yě)與Pinot的(de‌®)主程Praveen建立了(le)非常好(hǎo)的(de) β>'關系。