閱讀913 返回首頁    go 阿裏雲 go 技術社區[雲棲]


打通數據庫任督二脈 - 數據、計算生態融合

標簽

PostgreSQL , PostGIS , 點雲 , GPU , FPGA , CPU , TPU , PL/language , 科研 , 嵌入式計算 , UDF , CUDA , 數據庫嵌入式編程 , 流式計算 , 科學計算 , 軟硬一體


背景

隨著技術的普及,越來越多以前需要很高的成本才能獲取的數據,現在觸手可及。

1. 點雲(點的位置坐標+RGB+其他屬性),以前隻有軍用領域在使用,比如《普羅米修斯》這部電影,通過一些小的飛行器(點雲傳感器設備)飛入未知的通道後,傳回獲取的點雲數據,從而構建通道的全係影像。

pic

現在民用領域,也有很多點雲的類似應用。例如:掃地機器人,無人車,消防(探測房屋結構),VR(通過點雲數據構建全息影像)等等。

pic

2. 氣象數據 (位置、日照、溫度、雨量、風量等),氣象數據往往是柵格類型的數據,一個柵格包含了一片區域的日照、溫度、雨量、風量等數據,柵格可以切分和聚合。

氣象數據的有非常多的用途,例如:

光伏電廠的選址,需要分析某區域某個時間段,日照數據統計。

多個柵格的數據聚合,或者一個柵格數據的部分截取等。比如一個包含了浙江省的柵格數據,如果隻需要杭州市區的數據,那麼可以在讀取時將杭州的區域切分出來。

在時間維度上分析,在地理位置維度上分析,在其他屬性維度分析,多個維度的分析。

生成時序動態圖等。

曆史柵格數據不斷的積累,不停的上傳新的數據使得曆史數據越來越多。

pic

3. 地震數據(高頻波,傅立葉變換),地震數據是一些包含了地理位置屬性的XYZ三個方向的高頻波形數據,收到數據後,需要對其進行快速的數據轉換,預測和告警。

同時還需要對曆史的數據進行挖掘。

pic

4. 天文數據(尋天,星係,軌跡比對),從古至今,人類一直沒有停止對外太空的探索,天文台就是一個最為直接的探索外太空的設備。

有一個項目叫“尋天”,每天這些望遠鏡需要對天球坐標進行全方位的拍攝,拍攝的數據以柵格類型存入數據庫,以備後續的分析。比如尋址超新星,尋找類太陽係等。其中尋找類太陽係就需要對單個柵格的多個曆史數據進行比對,通過行星運行軌跡對光線造成的細微影響找出類太陽係的星體。

涉及到大量的時間、空間維度的運算。

pic

5. 室內定位(孤立坐標係、相對坐標係),實際上現在室內定位也非常的成熟了,例如你站在某個商場中,商場有若幹個WIFI熱點,隻要你的手機開啟了WIFI,那麼通過3個WIFI熱點與你的手機之間的信號強弱,就可以定位到你的位置。除了通過WIFI進行定位,還有磁場、聲波、視覺等定位方法。定位後,數據以坐標+誤差範圍的形式存入數據庫,這個坐標是相對坐標。

室內定位有什麼商業用途呢?例如可以獲取某個時間點的人群分布,哪個商場或者站台附近聚集了人群,進行營銷效果的挖掘。

又比如,在時間+空間維度上,統計分析人流量,平均的駐留時間等。

pic

6. 室外定位(定位方法:GPS、基站信號強弱等),人群踩踏事件預測,非法聚眾預測,事件預測,某個位置的人群駐足時間(廣告效應報告)等。

pic

7. 其他,民用,軍用

還有那些喜聞樂見的應用,o2o, 地圖, 導航, 位置交友, 都帶有很強的時間、空間、業務數據屬性。

麵向這麼多的軍用轉民用技術,民用的軟件技術有沒有準備好?數據庫有沒有準備好接招呢?

時間、空間、業務數據融合的挑戰

1. 數據類型越來越豐富,例如大多數業務基本上都會包含空間數據。

2. 大多數的數據具備時序屬性,例如金融數據、物聯網傳感數據、氣象數據、天文數據、地震監測數據等。

3. 數據查詢維度(篩選條件)越來越多,(時間、空間、UID等),例如

在2017-01-01 ~ 2017-02-01這個月,某個點附近方圓30公裏發生的事件。

在某個時間段,所有區域發生的事件。

在某個時間段,某個區域,某些用戶發生的事件。

4. 數據的計算需求越來越複雜,參與計算的數據量越來越龐大,計算離數據太遠導致傳輸效率浪費。

越來越多計算下推的需求。

5. 業務對數據計算的時效性越來越高,越來越多的計算被前置(如流計算,數據清洗等)。

6. 業務對數據深度學習的需求越來越多,而計算與數據的距離使得效率低下。

傳統的存儲與計算分離,使得整體的計算效率低下。越來越多的計算前置、計算下推需求,來提升存儲計算分離這種架構下的效率。

對接行業積累的Lib庫 - 提升開發、執行效率,降低成本

每個行業都有各自的特點,每個行業都有對行業理解深厚的ISV(地頭蛇),每個行業都有各自的積累(開發框架、Lib庫等)。

例如

在科學計算這個領域,有很多的python, R, go, julia語言相關的第三方庫。這些行業第三方庫是開發人員、科研人員對行業的理解與積累。(這些科學計算Lib庫可能被廣泛應用於氣象預測、地震預測、金融等眾多行業。)

如果這些Lib庫可以與數據緊密的結合,大大的拉進了計算與數據的距離,直接提升計算效率並且降低了成本,開發人員一定會很高興。

<Python常用科學計算相關外部庫>

以往是這樣算(數據從數據庫拉取到應用程序,應用程序再對其進行計算):

pic

現在是這樣算(使用科學計算相關的Lib庫,就在數據庫裏麵算):

pic

數據庫與程序開發語言、以及對應的LIB庫打通,是一件很美妙的事情。

PostgreSQL的PL框架實現了這一點,目前已支持plcuda, plpython, plr, pljava, plperl, pltcl, C等非常多的內置編程語言,(通過接口,還可以支持更多的地球編程語言)。

數據庫如何搭乘硬件發展的快車

通常我們理解的計算單元就是CPU,然而隨著技術的發展,越來越多專業的硬件,例如顯卡計算單元GPU,例如可燒錄,可編程的FPGA,還有隨著AI火起來的麵向機器學習的定製芯片TPU。

穀歌硬件工程師揭秘,TPU為何會比CPU、GPU快30倍?

老黃嘔心之作,英偉達能憑借Tesla V100技壓群雄嗎?

深入理解 CPU 和異構計算芯片 GPU/FPGA/ASIC 1

深入理解 CPU 和異構計算芯片 GPU/FPGA/ASIC 2

那麼數據庫能否跟上這波硬件發展的浪潮呢,或者說如何抓住硬件發展的紅利呢?

PostgreSQL如何與硬件整合

1. CPU

CPU的發展趨於緩慢,主要包括 :

擴展指令集,(如向量計算指令,已被PostgreSQL利用來加速OLAP數據分析場景,約有10倍的性能提升),例如

《PostgreSQL 向量化執行插件(瓦片式實現) 10x提速OLAP》

增加CPU計算單元,(例如PostgreSQL已支持多核並行計算,提升OLAP數據分析場景的性能,多核並行,一條SQL可以充分利用多個CPU核,縮短單條SQL的響應時間,特別適合OLAP業務),例如

《分析加速引擎黑科技 - LLVM、列存、多核並行、算子複用 大聯姻 - 一起來開啟PostgreSQL的百寶箱》

2. GPU

GPU與CPU的對比如下,GPU在核心數、FFLOPS、內存帶寬方麵,相比CPU有非常明顯的優勢。

pic

PostgreSQL通過pl/cuda語言接口,用戶可以在數據庫中直接使用GPU的計算能力。

pic

pl/cuda用法參考:

https://github.com/pg-strom/devel

3. FPGA

FPGA作為一種高性能、低功耗的可編程芯片,可以根據客戶定製來做針對性的算法設計。所以在處理海量數據的時候,FPGA 相比於CPU 和GPU,優勢在於:FPGA計算效率更高,FPGA更接近IO。

FPGA不采用指令和軟件,是軟硬件合一的器件。對FPGA進行編程要使用硬件描述語言,硬件描述語言描述的邏輯可以直接被編譯為晶體管電路的組合。所以FPGA實際上直接用晶體管電路實現用戶的算法,沒有通過指令係統的翻譯。

FPGA的英文縮寫名翻譯過來,全稱是現場可編程邏輯門陣列,這個名稱已經揭示了FPGA的功能,它就是一堆邏輯門電路的組合,可以編程,還可以重複編程。

PostgreSQL 社區,xilinx都有這方麵的結合產品。

https://www.pgcon.org/2015/schedule/track/Hacking/799.en.html

4. TPU

在Google I/O 2016的主題演講進入尾聲時,Google的CEO皮采提到了一項他們這段時間在AI和機器學習上取得的成果,一款叫做Tensor Processing Unit(張量處理單元)的處理器,簡稱TPU。在大會上皮采隻是介紹了這款TPU的一些性能指標,並在隨後的博客中公布了一些使用場景:

Google一直堅信偉大的軟件將在偉大的硬件的幫助下更加大放異彩,所以Google便在想,我們可不可以做出一款專用機機器學習算法的專用芯片,TPU便誕生了。

TPU的靈感來源於Google開源深度學習框架TensorFlow,所以目前TPU還是隻在Google內部使用的一種芯片。

https://www.leiphone.com/news/201605/xAiOZEWgoTn7MxEx.html

小結

PostgreSQL以其擴展接口(pl/language, customscan, operator, type, index擴展),可以非常方便的對接以上各種硬件計算單元,讓數據和計算緊密的結合,提高能效比。

通過利用指令集、多核計算對接CPU,通過PL/CUDA,customscan對接GPU,通過customscan對接FPGA,等等,一切都是為了提升計算能力。

數據庫的發展

關係數據庫發展了幾十年,最核心的功能,依舊是支持可靠的數據存取、支持SQL接口。

隨著社會的進步,數據庫正在添加越來越多的功能,比如GIS就是其中之一。

為什麼要將GIS功能添加到數據庫中呢?在應用層實現不好嗎?

這個問題很有意思,在應用層實現當然是可以的,但不是最好的。

舉個例子,我們存儲了一批用戶、商鋪的位置數據,要求某個用戶周邊的其他商鋪,如果要在應用層實現這個功能,需要將位置數據都下載到程序端,然後計算距離,並輸出周邊的商鋪。而用戶請求的並發可能較高,請求的位置可能都不一樣。在應用層實現這個功能,效率非常低下,因為每一次請求,都需要將數據載入應用層,同時需要計算每條記錄的距離。印證了一句古話“遠水解不了近渴”。

pic

在數據庫層實現GIS這個功能遵循了兩個宗旨:

1. 數據和計算在一起,每次請求不再需要move data,提升了整體效率。

2. 讓數據庫支持GIS類型和GIS索引,讓每一次距離查詢都可以通過索引檢索,提升查詢效率。

pic

可以看出,數據庫的發展實際上也是遵循了以上原則,在保證數據庫不會成為瓶頸的前提下,讓整體的效率得以提升。

PostgreSQL 如何保證數據庫不會成為瓶頸?

1. 提升計算能力

充分利用硬件的能力提升計算能力。例如結合 CPU指令、CPU多核協作、GPU、FPGA。。。

2. 提升開發效率

SQL標準的兼容性越好,開發用起來越爽。

支持的類型、function、索引越豐富,開發用起來越爽。

支持的編程接口越豐富,開發人員越爽,例如通過plpython對接PyPI,通過plR對接CRAN,通過plcuda對接GPU開發生態。

支持的開發框架越多,開發人員越爽。

3. 提升擴展能力

分為兩個部分的擴展,一部分是計算能力的擴展,另一部分是開發能力的擴展。

擴展計算能力:

通過sharding,水平擴展節點,擴展整體性能。

通過MPP插件,擴展跨庫計算能力。

擴展開發能力:

通過擴展接口(類型、索引、PL語言、UDF、解析器、執行器),支持更多的數據類型、索引類型、編程語言等。GIS就是其中一個例子,擴展了GIS類型、索引、UDF等等。

PostgreSQL 如何提升整體效率?

1. 計算與數據在一起,減少move data。

前麵舉的GIS的例子說明了一個問題,頻繁的移動數據使得程序的效率低下,如果將計算與數據結合起來,可以大幅的提升效率。

PostgreSQL融合行業生態

1. 計算與數據在一起,減少move data。

PostgreSQL內置了許多函數、數據類型、索引類型(已超越ORACLE支持的範疇),可以滿足大多數的業務場景需求。

如果內存的數據類型不能滿足業務需求,可以通過類型擴展接口,擴展數據類型以及類型配套的操作符、函數、索引等。

如果內置的函數、操作符無法滿足業務對數據處理的需求時,用戶可以通過plpython, plr, plcuda, pljava, plperl, pltcl等數據庫過程語言,不僅擴展了編程能力,同時還對接了編程語言生態。

例如PyPI, CRAN等庫,在數據庫中完成對數據的一站式處理。

這個章節描寫了如何擴展PostgreSQL:類型、函數、操作符、索引、聚合等。

https://www.postgresql.org/docs/10/static/extend.html

2. SQL接口流計算

pipelinedb是基於PostgreSQL的一個流計算數據庫,1.0版本將支持插件化,PostgreSQL用戶可以通過安裝插件的方式,支持流計算的功能。

SQL流計算有諸多好處,數據庫的SQL接口非常成熟,支持非常成熟的統計分析函數,統計分析語法。建立流的過程非常簡單。

《(流式、lambda、觸發器)實時處理大比拚 - 物聯網(IoT)\金融,時序處理最佳實踐》

《流計算風雲再起 - PostgreSQL攜PipelineDB力挺IoT》

SQL接口的流計算,使用便捷,開發成本低,啟動成本低,擴展能力強,效率高。

除此之外,PostgreSQL還整合了CPU\GPU\FPGA等計算能力,整合了PL編程接口,流式處理的能力更加的強大。

比如氣象類應用,大量的用到了GIS + 科學計算(plpython)+ 流式計算 + GPU (pl cuda)的處理能力。使用PostgreSQL就非常的恰當。

《PostgreSQL 支持CUDA編程 pl/cuda》

《PostgreSQL 點雲應用》

小結

對企業來說,數據和計算是兩個不可分割的部分。

經曆了幾十年的發展,數據庫在數據的可靠存取、業務連續性方麵成就卓越,企業也非常相信數據庫這方麵的能力,通常會將數據都存入數據庫中。

同時企業對數據的計算需求也在膨脹,從最初的簡單計算,到現在越來越複雜的計算需求。計算的需求分為兩個部分,1、運算能力,2、編程能力。

1. 數據庫在運算方麵的能力也在逐漸提高,但是在兼顧數據可靠性的前提下,彈性提升運算能力沒有想象中容易,大多數的關係數據庫僅僅依賴 CPU\硬盤 等本地硬件能力的提升,運算能力提升非常有限,企業也不能等待數據庫在這方麵的提升。

2. 數據庫在編程能力方麵,有幾種提升手段,一種是擴展SQL語法,支持更多的數據類型、函數、索引等。另一種是語言的支持,通常數據庫會內置存儲過程語言,例如Oracle的PL/SQL,PostgreSQL的plpgsql,但是這些語言的編程能力有限。

所以市場中衍生出適合各種場景的數據庫或框架,以犧牲"並發能力、數據可靠性、一致性、易用性、事務、功能等"的某些部分為代價。例如 時序數據庫、流計算數據庫、NOSQL、大數據框架、分布式數據庫 等等。

那麼關係數據庫到底還能不能提升計算能力呢?

實際上還是和數據庫本身的框架有關,PostgreSQL的框架特別有意思,開放了眾多的接口,在保證數據庫核心功能不妥協的前提下,允許對其進行擴展。包括:

數據庫服務端編程語言(PLpython, java, perl, R, ...)、類型、函數、操作符、索引、聚合、外部存儲、customScan等。

數據庫的未來 - HTAP

Hybrid Transactional/Analytical Processing (HTAP)是gartner提出的一個新名詞,代表一種既能處理在線事務,又能處理分析型請求的混合數據庫。

https://en.wikipedia.org/wiki/Hybrid_Transactional/Analytical_Processing_(HTAP)

pic

要實現HTAP,必須打通數據、計算的任督二脈。PostgreSQL在這方麵具有天然的優勢,從這幾年的發展也能看出端倪。

1. 通過PL(數據庫內置編程語言(PLpython, java, perl, R, ...))對接行業生態,讓開發者積累的Lib得以傳承。

2. 通過擴展接口對接硬件生態,讓CPU,GPU,FPGA,TPU,ASIC等參與垂直的專業計算,提升效率,打破傳統的CPU ONLY的模式。

3. 通過流實現計算前置,解決數據的實時計算需求。

4. 通過FDW接口,存儲接口將計算下推,讓更多具備運算能力的單元參與運算,避免集中式運算的局麵。提升大數據量的處理能力。

其中的代表包括postgres_fdw, 阿裏雲的oss_fdw。

5. 通過sharding技術實現數據庫的水平擴展。

6. 通過MPP提升大規模計算協作能力。

7. BSD-like許可,已經有非常多的企業以PostgreSQL為基礎打造了更多的衍生產生,免去重複造輪子的過程。

8. 擴展類型、函數、操作符、索引接口,對接垂直行業生態。

PostGIS, 基因類型, 化學類型, 圖像特征類型, 全文檢索等插件,就是非常典型的例子。支持更多的垂直行業應用。

9. 當數據庫可以無限擴展,具備強大的計算能力時,它已然不是一個傳統的隻能存取數據的數據庫,而是一個提供了編程能力、計算能力、擴展能力的數據平台(或數據工廠),提升數據的使用效率、節約成本。

10. 即使數據庫可以無限擴展,還有一點需要注意,資源的控製。特別是開放了pl之後,用戶寫的代碼可能把資源用盡。一個比較有效的資源調度:當係統有足夠的空閑資源時放開用,當係統資源不足時,按權重調度分配資源的使用。

PostgreSQL是進程模型,這方麵可以結合docker, cgroup等手段實現資源的控製。

pic

參考

https://postgis.net/docs/manual-dev/

https://2016.foss4g-na.org/sites/default/files/slides/gbroccolo_FOSS4GNA2016_pointcloud_0.pdf

https://www.slideshare.net/kaigai/pgconfsv2016-plcuda/

https://github.com/pg-strom/devel

https://www.pgconfsv.com/program/schedule

https://kaigai.hatenablog.com/entry/2016/11/17/070708

https://www.pgconfsv.com/plcuda-fusion-hpc-grade-power-database-analytics-0

https://www.pgconf.asia/JP/wp-content/uploads/2016/12/20161203_PGconf.ASIA_PLCUDA.pdf

https://gohom.win/2015/08/10/python-good-lib/

《PostgreSQL 數據庫擴展語言編程 之 plpgsql - 1》

https://it.sohu.com/20170525/n494441009.shtml

https://www.leiphone.com/news/201704/55UjF0lafhIZVGJR.html

最後更新:2017-05-31 19:33:42

  上一篇:go  人工智能時代下的視覺合成
  下一篇:go  PostgreSQL裏的17種文本相似算法與GIN索引 - pg_similarity