一、Presto
Presto是Facebook開源的,完全基於內存的並⾏計算,分布式SQL交互式查詢引擎是它被設計用來專門處理高速,實時的數據分析。Presto本身不存儲數據,但是可以接入多種數據源,並且支持跨數據源的級聯查詢。
與MySQL對比:MySQL首先是一個單點關系型數據庫,其具有存儲和計算分析能力,而Presto只有計算分析能力;在數據量方面,MySQL不能滿足當前大數據量的分析需求,在這樣的背景下,Facebook開發出Presto這樣一個可以滿足大數據量分析需求的工具。
Presto只有計算分析能力但可以連接多種數據源,包括Hive,Oracle,MySQL,Kafka,MongoDB,Redis等,並且可以將多個不同數據源進行聯合分析。可以通過show catalogs 命令看到Presto連接的所有數據源。
Presto是一個低延遲高並發的內存計算引擎,相比Hive,執行效率要高很多。
擅長:
1、 輕量快速,支持近乎實時的查詢
2、Facebook內部廣泛使用,有好的擴展性和穩定性
3、和impala同樣使用分布式查詢引擎,和傳統的Mapreduce相比,消除了延遲和磁盤IO開銷
4、有完善的文檔
二、Hive
Apache Hive數據倉庫軟件可以使用SQL方便地閱讀、編寫和管理分布在分布式存儲中的大型數據集。結構可以投射到已經存儲的數據上。提供了一個命令行工具和JDBC驅動程序來將用戶連接到Hive。Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
Hive是建立在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的用戶查詢數據。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的復雜的分析工作。
Hive 沒有專門的數據格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允許用戶指定數據格式
Hive執行HQL語句有以下三種方式:
1:直接命令行執行SQL語句:hive -e "select from table…
2:執行HQL文件中的語句:hive -f temp.hql
3:打開調試模式:hive --hiveconf
優點:
運行在Mapreduce框架之上,非常好的支持用戶自定義函數,可以方便的和hbase等系統結合使用。
缺點:
擁有MapReduce所有缺點,包含昂貴的Shuffle操作和磁盤IO操作,不支持多個reduce操作group by和order by查詢,對比相關競品查詢速度較慢
三、Spark SQL
SparkSQL的前身是Shark,給熟悉RDBMS但又不理解MapReduce的技術人員提供快速上手的工具,我們上面提到,Hive是基於hadoop之上的一個開源的工具,提供的就是類似於SQL的一種HQL語言,它的好處就是可以直接把你的SQL語句轉換成mapreduce作業,然后提交在集群上運行,好處就是我們不需要基於mapreduce的api進行編程,只需要寫SQL語句就能完成大數據的統計和分析。
在上面我們提到,Hive是把SQL翻譯成MapReduce作業,所以底層還是基於MapReduce,那么MapReduce框架的缺點就是效率太低,那么這樣的話我們Hive的效率肯定不會高,對於批處理的作業Hive進行實現的話,如果很大的話,耗時會很時間,甚至十幾個小時。
那么如何改進呢?
方法就是換掉底層的執行引擎,后來就產生的TEZ還有Spark這些底層的執行引擎,也就是說Hive可以跑在TEZ、SPARK上面。 后來慢慢發展就推出了Spark,Spark是一個基於內存的分布式計算框架,他的執行效率比MapReduce提高了很多!
Spark SQL的一大用處就是執行SQL查詢語句,Spark SQL也可以用來從Hive中讀取數據,當我們使用其它編程語言來運行一個SQL語句,結果返回的是一個Dataset或者DataFrame,可以使用命令行,JDBC或者ODBC的方式來與SQL進行交互。
四、三者對比
Hive是一個數據倉庫,是一個交互式比較弱一點的查詢引擎,交互式沒有presto那么強,而且只能訪問hdfs的數據;
Presto是一個交互式查詢引擎,可以在很短的時間內返回查詢結果,秒級,分鍾級,能訪問很多數據源;
Hive在查詢100Gb級別的數據時,消耗時間已經是分鍾級了;但是Presto是取代不了Hive的,因為Presto全部的數據都是在內存中,限制了在內存中的數據集大小,比如多個大表的join,這些大表是不能完全放進內存的,實際應用中,對於在Presto的查詢是有一定規定條件的,比如說一個查詢在Presto查詢超過30分鍾(此時適合在SparkSQL運行),那就kill掉吧,說明不適合在Presto上使用,主要原因是,查詢過大的話,會占用整個集群的資源,這會導致你后續的查詢是沒有資源進行查詢的,這跟Presto的設計理念是沖突的,就像是你進行一個查詢,但是要等個5分鍾才有資源繼續查詢,這是很不合理的,交互式就變得弱了很多。
因此 ,在數據源的級聯查詢時,用Presto寫SQL語句進行查詢。在進行簡單的數據查詢時,可以用HQL進行建表,查詢,關聯等。當數據量較大時,可用SparkSQL進行建表,查詢,關聯等。