大數據十大開源查詢引擎

1.Hive

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換爲Map-Reduce任務進行運行,可以理解爲披着SQL外衣的Map-Reduce。十分適合數據倉庫的統計分析。

弊端:Hive是爲方便用戶使用Map-Reduce而在外面封裝了一層SQL,由於Hive採用了SQL,它的問題域比Map-Reduce更窄,因爲很多問題,SQL表達不出來,比如一些數據挖掘算法,推薦算法、圖像識別算法等,這些仍只能通過編寫Map-Reduce完成。

2.Impala

貢獻者::Cloudera

簡介: Cloudera Impala 可以直接爲存儲在HDFS或HBase中的Hadoop數據提供快速,交互式的SQL查詢。除了使用相同的存儲平臺外, Impala和Apache Hive一樣也使用了相同的元數據,SQL語法(Hive SQL),ODBC驅動和用戶接口(Hue Beeswax),這就很方便的爲用戶提供了一個相似並且統一的平臺來進行批量或實時查詢。

Cloudera Impala 是用來進行大數據查詢的補充工具。 Impala 並沒有取代像Hive這樣基於MapReduce的分佈式處理框架。Hive和其它基於MapReduce的計算框架非常適合長時間運行的批處理作業,例如那些涉及到批量 Extract、Transform、Load ,即需要進行ETL作業。

impala是Cloudera在受到Google的Dremel啓發下開發的實時交互SQL大數據查詢工具,它可以看成是Google Dremel架構和MPP (Massively Parallel Processing)結構的結合體。Impala沒有再使用緩慢的Hive&Map-Reduce批處理,而是通過使用與商用並行關係數據庫中類似的分佈式查詢引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分組成),可以直接從HDFS或HBase中用SELECT、JOIN和統計函數查詢數據,從而大大降低了延遲,其架構如圖4所示,Impala主要由Impalad,State Store和CLI組成。Impalad與DataNode運行在同一節點上,由Impalad進程表示,它接收客戶端的查詢請求(接收查詢請求的Impalad爲Coordinator,Coordinator通過JNI調用java前端解釋SQL查詢語句,生成查詢計劃樹,再通過調度器把執行計劃分發給具有相應數據的其它Impalad進行執行),讀寫數據,並行執行查詢,並把結果通過網絡流式的傳送回給Coordinator,由Coordinator返回給客戶端。同時Impalad也與State Store保持連接,用於確定哪個Impalad是健康和可以接受新的工作。Impala State Store跟蹤集羣中的Impalad的健康狀態及位置信息,由state-stored進程表示,它通過創建多個線程來處理Impalad的註冊訂閱和與各Impalad保持心跳連接,各Impalad都會緩存一份State Store中的信息,當State Store離線後,因爲Impalad有State Store的緩存仍然可以工作,但會因爲有些Impalad失效了,而已緩存數據無法更新,導致把執行計劃分配給了失效的Impalad,導致查詢失敗。

3.Presto

貢獻者::Facebook

簡介:Facebook開源的數據查詢引擎Presto ,可對250PB以上的數據進行快速地交互式分析。該項目始於 2012 年秋季開始開發,目前該項目已經在超過 1000 名 Facebook 僱員中使用,運行超過 30000 個查詢,每日數據在 1PB 級別。Facebook 稱 Presto 的性能比諸如 Hive 和 Map*Reduce 要好上 10 倍有多。

Presto 當前支持 ANSI SQL 的大多數特效,包括聯合查詢、左右聯接、子查詢以及一些聚合和計算函數;支持近似截然不同的計數(DISTINCT COUNT)等。
在這裏插入圖片描述
和Hive對比
Presto的運行模型與Hive有着本質的區別。Hive將查詢翻譯成多階段的Map-Reduce任務,一個接着一個地運行。每一個任務從磁盤上讀取輸入數據並且將中間結果輸出到磁盤上。然而Presto引擎沒有使用Map-Reduce。它使用了一個定製的查詢執行引擎和響應操作符來支持SQL的語法。除了改進的調度算法之外,所有的數據處理都是在內存中進行的。不同的處理端通過網絡組成處理的流水線。這樣會避免不必要的磁盤讀寫和額外的延遲。這種流水線式的執行模型會在同一時間運行多個數據處理段,一旦數據可用的時候就會將數據從一個處理段傳入到下一個處理段。 這樣的方式會大大的減少各種查詢的端到端響應時間。同時,Presto設計了一個簡單的數據存儲抽象層,來滿足在不同數據存儲系統之上都可以使用SQL進行查詢。存儲連接器目前支持除Hive/HDFS外,還支持HBase、Scribe和定製開發的系統。

更多內容,參考https://zhuanlan.zhihu.com/p/101366898

4.Spark

Spark是UC Berkeley AMP lab所開源的類Hadoop Map-Reduce的通用的並行計算框架,Spark基於Map-Reduce算法實現的分佈式計算,擁有Hadoop Map-Reduce所具有的優點;但不同於Map-Reduce的是Job中間輸出和結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用於數據挖掘與機器學習等需要迭代的Map-Reduce的算法。

與Hadoop的對比,Spark的中間數據放到內存中,對於迭代運算效率更高,因此Spark適用於需要多次操作特定數據集的應用場合。需要反覆操作的次數越多,所需讀取的數據量越大,受益越大,數據量小但是計算密集度較大的場合,受益就相對較小。Spark比Hadoop更通用,Spark提供的數據集操作類型有很多種(map, filter, flatMap, sample, groupByKey, reduceByKey, union, join, cogroup, mapValues, sort,partionBy等),而Hadoop只提供了Map和Reduce兩種操作。Spark可以直接對HDFS進行數據的讀寫,同樣支持Spark on YARN。Spark可以與Map-Reduce運行於同集羣中,共享存儲資源與計算,數據倉庫Shark實現上借用Hive,幾乎與Hive完全兼容。

5.Shark

Shark即Hive on Spark,本質上是通過Hive的HQL解析,把HQL翻譯成Spark上的RDD操作,然後通過Hive的metadata獲取數據庫裏的表信息,實際HDFS上的數據和文件,會由Shark獲取並放到Spark上運算。Shark的特點就是快,完全兼容Hive,且可以在shell模式下使用rdd2sql()這樣的API,把HQL得到的結果集,繼續在scala環境下運算,支持自己編寫簡單的機器學習或簡單分析處理函數,對HQL結果進一步分析計算。
Shark複用了Hive的大部分組件,如下所示:

  1. SQL Parser&Plan generation: Shark完全兼容Hive的HQL語法,而且Shark使用了Hive的API來實現query Parsing和 query Plan generation,僅僅最後的Physical Plan execution階段用Spark代替Hadoop Map-Reduce;

  2. metastore:Shark採用和Hive一樣的meta信息,Hive裏創建的表用Shark可無縫訪問;

  3. SerDe: Shark的序列化機制以及數據類型與Hive完全一致;

  4. UDF: Shark可重用Hive裏的所有UDF。通過配置Shark參數,Shark可以自動在內存中緩存特定的RDD(Resilient Distributed Dataset),實現數據重用,進而加快特定數據集的檢索。同時,Shark通過UDF用戶自定義函數實現特定的數據分析學習算法,使得SQL數據查詢和運算分析能結合在一起,最大化RDD的重複使用;

  5. Driver:Shark在Hive的CliDriver基礎上進行了一個封裝,生成一個SharkCliDriver,這是shark命令的入口;

  6. ThriftServer:Shark在Hive的ThriftServer(支持JDBC/ODBC)基礎上,做了一個封裝,生成了一個SharkServer,也提供JDBC/ODBC服務。

6.Stinger

貢獻者: Hortonworks

簡介: 原叫Tez,下一代Hive,Hortonworks主導開發,運行在YARN上的DAG計算框架。

某些測試下,Stinger能提升10倍左右的性能,同時會讓Hive支持更多的SQL,其主要優點包括:

❶讓用戶在Hadoop獲得更多的查詢匹配。其中包括類似OVER的字句分析功能,支持WHERE查詢,讓Hive的樣式系統更符合SQL模型。

❷優化了Hive請求執行計劃,優化後請求時間減少90%。改動了Hive執行引擎,增加單Hive任務的被秒處理記錄數。

❸在Hive社區中引入了新的列式文件格式(如ORC文件),提供一種更現代、高效和高性能的方式來儲存Hive數據。

❹引入了新的運行時框架——Tez,旨在消除Hive的延時和吞吐量限制。Tez通過消除不必要的task、障礙同步和對HDFS的讀寫作業來優化Hive job。這將優化Hadoop內部的執行鏈,徹底加速Hive負載處理。

7.Apache Drill

貢獻者:MapR

簡介:Apache Drill是是一個能夠對大數據進行交互分析、開源的分佈式系統,且基於Google Dremel實現,它能夠運行在上千個節點的服務器集羣上,且能在幾秒內處理PB級或者萬億條的數據記錄。Drill能夠幫助企業用戶快速、高效地進行Hadoop數據查詢和企業級大數據分析。Drill於2012年8月份由Apache推出。

從Drill官方對其架構的介紹中得知,其具有適於實時的分析和快速的應用開發、適於半結構化/嵌套數據的分析、兼容現有的SQL環境和Apache Hive等特徵。另外,Drill的核心模塊是Drillbit服務,該服務模塊包括遠程訪問子模塊、SQL解析器、查詢優化器、任務計劃執行引擎、存儲插件接口(DFS、HBase、Hive等的接口)、分佈式緩存模塊等幾部分

8.Apache Tajo

簡介:Apache Tajo項目的目的是在HDFS之上構建一個先進的數據倉庫系統。Tajo將自己標榜爲一個“大數據倉庫”,但是它好像和之前介紹的那些低延遲查詢引擎類似。雖然它支持外部表和Hive數據集(通過HCatalog),但是它的重點是數據管理,提供低延遲的數據訪問,以及爲更傳統的ETL提供工具。它也需要在數據節點上部署Tajo特定的工作進程。

Tajo的功能包括:

❶ANSI SQL兼容

❷JDBC 驅動

❸集成Hive metastore能夠訪問Hive數據集

❹一個命令行客戶端

❺一個自定義函數API

9.Phoenix

貢獻者: Salesforce

簡介: 這是一個Java中間層,可以讓開發者在Apache HBase上執行SQL查詢。Phoenix完全使用Java編寫,代碼位於GitHub上,並且提供了一個客戶端可嵌入的JDBC驅動。

Phoenix查詢引擎會將SQL查詢轉換爲一個或多個HBase scan,並編排執行以生成標準的JDBC結果集。直接使用HBase API、協同處理器與自定義過濾器,對於簡單查詢來說,其性能量級是毫秒,對於百萬級別的行數來說,其性能量級是秒。

Phoenix最值得關注的一些特性有:

❶嵌入式的JDBC驅動,實現了大部分的java.sql接口,包括元數據API

❷可以通過多部行鍵或是鍵/值單元對列進行建模

❸完善的查詢支持,可以使用多個謂詞以及優化的掃描鍵

❹DDL支持:通過CREATE TABLE、DROP TABLE及ALTER TABLE來添加/刪除列

❺版本化的模式倉庫:當寫入數據時,快照查詢會使用恰當的模式

❻DML支持:用於逐行插入的UPSERT VALUES、用於相同或不同表之間大量數據傳輸的UPSERT ❼SELECT、用於刪除行的DELETE

❽通過客戶端的批處理實現的有限的事務支持

❾單表——還沒有連接,同時二級索引也在開發當中

➓緊跟ANSI SQL標準

10.Pig

Pig是一種編程語言,它簡化了Hadoop常見的工作任務。Pig可加載數據、表達轉換數據以及存儲最終結果。Pig內置的操作使得半結構化數據變得有意義(如日誌文件)。同時Pig可擴展使用Java中添加的自定義數據類型並支持數據轉換。

Pig最大的作用就是對mapreduce算法(框架)實現了一套shell腳本 ,類似我們通常熟悉的SQL語句,在Pig中稱之爲Pig Latin,在這套腳本中我們可以對加載出來的數據進行排序、過濾、求和、分組(group by)、關聯(Joining),Pig也可以由用戶自定義一些函數對數據集進行操作,也就是傳說中的UDF(user-defined functions)。

性能對比測試

通過對Hive、Impala、Shark、Stinger和Presto的評測和分析,總結如下:

  1. 列存儲一般對查詢性能提升明顯,尤其是大表是一個包含很多列的表。例如,從Stinger(Hive 0.11 with ORCFile)VS Hive,以及Impala的Parquet VS Text file;

  2. 繞開MR計算模型,省去中間結果的持久化和MR任務調度的延遲,會帶來性能提升。例如,Impala,Shark,Presto要好於Hive和Stinger,但這種優勢隨着數據量增加和查詢變複雜而減弱;

  3. 使用MPP數據庫技術對連接查詢有幫助。例如,Impala在兩表,多表連接查詢中優勢明顯;

  4. 充分利用緩存的系統在內存充足的情況下性能優勢明顯。例如,Shark,Impala在小數據量時性能優勢明顯;內存不足時性能下降嚴重,Shark會出現很多問題;

  5. 數據傾斜會嚴重影響一些系統的性能。例如,Hive、Stinger、Shark對數據傾斜比較敏感,容易造成傾斜;Impala受這方面的影響似乎不大;

對於Hive、Impala、Shark、Stinger和Presto這五類開源的分析引擎,在大多數情況下,Imapla的綜合性能是最穩定的,時間性能也是最好的,而且其安裝配置過程也相對容易。其他分別爲Presto、Shark、Stinger和Hive。在內存足夠和非Join操作情況下,Shark的性能是最好的。

總結

對大數據分析的項目來說,技術往往不是最關鍵的,關鍵在於誰的生態系統更強,技術上一時的領先並不足以保證項目的最終成功。對於Hive、Impala、Shark、Stinger和Presto來講,最後哪一款產品會成爲事實上的標準還很難說,但我們唯一可以確定並堅信的一點是,大數據分析將隨着新技術的不斷推陳出新而不斷普及開來,這對用戶永遠都是一件幸事。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章