打通數據庫任督二脈 - 數據、計算生態融合
標簽
PostgreSQL , PostGIS , 點雲 , GPU , FPGA , CPU , TPU , PL/language , 科研 , 嵌入式計算 , UDF , CUDA , 數據庫嵌入式編程 , 流式計算 , 科學計算 , 軟硬一體
背景
隨著技術的普及,越來越多以前需要很高的成本才能獲取的數據,現在觸手可及。
1. 點雲(點的位置坐標+RGB+其他屬性),以前隻有軍用領域在使用,比如《普羅米修斯》這部電影,通過一些小的飛行器(點雲傳感器設備)飛入未知的通道後,傳回獲取的點雲數據,從而構建通道的全係影像。
現在民用領域,也有很多點雲的類似應用。例如:掃地機器人,無人車,消防(探測房屋結構),VR(通過點雲數據構建全息影像)等等。
2. 氣象數據 (位置、日照、溫度、雨量、風量等),氣象數據往往是柵格類型的數據,一個柵格包含了一片區域的日照、溫度、雨量、風量等數據,柵格可以切分和聚合。
氣象數據的有非常多的用途,例如:
光伏電廠的選址,需要分析某區域某個時間段,日照數據統計。
多個柵格的數據聚合,或者一個柵格數據的部分截取等。比如一個包含了浙江省的柵格數據,如果隻需要杭州市區的數據,那麼可以在讀取時將杭州的區域切分出來。
在時間維度上分析,在地理位置維度上分析,在其他屬性維度分析,多個維度的分析。
生成時序動態圖等。
曆史柵格數據不斷的積累,不停的上傳新的數據使得曆史數據越來越多。
3. 地震數據(高頻波,傅立葉變換),地震數據是一些包含了地理位置屬性的XYZ三個方向的高頻波形數據,收到數據後,需要對其進行快速的數據轉換,預測和告警。
同時還需要對曆史的數據進行挖掘。
4. 天文數據(尋天,星係,軌跡比對),從古至今,人類一直沒有停止對外太空的探索,天文台就是一個最為直接的探索外太空的設備。
有一個項目叫“尋天”,每天這些望遠鏡需要對天球坐標進行全方位的拍攝,拍攝的數據以柵格類型存入數據庫,以備後續的分析。比如尋址超新星,尋找類太陽係等。其中尋找類太陽係就需要對單個柵格的多個曆史數據進行比對,通過行星運行軌跡對光線造成的細微影響找出類太陽係的星體。
涉及到大量的時間、空間維度的運算。
5. 室內定位(孤立坐標係、相對坐標係),實際上現在室內定位也非常的成熟了,例如你站在某個商場中,商場有若幹個WIFI熱點,隻要你的手機開啟了WIFI,那麼通過3個WIFI熱點與你的手機之間的信號強弱,就可以定位到你的位置。除了通過WIFI進行定位,還有磁場、聲波、視覺等定位方法。定位後,數據以坐標+誤差範圍的形式存入數據庫,這個坐標是相對坐標。
室內定位有什麼商業用途呢?例如可以獲取某個時間點的人群分布,哪個商場或者站台附近聚集了人群,進行營銷效果的挖掘。
又比如,在時間+空間維度上,統計分析人流量,平均的駐留時間等。
6. 室外定位(定位方法:GPS、基站信號強弱等),人群踩踏事件預測,非法聚眾預測,事件預測,某個位置的人群駐足時間(廣告效應報告)等。
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庫可以與數據緊密的結合,大大的拉進了計算與數據的距離,直接提升計算效率並且降低了成本,開發人員一定會很高興。
以往是這樣算(數據從數據庫拉取到應用程序,應用程序再對其進行計算):
現在是這樣算(使用科學計算相關的Lib庫,就在數據庫裏麵算):
數據庫與程序開發語言、以及對應的LIB庫打通,是一件很美妙的事情。
PostgreSQL的PL框架實現了這一點,目前已支持plcuda, plpython, plr, pljava, plperl, pltcl, C等非常多的內置編程語言,(通過接口,還可以支持更多的地球編程語言)。
數據庫如何搭乘硬件發展的快車
通常我們理解的計算單元就是CPU,然而隨著技術的發展,越來越多專業的硬件,例如顯卡計算單元GPU,例如可燒錄,可編程的FPGA,還有隨著AI火起來的麵向機器學習的定製芯片TPU。
深入理解 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有非常明顯的優勢。
PostgreSQL通過pl/cuda語言接口,用戶可以在數據庫中直接使用GPU的計算能力。
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功能添加到數據庫中呢?在應用層實現不好嗎?
這個問題很有意思,在應用層實現當然是可以的,但不是最好的。
舉個例子,我們存儲了一批用戶、商鋪的位置數據,要求某個用戶周邊的其他商鋪,如果要在應用層實現這個功能,需要將位置數據都下載到程序端,然後計算距離,並輸出周邊的商鋪。而用戶請求的並發可能較高,請求的位置可能都不一樣。在應用層實現這個功能,效率非常低下,因為每一次請求,都需要將數據載入應用層,同時需要計算每條記錄的距離。印證了一句古話“遠水解不了近渴”。
在數據庫層實現GIS這個功能遵循了兩個宗旨:
1. 數據和計算在一起,每次請求不再需要move data,提升了整體效率。
2. 讓數據庫支持GIS類型和GIS索引,讓每一次距離查詢都可以通過索引檢索,提升查詢效率。
可以看出,數據庫的發展實際上也是遵循了以上原則,在保證數據庫不會成為瓶頸的前提下,讓整體的效率得以提升。
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就非常的恰當。
小結
對企業來說,數據和計算是兩個不可分割的部分。
經曆了幾十年的發展,數據庫在數據的可靠存取、業務連續性方麵成就卓越,企業也非常相信數據庫這方麵的能力,通常會將數據都存入數據庫中。
同時企業對數據的計算需求也在膨脹,從最初的簡單計算,到現在越來越複雜的計算需求。計算的需求分為兩個部分,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)
要實現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等手段實現資源的控製。
參考
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