這是我參與創(chuàng)作者計(jì)劃的第1篇文章
?
我叫艾佳,工作經(jīng)驗(yàn)14年,編程經(jīng)驗(yàn)30年。
我來自智能平臺(tái)部,負(fù)責(zé)標(biāo)簽平臺(tái)、標(biāo)簽圈人、標(biāo)簽選品、EasyData、算法數(shù)據(jù)流的架構(gòu)工作。
致力于批量計(jì)算、流式計(jì)算、交互式計(jì)算的通用化數(shù)據(jù)應(yīng)用構(gòu)建,降低大數(shù)據(jù)計(jì)算的使用門檻。
在此,我跟大家分享一下我的個(gè)人經(jīng)歷和一些思考。
?
好玩兒
成長(zhǎng)經(jīng)歷,說來話長(zhǎng),有多長(zhǎng)呢?
上世紀(jì)80年代末,我參與了計(jì)算機(jī)輸入指令的歸一化:把穿孔紙帶卷起來,當(dāng)然也包括把它們搞亂。
那一年我6歲。
上世紀(jì)90年代初,我計(jì)劃購(gòu)入一臺(tái)自己的計(jì)算機(jī)。
NES擁有8位處理器,很流行;不過我沒有買它,倒不是因?yàn)槿毡具M(jìn)口比較貴,而是因?yàn)樗饕瞄L(zhǎng)圖形處理,機(jī)身紅白相間,大人們都管它叫“游戲機(jī)”,預(yù)算審批不通過。
最終我申請(qǐng)購(gòu)入一臺(tái)Subor計(jì)算機(jī),同樣是8位處理器,可以學(xué)習(xí)打字,可以編程,中文品牌名叫小霸王,它當(dāng)然不能是“游戲機(jī)”,它叫“學(xué)習(xí)機(jī)”,所以預(yù)算審批通過。
1994年,我用上述“升級(jí)版游戲機(jī)”寫下了人生第一段代碼,語言是BASIC,語句前面需要手寫行號(hào)。
當(dāng)時(shí)我上小學(xué)。
高中的時(shí)候,語文老師在上面講課,我在下面看雜志:《微型計(jì)算機(jī)》,借同學(xué)的,他那一年12期我都看過。
后來同學(xué)攢動(dòng)我和她組隊(duì)參加網(wǎng)頁(yè)設(shè)計(jì)大賽,她可以借我相關(guān)書籍。
1998年,我在學(xué)校機(jī)房設(shè)計(jì)了人生第一個(gè)網(wǎng)頁(yè),使用 Dreamweaver + Fireworks + Flash。
大學(xué)的時(shí)候,我并沒有學(xué)計(jì)算機(jī),主要是報(bào)志愿的時(shí)候,爸媽認(rèn)為計(jì)算機(jī)畢業(yè)就是修電腦。
入學(xué)之后,我加入學(xué)生會(huì)科技部,協(xié)助搭建學(xué)院網(wǎng)站。
英語課的時(shí)候,我在下面看PHP書籍;我還用自己的電腦練習(xí)安裝紅帽Linux和MySQL。
2002年,我給學(xué)院搭建的網(wǎng)站面向公網(wǎng)開放。
研究生的時(shí)候,我難逃宿命,進(jìn)入軟件學(xué)院學(xué)習(xí);某公司招聘實(shí)習(xí)生,現(xiàn)場(chǎng)面試,我和另一個(gè)女生一起去PK。
面試官問:“請(qǐng)說說你對(duì)JavaScript的理解?“
那個(gè)女生搶先回答”我平時(shí)會(huì)寫一些Java程序?!?/p>
面試官一皺眉,看看我。
我把前一天晚上刷完的Ajax理論洋洋灑灑一說,搞定了。
2008年,我們寫了一個(gè)3萬行代碼的JavaScript文件,在客戶的機(jī)器上運(yùn)行,那時(shí)JS還沒有模塊化機(jī)制。
2010年,我用C++實(shí)時(shí)求解偏微分方程組,完成了即時(shí)動(dòng)力學(xué)仿真,最終得以畢業(yè)。
那時(shí)C++的下一代ISO標(biāo)準(zhǔn)叫 C++ 0x,誰知道最終2011年才搞定,最終定名 C++ 11。
?
成為你自己
武志紅在他的心理學(xué)課中提到:人生的意義,在于成為你自己。
?
真正的架構(gòu)師
工作三年后,我出差上海,我們?yōu)槿毡咀畲蟮你y行交付解決方案。
當(dāng)時(shí),客戶的交易系統(tǒng),還是上個(gè)世紀(jì)的基于命令行的設(shè)計(jì)風(fēng)格。
我們本次的任務(wù)就是將其升級(jí)為本世紀(jì)的基于網(wǎng)頁(yè)的設(shè)計(jì)風(fēng)格。
銀行方面也有好多關(guān)聯(lián)公司,為其交付存款、貸款、信用證、保理等等業(yè)務(wù)模塊,我們公司的職責(zé)就是開發(fā)一個(gè)框架,讓各個(gè)業(yè)務(wù)模塊可插拔的加載到框架中,這就要求整個(gè)框架不能為某一個(gè)單一業(yè)務(wù)編寫定制化的邏輯,要做到業(yè)務(wù)無關(guān),這樣才能適用于各個(gè)業(yè)務(wù)模塊。
框架的架構(gòu)設(shè)計(jì),形成了好多架構(gòu)決策,負(fù)責(zé)業(yè)務(wù)模塊的關(guān)聯(lián)公司經(jīng)常來挑戰(zhàn)這些架構(gòu)決策。
我做為助理架構(gòu)師,需要解答他們的疑問;最開始,我能唯一能做的,就是跟他們解釋,這是主架構(gòu)師定的,我也不知道他為何這樣定;到后來,我覺得這樣很丟臉,我只是一個(gè)傳聲筒,我的存在并沒有價(jià)值。
后來,對(duì)于主架構(gòu)師的每一個(gè)決定,我都會(huì)首先自己獨(dú)立思考,為什么用這種方案而不是另外一種方案。我自己挑戰(zhàn)自己,自己得出一個(gè)邏輯嚴(yán)謹(jǐn)?shù)耐评磉^程,并把疑問點(diǎn)記錄下來。最后,我會(huì)拿著我的邏輯找主架構(gòu)師求證,并提出一些疑問。終于有一天,我可以根據(jù)我的思考,獨(dú)立回答關(guān)聯(lián)公司提出的疑問,應(yīng)對(duì)他們的挑戰(zhàn)。
項(xiàng)目慶功會(huì),觥籌交錯(cuò),我給主架構(gòu)師敬酒。
他說,小伙子不錯(cuò),你是第一個(gè)挑戰(zhàn)我的人。
那一刻,我覺得,我開始做我自己了。
那一刻,我覺得,我開始做真正的架構(gòu)師。
業(yè)務(wù)無關(guān)
后來我出差昆明,為某能源公司交付解決方案。
這種企業(yè)服務(wù)的特點(diǎn)就是,客戶是真金白銀買你的解決方案,但是他要滿意了才付錢。客戶付錢了項(xiàng)目才有收入,不付錢項(xiàng)目收入就是零。然后公司會(huì)對(duì)每一個(gè)項(xiàng)目的收入和支出進(jìn)行核算,人力成本會(huì)精確計(jì)量。成本大于收入,那這個(gè)項(xiàng)目就是賠錢的,這個(gè)項(xiàng)目就是失敗的。
很快,我們組建了項(xiàng)目組,湊齊了項(xiàng)目經(jīng)理、產(chǎn)品經(jīng)理、架構(gòu)師、主研發(fā)、主測(cè)試,分別是我我我我我,沒錯(cuò),都是我,就是我,就我一人兒。項(xiàng)目失敗了是我的問題,產(chǎn)品設(shè)計(jì)讓客戶不滿意是我的問題;技術(shù)無法落地是我的問題,技術(shù)落地了有很多缺陷還是我的問題。
昆明招人真是太難了,真是太難了,太難了。我費(fèi)了九牛二虎之力,招來了兩個(gè)小哥和我一起寫代碼,其中一個(gè)小哥是彝族的,代碼寫的還行,不過彝族左腳調(diào)跳的更帶勁。無論從預(yù)算還是人力角度,這個(gè)項(xiàng)目的資源就是嚴(yán)重受限的??蛻舻男枨?,是要接入多個(gè)風(fēng)格迥異的業(yè)務(wù)系統(tǒng),如果每個(gè)系統(tǒng)接入都定制化開發(fā),那工時(shí)會(huì)很多,成本會(huì)爆倉(cāng),項(xiàng)目會(huì)失敗。所以,我就琢磨,如何將架構(gòu)設(shè)計(jì)成業(yè)務(wù)無關(guān)的,也就是通用的一套架構(gòu),跟各個(gè)接入方約定好統(tǒng)一的接入方式,通過配置化,來彌合業(yè)務(wù)之前的差異。
2014年,給客戶開發(fā)的系統(tǒng)上線了,是我獨(dú)立設(shè)計(jì)的,基于配置化的系統(tǒng)。
后來,由于業(yè)務(wù)無關(guān),快速接入,此能源公司的多個(gè)分公司,包括總部,都看好了這套系統(tǒng)。各分公司陸續(xù)接入,人力自然無需增加,收入?yún)s在持續(xù)增長(zhǎng),項(xiàng)目的財(cái)務(wù)數(shù)字很漂亮。
?
尚未踏入的世界
法國(guó)作家普魯斯特,在他的代表作里寫到:
唯一真實(shí)的樂園是我們已經(jīng)失去的樂園,唯一有吸引力的世界是我們尚未踏入的世界。
?
大數(shù)據(jù)入其門
孩子大了,我也不能一直各地出差,到處跑;經(jīng)過努力,我最終回到了北京,做北京的項(xiàng)目。
我們的任務(wù)是給一個(gè)大企業(yè)搭建員工報(bào)銷系統(tǒng),用戶數(shù)量30萬,每人可能不只一張報(bào)銷單,那么評(píng)估下來,單表的記錄數(shù)可能超過百萬。當(dāng)時(shí)的MySQL版本比較低,單表容量超過百萬之后性能急劇下降,所以我們需要調(diào)研各種分庫(kù)分表方案。當(dāng)時(shí)的分庫(kù)分表方案,和SSH這種通用的ORM框架不是很兼容,很多場(chǎng)景需要我們定制化的手寫SQL來達(dá)到業(yè)務(wù)目的。
一期上線,解決了業(yè)務(wù)的問題;后面,客戶又提出了報(bào)表的需求,那么SQL當(dāng)中不可避免的要有 sum 或者 count 這些聚合的操作,分表的話,自己需要處理各個(gè)分片之間的聚合關(guān)系,挑戰(zhàn)也很大。
其實(shí)問題的本質(zhì)就是,如果將數(shù)據(jù)分割,分別計(jì)算,再合并,還是分治的思想。
我隱約覺得,需要學(xué)習(xí)一些大數(shù)據(jù)技術(shù)了,于是我在滿足業(yè)務(wù)需求之余,廢寢忘食地刷英文原版書籍,Hadoop、Spark、HBase、Storm…… 還在自己的個(gè)人電腦上搭建環(huán)境來練手。整體感受是,大數(shù)據(jù)技術(shù)是個(gè)好東西,它可以代替你對(duì)數(shù)據(jù)進(jìn)行分割、分別計(jì)算、再合并;自己就不用通過分表等方式手工分割,也不用操心計(jì)算結(jié)果合并的問題了。
我按照大數(shù)據(jù)技術(shù)的思路提出報(bào)表系統(tǒng)的未來規(guī)劃,向客戶兜售。
客戶的反饋很實(shí)在,也可以理解:“我們國(guó)企不需要什么先進(jìn)的技術(shù),我們需要求穩(wěn);此外,你們項(xiàng)目上線后是要交給我們的人維護(hù)的,我不相信我們的人能維護(hù)好?!?/p>
我突然驚醒了,可能這就是我接下來職業(yè)生涯的狀態(tài):不需要什么先進(jìn)技術(shù),求穩(wěn)。
2015年,我離開了這家世界知名外企,去了一家初創(chuàng)公司,因?yàn)樗麄冃枰髷?shù)據(jù)技術(shù)。
云計(jì)算是被迫的
初創(chuàng)公司落定,手里握著10億獨(dú)立的手機(jī)MAC地址,而且有這10億個(gè)體的標(biāo)簽和畫像,保存在HBase中。HBase是個(gè)好東西,不需要關(guān)心分庫(kù)分表的問題,而且數(shù)據(jù)在各個(gè)分片上重新均衡,也無需用戶接入。馬上,新的挑戰(zhàn)就來了,數(shù)據(jù)還在持續(xù)增長(zhǎng),預(yù)計(jì)到年底將會(huì)增長(zhǎng)到20億,存儲(chǔ)急需擴(kuò)容。公司的HBase,是運(yùn)維同學(xué)在裸機(jī)上手工安裝的。我說,能不能看看現(xiàn)在機(jī)器的情況,然后運(yùn)維同學(xué)給了我一把鑰匙。
等等,一把鑰匙?
他說對(duì),咱們辦公區(qū)你往那邊走,小倉(cāng)房隔壁有個(gè)防盜門,你不是問機(jī)器情況么,那里面就是。
打開防盜門,屋子很小,只有兩個(gè)機(jī)柜,其中只有一個(gè)機(jī)柜上面有機(jī)器,刀片機(jī)的指示燈交替閃爍;由于網(wǎng)絡(luò)組件經(jīng)常有故障,所以不能穩(wěn)定的遠(yuǎn)程SSH,所以接下來我要經(jīng)常來這個(gè)小黑屋。
我給內(nèi)存條拍了照,按照它上面的精確的型號(hào),在京東上買內(nèi)存條;到貨之后,二十多根嶄新的實(shí)物內(nèi)存條攥在手里,現(xiàn)在想想還真有點(diǎn)兒賽博朋克呢。
借助京東商城,我們擴(kuò)容完成,手機(jī)MAC數(shù)據(jù)也的確增長(zhǎng)到了20億,存儲(chǔ)搞定了。
別急,新的挑戰(zhàn)來了,現(xiàn)狀是用 Java Worker 定時(shí)計(jì)算讀寫 HBase,隨著數(shù)據(jù)量增長(zhǎng),上游一天產(chǎn)生的數(shù)據(jù),我們可能一天都算不完。是時(shí)候展示真正的技術(shù)了,我手里攥著的Spark技術(shù)終于可以登上舞臺(tái)了。通過使用 Spark 代替 Java Worker,我們使計(jì)算周期減半,并且可以更方便的解決擴(kuò)縮容和數(shù)據(jù)傾斜問題;“一天的數(shù)一天算不完“ 的危機(jī)終于得到了化解。
2016年,我們實(shí)現(xiàn)了 Spark 直接讀取 OSS 上的parquet文件進(jìn)行計(jì)算,很像現(xiàn)在的數(shù)據(jù)湖的思想。
別停,挑戰(zhàn)繼續(xù)。我們手工在物理機(jī)上維護(hù) Hadoop、HDFS、HBase、Spark 等等組件,今天這臺(tái)機(jī)器出問題,明天那個(gè)軟件有問題,這大數(shù)據(jù)的可用時(shí)間也不長(zhǎng)啊。團(tuán)隊(duì)一共不到十個(gè)人,每天解決大數(shù)據(jù)運(yùn)維的問題,根本抽不出來時(shí)間做業(yè)務(wù)需求了。
老板說,我有一張阿里云打折卡,你們要用么?
要用,要用,你咋不早說。
經(jīng)過精確測(cè)算,量化存儲(chǔ)計(jì)算成本和人力成本,上云后的成本更低,我們說服了高層全面轉(zhuǎn)向云計(jì)算戰(zhàn)略,這次我們就不用擔(dān)心運(yùn)維的問題了,以更低的成本將這一部分工作外包了出去,我們可以專注做業(yè)務(wù)需求了。
長(zhǎng)夜無夢(mèng)。
當(dāng)時(shí)《程序員》雜志還未???,那我是每期必讀啊??粗ヂ?lián)網(wǎng)的大佬們,針對(duì)如何應(yīng)對(duì)雙11和618的大促,侃侃而談,流量動(dòng)不動(dòng)就是幾百萬幾千萬,如何壓測(cè)的,如何限流的,可真是。那感覺就像聽加勒比海盜講述,他們手里緊攥著藏寶圖,駕船穿過兇險(xiǎn)的激流,攫取心目中的寶藏。
“佳哥你這大數(shù)據(jù)架構(gòu)師不是做的挺好的么,為啥要走?。吭僬f了,你的期權(quán)還未兌現(xiàn),走了可就都打水漂了?!?HR小姐姐在微信上問我。
“許巍的《完美生活》送給你:青春的歲月,我們身不由已;只因那胸中,燃燒著夢(mèng)想?!?/p>
青春的歲月我們身不由己
?
整個(gè)人都精神多了
如愿加入了A記互聯(lián)網(wǎng)公司,剛開始用釘釘還不太習(xí)慣,我老板釘釘?shù)膫€(gè)人簽名上寫著:“得了精神病,整個(gè)人都精神多了“,我想這個(gè)老板可真是……深不可測(cè)啊。
2017年加入公司時(shí),有一個(gè)金融風(fēng)控引擎,底層使用MapReduce來完成計(jì)算的。如何描述計(jì)算步驟呢,每一個(gè)計(jì)算任務(wù)都會(huì)對(duì)應(yīng)一個(gè)超級(jí)長(zhǎng)的XML,來描述都從哪兒讀取數(shù)據(jù),中間如何過濾和變換,最終又寫到哪兒。針對(duì)單條數(shù)據(jù),這個(gè)引擎工作的很出色,尤其是大量的分支判斷可以很好的表達(dá),但是當(dāng)涉及到大量表關(guān)聯(lián),大量聚合的時(shí)候,編寫多個(gè)Mapper和Reducer串聯(lián)就很費(fèi)事兒了。
這都什么時(shí)代了,為什么不用Spark做呢?說干就干,我自己將離線引擎使用Spark重寫。為了能夠適應(yīng)業(yè)務(wù)場(chǎng)景,我訪談重要的業(yè)務(wù)方,將多種多樣的真實(shí)需求通過新引擎模擬運(yùn)行。至此,金融風(fēng)控引擎的計(jì)算周期大幅縮短。
接下來要搞定的就是實(shí)時(shí)計(jì)算部分,當(dāng)時(shí)的狀態(tài)是,實(shí)時(shí)計(jì)算,即使是分析型的預(yù)計(jì)算,也是Java Worker 來實(shí)現(xiàn)的,每個(gè)業(yè)務(wù)定制一個(gè)Java應(yīng)用。與此同時(shí),大部門又是偏向銀行業(yè)務(wù)的部門,要求核心人員考取銀行執(zhí)業(yè)證,對(duì)新技術(shù)并不是很重視。
當(dāng)我拿著我的基于Flink的實(shí)時(shí)計(jì)算方案,給老板講解新的風(fēng)控引擎的時(shí)候,
老板問我:“Flink 是什么?“
我說:“后會(huì)有期?!?/p>
2020年,獨(dú)角獸傳出上市消息的前夕,我懷揣著大數(shù)據(jù)的夢(mèng),毅然離開了A記。
朋友說:“你是不是神經(jīng)了,財(cái)富自由的機(jī)會(huì)你不要了?“
我說:“是神經(jīng)了,感覺整個(gè)人都精神多了。“
?
大促像過年
入職京東的第一天。
我問HR,開車來的話,停哪兒呢?
她說,公司的地面停車場(chǎng)在施工圍擋里面。
雖然車位也不少,但是如果你來的比較晚的話,也沒有位置,只能停到更遠(yuǎn)的4號(hào)樓。
我早上開車上班,到這兒一看,嚯,還真是,排隊(duì)進(jìn)場(chǎng),提前一個(gè)路口就開始排了。
這難道是排隊(duì)領(lǐng)飯票呢?現(xiàn)在想想,還真是。
入職的是數(shù)倉(cāng)團(tuán)隊(duì),他們最頭疼的就是,業(yè)務(wù)方不僅要算數(shù),還要用數(shù),需要各種API來訪問。數(shù)倉(cāng)的數(shù)據(jù)加工,我們團(tuán)隊(duì)倒是不在話下,就是API開發(fā)可是很讓人苦惱,因?yàn)樵跀?shù)據(jù)開發(fā)工程師里面非得挑幾個(gè)Java開發(fā)工程師也不容易。就這么幾個(gè)人,還得為每個(gè)業(yè)務(wù)定制化開發(fā)接口。我們能不能開發(fā)一個(gè)通用的平臺(tái),一勞永逸呢?翻看了業(yè)界各家的方案,包括A記的,都不是我想要的;我屏住呼吸,閉目冥想,做成什么樣兒才是心目中的理想方案呢?對(duì),就做成那種一貼SQL,就得到API的極簡(jiǎn)方案,把其他所有復(fù)雜的過程都砍掉。
入職以來經(jīng)常停的那個(gè)地面停車場(chǎng),不能用了,因?yàn)楣疽w樓。我在凱恩帝5層,看著路對(duì)面的停車場(chǎng)舊址上,領(lǐng)導(dǎo)們放炮、剪彩、培土、奠基,后面挖掘機(jī)就開始挖坑了??油诘拇蟠蟮?,有五層樓那么深。人行道旁有綠色的圍擋,從凱恩帝到1號(hào)樓就得沿著圍擋和馬路之間的窄路慢慢走。
這一天,我和往常一樣,沿著窄路慢慢走;這一天又不一樣,此時(shí)不是早高峰,也不是晚高峰,但是總部附近車水馬龍,川流不息,擠擠挨挨;有小推車推著食物的,有布置張燈結(jié)彩的,有拍照打卡的,那場(chǎng)面,感覺就像過年。
我撥開人群,擠入轉(zhuǎn)門,穿過白色大理石地面的大堂,朝一間特別的房間走去。越走人越少,最后來到一道磨砂玻璃門前。刷卡之后,兩扇長(zhǎng)方形玻璃門向兩側(cè)徐徐打開。我走入房間,房間很大,但是燈還沒開。房間的一整面墻是一整塊大屏幕。屏幕上的數(shù)字,靜靜地跳動(dòng),一直跳動(dòng)。燈開了,其他人來了,它仍然在跳動(dòng),一直跳動(dòng)到午夜。
2021年,618,京東成交額幾千億。
各個(gè)媒體的戰(zhàn)報(bào)報(bào)道,都從這塊大屏發(fā)出。
這里面有數(shù)倉(cāng)團(tuán)隊(duì)的辛勤付出,有大屏團(tuán)隊(duì)的夜以繼日,當(dāng)然也有EasyData工具的一份貢獻(xiàn)。這個(gè)工具,就是前面提到的那個(gè) “一貼SQL,就得API“ 的工具。大家用它貼了幾百個(gè)SQL,得到了幾百個(gè)API。
?
整體論與還原論
還是在凱恩帝,這一日是工作日,午后時(shí)光,保潔阿姨跟我說,這一層就我一個(gè)人。
索性,來到落地窗邊,盤腿坐在地毯上;幾張紙,一支筆,讓陽(yáng)光灑在紙上。
如何能把數(shù)據(jù)流做好呢?如何能讓做出來的工具有人用呢?我們做出的工具一定是用來提升效率,要么是運(yùn)行效率,要么是開發(fā)效率;運(yùn)行效率的事兒,Apache的那幫人已經(jīng)玩兒的透透的了,我們能做的可能是要提升設(shè)計(jì)開發(fā)效率,也就是“設(shè)計(jì)時(shí)“平臺(tái),而不是”運(yùn)行時(shí)“平臺(tái)。
我在紙上寫寫畫畫,推演設(shè)計(jì)目標(biāo),陽(yáng)光在方形玻璃器皿內(nèi)折返多次,那是一杯咖啡色的咖啡。
對(duì)面的3號(hào)樓,地基打好了,坑填上了,超過了地面,拔地而起。
大數(shù)據(jù)調(diào)度已經(jīng)有了“任務(wù)流“,我們?yōu)槭裁催€要做”數(shù)據(jù)流“呢?把工作流重做一遍,比比誰做的好嗎?”任務(wù)流“ 是指令的流轉(zhuǎn),一個(gè)任務(wù)節(jié)點(diǎn)完成了,告訴另一個(gè)任務(wù)節(jié)點(diǎn)應(yīng)該開始了,節(jié)點(diǎn)之間并不進(jìn)行數(shù)據(jù)交換。而 ”數(shù)據(jù)流“,是希望整個(gè)分布式數(shù)據(jù)集在節(jié)點(diǎn)之間流動(dòng),而不僅僅是控制指令。
最近運(yùn)氣不錯(cuò),我家的疫情等級(jí)一直很低,所以我是這一層唯一可以入場(chǎng)的人,包場(chǎng)辦公。
把數(shù)據(jù)集當(dāng)成整體看待,在日本作者寫的《SQL進(jìn)階教程》中,把這種思考方式歸為“整體論“,數(shù)據(jù)集是一個(gè)整體,可以計(jì)數(shù)、求和、交并差;所有面向SQL的數(shù)據(jù)技術(shù),都是把數(shù)據(jù)當(dāng)成一個(gè)整體看待,例如JDBC標(biāo)準(zhǔn)里,規(guī)定了 ResultSet;再比如 Spark 里面有 DataSet,都是把數(shù)據(jù)當(dāng)成整體集合看待。甚至,當(dāng)數(shù)據(jù)大到無法放到一臺(tái)計(jì)算機(jī)中時(shí),Spark等大數(shù)據(jù)技術(shù)做出了巨大的努力,在物理層面來管理數(shù)據(jù)在各個(gè)節(jié)點(diǎn)上的分布。為的是,從邏輯層面來看,數(shù)據(jù)還是一個(gè)整體,還是一個(gè)數(shù)據(jù)集。以上這是”整體論“。
跟“整體論“的思考方式相對(duì)的,是”還原論“,認(rèn)為把每一個(gè)個(gè)體處理好,整體也就搞定了,可以還原出整體。在”大數(shù)據(jù)“概念出現(xiàn)之前,好多場(chǎng)景的數(shù)據(jù)是可以放到單臺(tái)機(jī)器里的,不行就上小型機(jī),再不行上大型機(jī),反正我要一臺(tái)機(jī)器搞定。原來的好多業(yè)務(wù)處理邏輯,例如對(duì)在線交易的處理,都是面向請(qǐng)求的,一個(gè)客戶(Client)發(fā)出了請(qǐng)求(Request),我們?nèi)绾畏?wù)好他(Server),然后給他及時(shí)的響應(yīng)(Response)。進(jìn)而,后來的Web應(yīng)用,無論什么語言編寫的,也都是假設(shè)如何處理好一個(gè)請(qǐng)求。當(dāng)然,請(qǐng)求除了 HTTP 請(qǐng)求,還有消息等形式,為了應(yīng)對(duì)這些請(qǐng)求,編寫各種 Handler / Worker。以上這是 ”還原論“。
本次要設(shè)計(jì)的數(shù)據(jù)流,流入流出的都應(yīng)該是一個(gè)數(shù)據(jù)集,秉承“整體論“的思想。整個(gè)數(shù)據(jù)集在DAG圖上流動(dòng),可以聚合,可以關(guān)聯(lián)。
對(duì)了,這不就是 Spark/Flink 做的事兒么;但現(xiàn)在問題是,這些技術(shù)還是有一定的技術(shù)門檻的,我們?nèi)绾巫屗惴üこ處煛④浖_發(fā)工程師甚至產(chǎn)品經(jīng)理都投入到大數(shù)據(jù)的革命洪流中來呢?必須進(jìn)一步降低門檻。如果在“設(shè)計(jì)時(shí)“,也就是計(jì)算任務(wù)上線之前,在開發(fā)的時(shí)候就看到數(shù)據(jù)流轉(zhuǎn)的圖形就好了。進(jìn)而,這個(gè)圖形不只是用來看的,還可以編輯,可以拖拉拽,拖一個(gè)輸入算子,幾個(gè)處理算子,幾個(gè)輸出算子,數(shù)據(jù)加工的邏輯就搞定了。編輯好的圖形直接發(fā)布線上就能運(yùn)行,不用寫代碼,不用知道什么是Spark,那可太棒了。
2022年,“算法數(shù)據(jù)流“ 上線到dp.jd.com,用戶自己累計(jì)編寫了數(shù)據(jù)流4000多個(gè),目前周增長(zhǎng)2.4%
批量計(jì)算示例
流式計(jì)算示例
百億貨大樓
3號(hào)樓封頂了,京東總部現(xiàn)在有1/2/3/4號(hào)這么多樓。
上個(gè)世紀(jì),中國(guó)出現(xiàn)的百貨大樓,雖然貨品不只幾百種,但也不會(huì)特別多。
京東的樓,我想叫他百億貨大樓。
這個(gè)量級(jí)的貨,我們?nèi)娇偛棵??不可能。他們分布在全?guó)不計(jì)其數(shù)的倉(cāng)庫(kù)中,甚至還只是躺在設(shè)計(jì)師的圖紙上,就等有人點(diǎn)擊那個(gè)購(gòu)買按鈕,從紙上再跳下來。
這么多貨,組織一個(gè)618活動(dòng)啥的,讓誰上場(chǎng)呢?幾百億記錄一頁(yè)一頁(yè)的瀏覽,最后都瀏覽成骨灰級(jí)玩家了,肯定不行。那就需要遴選出一批貨品,參與某一個(gè)活動(dòng)。怎么選呢?從不同角度給各個(gè)商品打上標(biāo)簽,例如有些是新品,有些是露營(yíng)場(chǎng)景,有些是應(yīng)季商品。然后再通過選擇不同的標(biāo)簽組合,進(jìn)而遴選出不同的商品,來去契合本次活動(dòng)的主題。
那你說這個(gè)事兒離線計(jì)算能不能做?可以做,Hive / Spark 寫SQL跑數(shù)就完了。但是這種方式,用戶不能“在線等“,系統(tǒng)只能告訴用戶:”您別著急,我得算一會(huì)兒,您先忙著,我好了告訴你“。用戶說那不行啊,我選了標(biāo)簽ABC,計(jì)算結(jié)果不滿意的話,我還要換成標(biāo)簽BCD再試,我要再試,反復(fù)試,一直試,一直到我滿意的哇。所以”離線“還不行,還得滿足用戶”在線等“,進(jìn)而,用戶反復(fù)改變輸入,反復(fù)觀察機(jī)器的輸出,這樣就跟機(jī)器形成了一個(gè)互動(dòng),這種計(jì)算模式也就稱之為”交互式計(jì)算“。
交互式計(jì)算,最典型的就是使用OLAP技術(shù),在線分析處理,使用 ClickHouse 或者 Doris 等數(shù)據(jù)技術(shù),把篩選需要用到的各種標(biāo)簽,都放到一張表里,跑SQL。隨著標(biāo)簽越來越多,那這張表的列也會(huì)越來越多,這張表就會(huì)越來越寬,同時(shí),計(jì)算周期也會(huì)越來越長(zhǎng),長(zhǎng)到用戶無法接受。
怎么辦呢?
得拆表,每個(gè)表不要有那么多列。
按照什么粒度拆呢?
按照業(yè)務(wù)場(chǎng)景拆。
拆出來的小寬表叫底池,每一個(gè)底池對(duì)應(yīng)一個(gè)業(yè)務(wù)場(chǎng)景,例如打新的場(chǎng)景,例如招商的場(chǎng)景。那每一個(gè)場(chǎng)景里面,都會(huì)用到哪些標(biāo)簽選品,業(yè)務(wù)、產(chǎn)品、研發(fā)是有共識(shí)的,是有相對(duì)確定的,標(biāo)簽數(shù)量可以限制在一個(gè)合理的范圍內(nèi)?!暗壮亍斑@個(gè)概念,是做選品的先賢們想出來的,我覺得很好。
3號(hào)樓最終交付使用,正式命名為1號(hào)樓DEF座。
夜幕降臨,華燈初上。
樓體外部流動(dòng)的燈火,是能量流。
樓體內(nèi)部流動(dòng)的數(shù)據(jù),是信息流。
中華大地上奔跑的貨車,是物質(zhì)流。
熠熠之輝,煌煌之炬。
?
昨天今天明天
總結(jié)昨天。
活在今天。
展望明天。
?
建筑設(shè)計(jì)師
軟件架構(gòu)師,Architect,實(shí)際和建筑設(shè)計(jì)師,是一個(gè)英文單詞。
你說建筑設(shè)計(jì)師會(huì)不會(huì)搬磚?他肯定會(huì)。
那你說我會(huì)搬磚,我磚搬的好,磚搬的快,我會(huì)不會(huì)成為建筑設(shè)計(jì)師?那不一定。
建筑設(shè)計(jì)師會(huì)告訴你,建筑的骨架是什么樣的,如何受力的;哪面墻是承重墻,一定不能砸。
當(dāng)然,最基本的土木工程、建筑技術(shù),那建筑設(shè)計(jì)師一定要了如指掌。
其實(shí)軟件架構(gòu)師類似。
最基本的編程技術(shù)、數(shù)據(jù)技術(shù),不僅要精通,還需要靈活應(yīng)用。
除此之外,需要知道系統(tǒng)是如何承壓的,系統(tǒng)的核心鏈路是什么。
開發(fā)之前,需要先進(jìn)行系統(tǒng)設(shè)計(jì),讓系統(tǒng)先在紙面上跑起來,各個(gè)場(chǎng)景都不會(huì)有邏輯漏洞。
設(shè)計(jì)之前,需要先確定設(shè)計(jì)原則,設(shè)計(jì)是基于哪些假設(shè)的,例如系統(tǒng)運(yùn)行的前置條件是什么。
其實(shí)最重要的,就是要獨(dú)立思考,要挑戰(zhàn)自己;多構(gòu)造一些邊緣場(chǎng)景,來驗(yàn)證系統(tǒng)是否可以應(yīng)對(duì)。
形容詞
有一種價(jià)值觀,認(rèn)為事物的價(jià)值可以分為真、善、美。
真,真實(shí),事實(shí)判斷,這一項(xiàng)是機(jī)器擅長(zhǎng)的,不僅可以判斷此時(shí)此地的事實(shí),而且可以同時(shí)判斷多個(gè)空間,多個(gè)時(shí)間的事實(shí)。
那什么是善?什么是美呢?
古人曾以胖為美,今人以瘦為美;愛吃蘿卜的,以蘿卜為美食,愛吃白菜的,以白菜為美食。
“美“、”好貨“、”高級(jí)貨“、”潮牌“,所有這些形容詞,都是主觀的。主觀的意思,就是它們都是人類對(duì)于客觀事物的感受,而且是因人而異的。
機(jī)器可以感受嗎?機(jī)器沒有感受,他不知道什么是善,什么是美。
童話《綠野仙蹤》里的鐵皮人,沒有心,這其實(shí)就是一個(gè)隱喻。
雖然人類做為老師,可以教它,可以教機(jī)器如何學(xué)習(xí)人類的這些感受,如何做一項(xiàng)價(jià)值判斷。但這些感受,這些價(jià)值判斷,也只是為了適應(yīng)人類的感受,人類的價(jià)值判斷,不是機(jī)器自己的。
不知美丑尚可,不知善惡就危險(xiǎn)了。
盡管現(xiàn)在有層出不窮的算法模型,但是各大公司始終會(huì)制定一系列的規(guī)則。
這些規(guī)則是從人的角度發(fā)出的思考,用來監(jiān)視機(jī)器,并對(duì)機(jī)器設(shè)定底線,使它“不作惡”。
卓別林在電影《大獨(dú)裁者》最后,有一段演講,截取送給大家。
Don’t give yourselves to these unnatural men
- machine men with machine minds and machine hearts!
You are not machines! You are not cattle! You are men!
You have the love of humanity in your hearts!
You, the people have the power
- the power to create machines.
The power to create happiness!
You, the people, have the power
to make this life free and beautiful,
to make this life a wonderful adventure.
來
為公司創(chuàng)造價(jià)值,為社會(huì)創(chuàng)造價(jià)值,那是必須的。
最初入行覺得信息技術(shù)很酷;對(duì)層出不窮的新技術(shù),求知若渴。
希望自己不忘初心。
審核編輯 黃宇
-
算法
+關(guān)注
關(guān)注
23文章
4607瀏覽量
92829 -
架構(gòu)師
+關(guān)注
關(guān)注
0文章
47瀏覽量
4620
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論