新聞動态
News
2021-06-10 27104
在活動開(kāi)始後,鄭其華首先介紹了自(zì)己以往的任職經曆和項目經驗,随後正式進入了主題分享。
本次的分享主要分為(wèi)三個(gè)部分。第一(yī)部分鄭其華闡述了目前大數據行業(yè)存在的技(jì)術(shù)痛點和數據的價值,鄭其華以比特币“挖礦”這一(yī)行為(wèi)舉例,闡明了數據在當前時代的價值。同時也分析了當前大數據生(shēng)态中産品繁多(duō)卻功能(néng)單一(yī),接口不一(yī)且運維複雜(zá)等痛點。
在第二部分的分享中,鄭其華著(zhe)重介紹了錄信是如何基于Lucene實現萬億級多(duō)維檢索和實時分析的實踐,鄭其華從(cóng)面向萬億數據的五大挑戰(萬億數據存儲、秒(miǎo)級查詢響應、多(duō)維統計、區域檢索、計算(suàn)引擎)出發,深入剖析了針對這些問題所采取的技(jì)術(shù)手段和優化方案。
這一(yī)深入的技(jì)術(shù)實踐剖析吸引了許多(duō)同學的注意,由于現場座位有限,很多(duō)站(zhàn)累了的同學選擇席地而坐。
在第三部分的分享中,鄭其華主要介紹了錄信在公安軍隊、汽車行業(yè)的應用場景,尤其是在公安軍隊領域有200多(duō)個(gè)商業(yè)用例。
在活動的最後,許多(duō)現場同學就(jiù)一(yī)些技(jì)術(shù)問題向鄭其華進行了提問,鄭其華也一(yī)一(yī)回應。在活動結束後,一(yī)些同學與鄭其華進行了溝通(tōng),就(jiù)一(yī)些技(jì)術(shù)問題的實現細節進行了讨論。本次分享圓滿落幕。
萬億數據的挑戰與實現
萬億挑戰之一(yī):數據存儲
第一(yī)個(gè)關于數據存儲。平常我們保存數據很簡單,往硬盤裡(lǐ)面寫就(jiù)行了。海量數據就(jiù)沒那麽簡單,會(huì)面臨很多(duō)問題。比如成本問題。是使用SSD固态硬盤還(hái)是機(jī)械磁盤,是使用100塊大磁盤,還(hái)是使用1萬塊小(xiǎo)磁盤,在成本上(shàng)都會(huì)造成巨大的差異。
其次,數據的安全性也是一(yī)個(gè)問題。萬一(yī)磁盤損壞了,或者誤删除了,數據就(jiù)會(huì)丢失。數據遷移、擴容也會(huì)比較麻煩。另外,還(hái)有一(yī)個(gè)讀(dú)寫均衡的問題。數據寫入不均衡的話,可能(néng)就(jiù)會(huì)導緻有的磁盤特别忙,有的磁盤很空閑。或者,如果有個(gè)别磁盤出問題了,讀(dú)寫速度變慢(màn)了,就(jiù)會(huì)導緻所有的查詢都會(huì)卡在這個(gè)磁盤的IO上(shàng)面,降低(dī)了整體性能(néng)。
針對存儲的這些問題,我們采用了基于HDFS的索引技(jì)術(shù)來解決。
采用HDFS可以解決哪些問題呢(ne)?對于讀(dú)寫不均衡的問題,HDFS是一(yī)個(gè)高(gāo)度容錯(cuò)的系統,如果有磁盤壞掉了,或者速度變慢(màn)了,會(huì)自(zì)動切換到(dào)速度較快的副本上(shàng)進行讀(dú)取。并且,會(huì)對磁盤數據讀(dú)寫進行自(zì)動均衡,避免出現數據傾斜的問題。對于數據安全性的問題,HDFS有數據快照(zhào)、冗餘副本等功能(néng),可以降低(dī)因磁盤損壞,或者誤删除操作帶來的數據丢失問題。對于存儲成本問題,HDFS支持異構存儲,可以混合使用各種存儲介質,降低(dī)硬件(jiàn)成本。而且,HDFS可以支持大規模的集群,使用和管理成本都比較低(dī)。
除此之外,為(wèi)了進一(yī)步降低(dī)存儲成本,我們研發了列簇的功能(néng)。原生(shēng)Lucene是不支持列簇的,列簇的好處是什麽呢(ne)?
我們可以将數據列,指定為(wèi)不同的列簇,按列簇來混合使用不同磁盤,并且可以對不同列簇設置不同的生(shēng)命周期。比如,一(yī)個(gè)裡(lǐ)面可能(néng)包含一(yī)些結構化的數據,像标題、作者、摘要等等,這些數據一(yī)般比較小(xiǎo),而且是經常要進行檢索的。那麽我們就(jiù)可以将這些數據列定義為(wèi)一(yī)個(gè)列簇,放(fàng)在SSD上(shàng)。還(hái)有一(yī)些類似附件(jiàn)、圖片、視頻等非結構化的數據,這些數據比較大,而且一(yī)般不會(huì)進行查詢的,可以定義為(wèi)另一(yī)個(gè)列簇,放(fàng)在的SATA盤上(shàng)面。從(cóng)而降低(dī)了SSD固态硬盤的使用量。另外,列簇結合HDFS的異構策略,我們還(hái)可以實現冷熱數據的分離。比如,有的業(yè)務經常查詢最近1個(gè)月(yuè)以内數據。那麽,我們就(jiù)可以将最近1個(gè)月(yuè)保留在SSD上(shàng),1個(gè)月(yuè)以後,将數據,移到(dào)SATA盤上(shàng),從(cóng)而進一(yī)步降低(dī)SSD使用量。
接下(xià)來,再看(kàn)另外一(yī)個(gè)問題。大數據有一(yī)個(gè)基本的應用,就(jiù)是查詢檢索。比如這個(gè)頁面上(shàng)顯示的一(yī)個(gè)“全文檢索”功能(néng),是從(cóng)海量數據裡(lǐ)面查找包含用戶輸入關鍵字的數據。這樣的搜索功能(néng)很常見(jiàn),也不難實現。難的地方在于性能(néng)。對于萬億規模的數據,是幾秒(miǎo)就(jiù)響應了,還(hái)是幾個(gè)小(xiǎo)時再響應呢(ne)?
萬億挑戰之二,檢索性能(néng)
為(wèi)了實現萬億秒(miǎo)查的性能(néng)。我們對Lucene的倒排表進行了優化。
在全文檢索領域裡(lǐ)面,通(tōng)常的做法,就(jiù)是進行切詞,然後記錄這個(gè)關鍵詞在哪個(gè)裡(lǐ)面出現過。同時,也會(huì)保存其他一(yī)些相(xiàng)關的信息。比如,這個(gè)關鍵詞出現的頻率、在這個(gè)出現的位置等等,大概有十幾個(gè)元素,這些元素就(jiù)是保存在倒排表裡(lǐ)面。Lucene對這些元素,采用的是行存儲。這就(jiù)意味著(zhe),每次查詢都需要把所有的十幾個(gè)元素都讀(dú)取出來。而我們在檢索時,實際用到(dào)的可能(néng)隻有其中的兩三個(gè)元素。使用行存的話,會(huì)造成很多(duō)不必要的IO。因此,我們在這裡(lǐ),将倒排表裡(lǐ)面的元數據,改成了列存儲。
列存的好處是,查詢用到(dào)哪個(gè)元素,我隻讀(dú)取這個(gè)元素的内容,其他的内容就(jiù)可以直接跳過。這個(gè)改動看(kàn)上(shàng)去很小(xiǎo),但是在海量數據的場景,對性能(néng)的影響卻是極大的。比如,我們查詢的關鍵字,可能(néng)命中了幾億條數據。就(jiù)需要讀(dú)取幾億個(gè)倒排表的元數據信息,如果使用行存,讀(dú)取的數據量就(jiù)是幾億個(gè)元數據乘以十幾個(gè)元素。而列存儲的話,隻需要讀(dú)取兩三個(gè)元素,磁盤IO上(shàng)就(jiù)差了好幾倍。所以,通(tōng)過倒排表元數據的列存化,減少無效IO,這樣一(yī)個(gè)優化,帶來了好幾倍的性能(néng)提升。
然後,第二個(gè)優化的地方呢(ne),我們将倒排表按時序進行了存儲。
因為(wèi)我們在實際場景中發現,很多(duō)數據會(huì)有一(yī)個(gè)時序性的特點。也就(jiù)是數據都是随著(zhe)時間推移而産生(shēng)的。對這些數據查詢時,一(yī)般也會(huì)結合時間範圍進行。比如查詢最近一(yī)天或者最近幾小(xiǎo)時的汽車尾氣排放(fàng)量等等。而原生(shēng)Lucene的索引數據在存放(fàng)時,是雜(zá)亂無序的。同一(yī)天的數據,可能(néng)存在磁盤的不同位置。這樣在讀(dú)取的時候,就(jiù)是一(yī)個(gè)随機(jī)讀(dú)取。所以,我們在這裡(lǐ)也做了一(yī)點改進。把數據按照(zhào)入庫的順序進行存放(fàng)。那麽,我們在查詢某時間段的數據時,隻需要将磁盤上(shàng)這一(yī)整塊的數據讀(dú)取出來。我們知道機(jī)械硬磁盤的随機(jī)讀(dú)取性能(néng)比連續讀(dú)取性能(néng)要差很多(duō)。而且,磁盤在讀(dú)取連續數據時還(hái)有預讀(dú)功能(néng)。同樣大小(xiǎo)的數據量,連續讀(dú)取的性能(néng)可能(néng)會(huì)比随機(jī)讀(dú)取的性能(néng)高(gāo)一(yī)個(gè)數量級。
經過對索引的優化,基本上(shàng)萬億數據的檢索性能(néng)可以做到(dào)秒(miǎo)級響應。
上(shàng)一(yī)篇:錄信數軟“麒麟杯”東大全球校友(yǒu)雙創大賽嶄頭角,與誠邁科技(jì)簽署意向投資協議
下(xià)一(yī)篇:錄信數軟LSQL通(tōng)過信通(tōng)院數據庫性能(néng)評測并授證書