程夢(mèng)瑤
潤(rùn)乾集算器從醞釀走向商用,花了八年時(shí)間。在這八年間,集算器經(jīng)歷了四次大的重構(gòu)和無(wú)數(shù)次小的改造。要深刻理解用戶的痛點(diǎn)并提出有效解決方案,不流于表面,要做就要做到極致,這正是潤(rùn)乾用多年時(shí)間打造集算器的初衷。
在過(guò)去十多年,潤(rùn)乾(北京潤(rùn)乾信息系統(tǒng)技術(shù)有限公司)一直是國(guó)內(nèi)主流報(bào)表工具廠商?,F(xiàn)任董事長(zhǎng)蔣步星既是公司的創(chuàng)始人,也是公司的核心技術(shù)帶頭人,在他看來(lái),在經(jīng)營(yíng)報(bào)表的過(guò)程中,總能碰到用戶希望協(xié)助開(kāi)發(fā)復(fù)雜報(bào)表,而報(bào)表的復(fù)雜性不僅體現(xiàn)在格式上,更多的是在數(shù)據(jù)方面,數(shù)據(jù)庫(kù)中的數(shù)據(jù)要經(jīng)過(guò)很多步驟的復(fù)雜運(yùn)算才能得到真正想到的數(shù)據(jù),而報(bào)表工具只能解決呈現(xiàn)環(huán)節(jié)那一步的少量計(jì)算,對(duì)于進(jìn)入報(bào)表工具的數(shù)據(jù)計(jì)算則無(wú)能為力。
對(duì)于這個(gè)問(wèn)題,業(yè)界并沒(méi)有什么好辦法。從2007年底開(kāi)始,當(dāng)潤(rùn)乾報(bào)表4.x版本趨于穩(wěn)定之后,蔣步星帶領(lǐng)團(tuán)隊(duì)開(kāi)始著手研究這個(gè)問(wèn)題。從2007年底到2015年后期開(kāi)始進(jìn)入商用階段,這段時(shí)間被蔣步星稱(chēng)做“八年抗戰(zhàn)”,最終,集算器作為獨(dú)立產(chǎn)品經(jīng)營(yíng),全面與報(bào)表工具脫鉤。
計(jì)算本身就是個(gè)業(yè)務(wù)
在技術(shù)上,集算器和報(bào)表工具是相互獨(dú)立的,但集算器也能夠和潤(rùn)乾報(bào)表集成,甚至也能和其他報(bào)表工具集成?!霸谧畛跎虡I(yè)化時(shí),我們還是把它作為報(bào)表工具的一個(gè)附件模塊組裝出來(lái)銷(xiāo)售,而沒(méi)有獨(dú)立經(jīng)營(yíng)。但是,我們很快就發(fā)現(xiàn),計(jì)算本身就是個(gè)業(yè)務(wù),而且是比報(bào)表工具應(yīng)用面更加廣闊的業(yè)務(wù)。”蔣步星說(shuō)。
秉承“讓數(shù)據(jù)計(jì)算變得簡(jiǎn)單、高效”的理念,潤(rùn)乾集算器應(yīng)運(yùn)而生。
通常情況下,人們習(xí)慣于用已經(jīng)熟知的概念來(lái)類(lèi)比一個(gè)新產(chǎn)品,比如電動(dòng)汽車(chē)是用電而不是燒油的汽車(chē)。但是,如果找不到這個(gè)對(duì)標(biāo)概念時(shí),理解新產(chǎn)品就不那么容易了。比如在智能手機(jī)還沒(méi)發(fā)明的時(shí)代,你也很難解釋清楚iPhone是個(gè)什么東西。電話?便攜影音播放器?數(shù)碼相機(jī)?游戲機(jī)?手持工作設(shè)備?都是又都不是,功能太多時(shí)反而說(shuō)不清了。
“集算器類(lèi)似,它能干的事有點(diǎn)多:報(bào)表數(shù)據(jù)源、ETL、大數(shù)據(jù)計(jì)算、文本分析、Excel處理、Java計(jì)算中間件、數(shù)據(jù)網(wǎng)關(guān)……每個(gè)應(yīng)用場(chǎng)景都足夠講半小時(shí),如果正好和用戶的痛點(diǎn)匹配上,大家會(huì)聽(tīng)得津津有味,而如果匹配不上,那就索然無(wú)味。”蔣步星說(shuō)。
那么,集算器到底是什么呢?“有不少朋友和客戶問(wèn)過(guò)我,能不能在一分鐘內(nèi)說(shuō)清楚集算器是什么,仔細(xì)想想,到現(xiàn)在為止,這個(gè)答案還是不能!”即使一下子說(shuō)不清,但還是得說(shuō),蔣步星談到。簡(jiǎn)單講,集算器是用來(lái)做數(shù)據(jù)計(jì)算的技術(shù)產(chǎn)品,主要針對(duì)(半)結(jié)構(gòu)化數(shù)據(jù),它的使用人群是程序員,或者至少是有程序設(shè)計(jì)能力的分析人員,而不是不會(huì)編程的行業(yè)業(yè)務(wù)人員。
從技術(shù)上看,集算器可以從三個(gè)方面去理解:
其一,程序設(shè)計(jì)語(yǔ)言。集算器提供了獨(dú)特的語(yǔ)法體系和數(shù)據(jù)對(duì)象,使編寫(xiě)結(jié)構(gòu)化數(shù)據(jù)計(jì)算更為簡(jiǎn)捷方便,而且在多數(shù)場(chǎng)合能表現(xiàn)出更好的運(yùn)算性能,特別適合復(fù)雜的過(guò)程式運(yùn)算。在這方面的對(duì)標(biāo)技術(shù)大概是SQL、Java和Python。
其二,數(shù)據(jù)計(jì)算引擎。集算器提供了不依賴于數(shù)據(jù)庫(kù)的計(jì)算能力,能夠獨(dú)立完成各類(lèi)結(jié)構(gòu)化數(shù)據(jù)計(jì)算,而且特別強(qiáng)調(diào)集成性,易于嵌入應(yīng)用程序內(nèi)部,適合沒(méi)有數(shù)據(jù)庫(kù)或多個(gè)數(shù)據(jù)庫(kù)場(chǎng)景下的計(jì)算。這方面的對(duì)標(biāo)技術(shù)主要是數(shù)據(jù)庫(kù)和ETL工具。
其三,大數(shù)據(jù)計(jì)算平臺(tái)。集算器還有自己的集群體系,可用于實(shí)施數(shù)據(jù)量較大的計(jì)算任務(wù),集算器集群為程序員提供可靈活控制任務(wù)分配的分布式計(jì)算環(huán)境,借以實(shí)現(xiàn)最合理、高效的算法。這方面的對(duì)標(biāo)技術(shù)主要是Hadoop和MPP數(shù)據(jù)庫(kù)。
開(kāi)放的計(jì)算能力
上帝的歸上帝,愷撒的歸愷撒。
計(jì)算是無(wú)處不在的,并不是所有計(jì)算都適合數(shù)據(jù)庫(kù)來(lái)實(shí)施,現(xiàn)代應(yīng)用中有許多數(shù)據(jù)庫(kù)之外的計(jì)算需求。很多年前,這個(gè)問(wèn)題并不嚴(yán)重,因?yàn)槟莻€(gè)時(shí)候的許多應(yīng)用系統(tǒng)從交易到分析用一個(gè)中央數(shù)據(jù)庫(kù)全部搞定。而現(xiàn)在則有很大不同,出現(xiàn)了許多數(shù)據(jù)庫(kù)外的數(shù)據(jù),比如互聯(lián)網(wǎng)的網(wǎng)頁(yè)信息、Excel文件、機(jī)器產(chǎn)生的文本日志、云服務(wù)提供的XML或Json數(shù)據(jù)……這些數(shù)據(jù)都需要參與計(jì)算。
另外,即使是在數(shù)據(jù)庫(kù)中的數(shù)據(jù),也可能因?yàn)樗鶎俚膽?yīng)用系統(tǒng)不同而存儲(chǔ)于不同的數(shù)據(jù)庫(kù)中,如果不同廠商的異構(gòu)數(shù)據(jù)庫(kù)需要混合計(jì)算時(shí),就會(huì)涉及跨庫(kù)問(wèn)題。雖然許多數(shù)據(jù)庫(kù)提供了跨庫(kù)能力,但性能和方便性都不理想。
但集算器卻可以帶來(lái)不依賴于數(shù)據(jù)庫(kù)的計(jì)算能力,它提供了開(kāi)放的計(jì)算能力!
作為計(jì)算引擎,集算器并不關(guān)心數(shù)據(jù)放在什么類(lèi)型的數(shù)據(jù)源中,它都可以取來(lái)計(jì)算,并且是實(shí)時(shí)計(jì)算。多個(gè)數(shù)據(jù)庫(kù)也僅僅是多個(gè)數(shù)據(jù)源而已,跨庫(kù)混合計(jì)算是很自然的事情。即使仍然要把外部數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù),但計(jì)算過(guò)程也可以由集算器來(lái)實(shí)施,而中間數(shù)據(jù)則完全不需要占用數(shù)據(jù)庫(kù)空間和計(jì)算資源,直接存放在文件系統(tǒng)中,管理上也更為簡(jiǎn)單。
換句話說(shuō),集算器可以讓數(shù)據(jù)庫(kù)專(zhuān)心致志去做它最擅長(zhǎng)和最應(yīng)當(dāng)做的事情,比如存儲(chǔ)、一致性、模式及約束等,而不要僅僅為了獲得計(jì)算能力就去部署和擴(kuò)容更多的數(shù)據(jù)庫(kù),這些計(jì)算能力可以由更便宜、更輕量級(jí)而且性能也更好的集算器來(lái)提供。
在設(shè)計(jì)目標(biāo)上,集算器希望提升計(jì)算的描述效率和計(jì)算的執(zhí)行效率。蔣步星談到:“確切地說(shuō),集算器并不負(fù)責(zé)解決問(wèn)題,想出(高效)算法是程序員的任務(wù)。集算器的任務(wù)就是提供更好的數(shù)據(jù)類(lèi)型及相關(guān)的語(yǔ)法體系,使得編寫(xiě)這類(lèi)計(jì)算更容易更簡(jiǎn)潔,更貼近人們的自然思維習(xí)慣?!?/p>
大幅提升復(fù)雜運(yùn)算的性能
作為一款理論創(chuàng)新產(chǎn)品,集算器的核心運(yùn)算引擎全部由潤(rùn)乾團(tuán)隊(duì)自己編寫(xiě)?!坝行┑讓拥幕居?jì)算,包括表達(dá)式計(jì)算、分組、過(guò)濾等也有通用性,但要形成一套完整的體系,并且保證足夠的性能,也還是要自己實(shí)現(xiàn)才能完全控制。而且,我們因?yàn)橛惺嗄觊_(kāi)發(fā)報(bào)表工具的經(jīng)驗(yàn),這些底層計(jì)算本來(lái)就有豐富的積累。”蔣步星補(bǔ)充道,集算器的實(shí)現(xiàn)技術(shù)和Hadoop也沒(méi)有關(guān)系,只是將Hadoop作為數(shù)據(jù)源對(duì)待,集算器集群的運(yùn)行不需要Hadoop環(huán)境。
那么,這套支撐集算器的理論體系從何而來(lái)呢?這就需要溯源到上個(gè)世紀(jì)70年代了。關(guān)系代數(shù)是上個(gè)世紀(jì)70年代發(fā)明的理論,已經(jīng)有40多年歷史了,其間雖有多次完善,但并沒(méi)有發(fā)生關(guān)鍵性的革新。在發(fā)明關(guān)系代數(shù)的時(shí)代,計(jì)算機(jī)用于信息管理還不夠普及,數(shù)據(jù)計(jì)算需求相對(duì)簡(jiǎn)單,用一些常規(guī)查詢統(tǒng)計(jì)方法就夠了。而當(dāng)代企業(yè)不用計(jì)算機(jī)管理已經(jīng)不可能運(yùn)轉(zhuǎn),數(shù)據(jù)計(jì)算需求的復(fù)雜度大大提高,那個(gè)時(shí)代的理論體系很難適應(yīng)這些新需求。
“舉個(gè)例子,基于無(wú)序集合理論的關(guān)系代數(shù)很難處理有序計(jì)算,而有序計(jì)算又是用戶天然需要的(比上期、比去年同期等)。而且,那個(gè)時(shí)代的計(jì)算機(jī)硬件還很差,要確保實(shí)用性,代數(shù)理論的設(shè)計(jì)也只能適應(yīng)當(dāng)時(shí)的環(huán)境,不可能考慮到今天的硬件情況,具體來(lái)講主要是大內(nèi)存、多CPU和集群,SQL的基礎(chǔ)就是關(guān)系代數(shù),這使得SQL很難充分利用當(dāng)代計(jì)算機(jī)的硬件能力以獲得最優(yōu)的性能?!笔Y步星談到,這也是集算器能比SQL做得更好的原因。
在此背景下,蔣步星帶領(lǐng)團(tuán)隊(duì)設(shè)計(jì)了新的語(yǔ)言SPL(Structured Process Language)?!癝PL能比SQL做得更好,是因?yàn)镾QL有點(diǎn)像是在用羅馬數(shù)字做運(yùn)算,非常別扭,而SPL像是用阿拉伯?dāng)?shù)字,會(huì)順手很多。性能上的優(yōu)勢(shì)也類(lèi)似,SPL發(fā)明了許多乘法,這些運(yùn)算就不需要再用加法計(jì)算了。”
蔣步星補(bǔ)充說(shuō):“集算器在許多場(chǎng)合中測(cè)試出來(lái)的性能優(yōu)勢(shì)表明,這并不是我們的程序代碼寫(xiě)得比別人好,而是在模型上有優(yōu)勢(shì),能夠采用復(fù)雜度更低的算法來(lái)實(shí)現(xiàn)。運(yùn)算越復(fù)雜時(shí),我們就越有機(jī)會(huì)想出優(yōu)化算法,集算器的性能優(yōu)勢(shì)就越明顯,同時(shí)還會(huì)伴隨著代碼更簡(jiǎn)單的好處,在運(yùn)用集算器的案例中常常會(huì)出現(xiàn)代碼短了數(shù)倍,性能卻能提升數(shù)倍的情況。”
填補(bǔ)空白:定位中小規(guī)模的集群
目前的大數(shù)據(jù)計(jì)算平臺(tái)大概是兩種:數(shù)據(jù)庫(kù)擴(kuò)容以及相關(guān)的MPP方案和Hadoop體系。數(shù)據(jù)庫(kù)本身擴(kuò)容能力有限,在數(shù)據(jù)量較大時(shí)就撐不住了,而且MPP方案的建設(shè)成本相當(dāng)高昂。而Hadoop體系的設(shè)計(jì)目標(biāo)是超大規(guī)模集群,要幾百甚至上千節(jié)點(diǎn)時(shí)才能顯露出優(yōu)勢(shì)來(lái),它消耗了大量資源用于容錯(cuò)和復(fù)雜的任務(wù)調(diào)度管理機(jī)制,在集群節(jié)點(diǎn)數(shù)不夠多時(shí)反而沒(méi)什么優(yōu)勢(shì)。這樣,傳統(tǒng)數(shù)據(jù)庫(kù)解決小數(shù)據(jù)量,Hadoop解決超大數(shù)據(jù)量,占大多數(shù)的中等規(guī)模應(yīng)用場(chǎng)景是個(gè)空白,目前用戶也只能用Hadoop來(lái)做。
“殺雞用了牛刀,因?yàn)闆](méi)有雞刀。集算器填補(bǔ)這一空白。集算器定位中小規(guī)模的集群,設(shè)計(jì)規(guī)模就是幾個(gè)到幾十個(gè)節(jié)點(diǎn),原則上不要超過(guò)一個(gè)交換機(jī),這是絕大多數(shù)用戶的實(shí)際場(chǎng)景?!笔Y步星說(shuō),在這個(gè)規(guī)模下,集算器不需要考慮太多容錯(cuò)問(wèn)題,也沒(méi)有太復(fù)雜的任務(wù)調(diào)度要求,把有限的資源盡量多地投入到計(jì)算本身中,從而獲得更優(yōu)的效率。
對(duì)于集算器的下一步,蔣步星也想得很清楚:“集算器的下一步是數(shù)據(jù)庫(kù)和數(shù)據(jù)倉(cāng)庫(kù),并將演變成和傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)、數(shù)據(jù)倉(cāng)庫(kù)正面競(jìng)爭(zhēng)的產(chǎn)品。但是換個(gè)角度看,集算器也不會(huì)是一個(gè)階段性產(chǎn)品,即使演化出數(shù)據(jù)倉(cāng)庫(kù)后,作為計(jì)算引擎的集算器仍然有存在的意義,并且會(huì)長(zhǎng)期完善下去。因?yàn)閿?shù)據(jù)倉(cāng)庫(kù)的計(jì)算能力是相對(duì)封閉的,也難以被嵌入到應(yīng)用程序中,而應(yīng)用中總會(huì)有大量庫(kù)外數(shù)據(jù),永遠(yuǎn)會(huì)需要開(kāi)放且可以被集成的計(jì)算能力?!?/p>
訪談實(shí)錄
Q:中國(guó)大數(shù)據(jù)產(chǎn)業(yè)生態(tài)聯(lián)盟、《軟件和集成電路》雜志社
A:北京潤(rùn)乾信息系統(tǒng)技術(shù)有限公司董事長(zhǎng)蔣步星
Q:集算器能不能提供兼容SQL的語(yǔ)法?
A:集算器不能基于關(guān)系代數(shù)來(lái)實(shí)現(xiàn)SQL。SQL難以獲得(開(kāi)發(fā)和運(yùn)行的)高效率,本來(lái)就是關(guān)系代數(shù)造成的。這個(gè)問(wèn)題是理論性的,不可能通過(guò)工程上的優(yōu)化來(lái)解決。想獲得高效率,就必須放棄關(guān)系代數(shù)。不過(guò),對(duì)于簡(jiǎn)單運(yùn)算,集算器也提供了SQL接口,畢竟用戶已經(jīng)習(xí)慣了,而對(duì)于復(fù)雜運(yùn)算,我們建議用戶學(xué)習(xí)SPL,會(huì)獲得更高的效率。
Q:集算器采用開(kāi)源技術(shù)嗎?
A:集算器的核心運(yùn)算引擎沒(méi)有采用任何開(kāi)源產(chǎn)品,完全是我們自己寫(xiě)出來(lái)的。因?yàn)槔碚撃P筒煌?,也沒(méi)有什么開(kāi)源產(chǎn)品可用。特別是,集算器不是Hadoop上的計(jì)算模塊,在設(shè)計(jì)集群方案時(shí)也沒(méi)有參考借鑒Hadoop體系,集算器的實(shí)現(xiàn)技術(shù)和Hadoop沒(méi)有關(guān)系,只是將Hadoop作為數(shù)據(jù)源對(duì)待,集算器集群的運(yùn)行不需要Hadoop環(huán)境。但是,我們?cè)谶吘壓屯鈬昧艘恍╅_(kāi)源技術(shù),比如讀寫(xiě)Excel文件就用了poi包,這個(gè)包做得挺好的,還有國(guó)際化本地語(yǔ)言排序、日志輸出等,另外,開(kāi)發(fā)環(huán)境的外觀以及表達(dá)式的編輯也用了開(kāi)源技術(shù)。
Q:為什么一直堅(jiān)持做基礎(chǔ)軟件而不做看起來(lái)更容易賺錢(qián)的應(yīng)用軟件?
A:對(duì)潤(rùn)乾來(lái)講,我們只是在做自己擅長(zhǎng)且喜歡的事,只是樸素地想通過(guò)這種方式來(lái)經(jīng)營(yíng)企業(yè),基礎(chǔ)軟件有更大的重復(fù)銷(xiāo)售量來(lái)獲得超額利潤(rùn),基礎(chǔ)軟件難度大更適合我們這種以技術(shù)為本的公司。這或許就是傳說(shuō)中的情懷吧,要鉆研技術(shù)就必須有堅(jiān)韌、持之以恒的態(tài)度和工匠精神,這能夠建立起更高的技術(shù)門(mén)檻,結(jié)果還可以轉(zhuǎn)化成利潤(rùn)。正因如此,我們研發(fā)團(tuán)隊(duì)異常穩(wěn)定,很多“老研發(fā)”在這里一待就是18年,我們能做出別人做不出來(lái)的東西。
行業(yè)應(yīng)用案例
案例名稱(chēng):集算器助力構(gòu)建北京銀行綜合可視化智能系統(tǒng)
核心特點(diǎn):
北京銀行綜合可視化智能系統(tǒng)將以數(shù)據(jù)可視化服務(wù)體系搭建為基礎(chǔ),整個(gè)項(xiàng)目服務(wù)體系依托數(shù)據(jù)可視化規(guī)范、可視化服務(wù)平臺(tái),結(jié)合分行領(lǐng)導(dǎo)層以及業(yè)務(wù)分析崗在研判分析、決策指揮等場(chǎng)景下的業(yè)務(wù)需求,形成可視化智能大屏產(chǎn)品,以多元化、專(zhuān)業(yè)化、友好化的視覺(jué)通道,實(shí)時(shí)、準(zhǔn)實(shí)時(shí)地將區(qū)域經(jīng)營(yíng)動(dòng)態(tài),產(chǎn)品熱度等以大屏智能交互的形式對(duì)外展開(kāi)服務(wù)。
應(yīng)用解讀:
該架構(gòu)方案的數(shù)據(jù)源是由潤(rùn)乾公司通過(guò)從Control-M到集算器輔助ETL、集算器數(shù)據(jù)緩沖層再到集算器倉(cāng)庫(kù)來(lái)提供,用集算器倉(cāng)庫(kù)的模型來(lái)存儲(chǔ)事實(shí)表和緯度表,用集算器的集文件(二進(jìn)制文件)與組表來(lái)做數(shù)據(jù)存儲(chǔ),集算器在計(jì)算層負(fù)責(zé)計(jì)算單元,通過(guò)集算器應(yīng)用接口,用可視化化組件來(lái)做數(shù)據(jù)的呈現(xiàn)。
應(yīng)用價(jià)值:
在金融科技來(lái)臨的時(shí)代,各大行業(yè)已基本具備海量數(shù)據(jù)規(guī)模,成熟高效的數(shù)據(jù)平臺(tái)解決方案已經(jīng)成為大數(shù)據(jù)時(shí)代背景下的迫切需求。
潤(rùn)乾公司自主研發(fā)運(yùn)營(yíng)的數(shù)據(jù)計(jì)算中間件,是一個(gè)通用性的輕量級(jí)大數(shù)據(jù)計(jì)算引擎,具有語(yǔ)法簡(jiǎn)單、類(lèi)庫(kù)豐富、集成性好、支持分步計(jì)算等特點(diǎn),可以幫助用戶實(shí)現(xiàn)提升開(kāi)發(fā)效率、優(yōu)化應(yīng)用結(jié)構(gòu)、提升運(yùn)算性能等目標(biāo)。
降低開(kāi)發(fā)難度從而提高開(kāi)發(fā)效率是集算器的設(shè)計(jì)初衷。用戶通過(guò)內(nèi)置的敏捷語(yǔ)法體系編寫(xiě)簡(jiǎn)單的代碼即可完成原來(lái)在SQL或Java中需要復(fù)雜編碼的計(jì)算,達(dá)到讓編碼簡(jiǎn)單化的效果。
優(yōu)化應(yīng)用結(jié)構(gòu)是集算器的重要作用。集算器是解釋執(zhí)行的語(yǔ)言,使用其實(shí)現(xiàn)數(shù)據(jù)算法可以降低應(yīng)用的耦合度;通過(guò)集算器將算法外置減少存儲(chǔ)過(guò)程數(shù)量,將數(shù)據(jù)外置減少中間表數(shù)量,從而優(yōu)化數(shù)據(jù)庫(kù)結(jié)構(gòu);集算器天然支持多樣性數(shù)據(jù)源,避免統(tǒng)一數(shù)據(jù)來(lái)源帶來(lái)的繁重工作,進(jìn)而優(yōu)化應(yīng)用結(jié)構(gòu)。
提升運(yùn)算性能是集算器的顯著效果。集算器的敏捷語(yǔ)法體系和內(nèi)置的(半)結(jié)構(gòu)化計(jì)算類(lèi)庫(kù)讓大部分計(jì)算的實(shí)現(xiàn)變得簡(jiǎn)單的同時(shí)獲得更高性能。此外,集算器還提供了分步式計(jì)算功能,通過(guò)多機(jī)(PC)集群達(dá)到甚至超過(guò)小型機(jī)的性能,整體造價(jià)和維護(hù)成本更低。