近實時運算的利器---presto在公司實踐


1.起因

公司hadoop集群里的datanonde和tasktracker節點負載主要集中於晚上到凌晨,平日工作時間負載不是很高。但在工作時間內,公司業務人員有實時查詢需求,現在主要

借助於hive提供業務人員日常查詢。總所周知,hive是一個基於MR的類SQL查詢工具,它會把輸入的查詢SQL解釋為MapReduce,能極大的降低使用大數據查詢的門檻,

讓一般的業務人員也可以直接對大數據進行查詢。但一個弊病也是很明顯,它的查詢速度由於基於MR,會是非常的讓人着急。

 

 

在Spark,Storm橫行的時代,spark由於耗用內存高而很難滿足這種改良的需求,Storm由於和hive不是一個套路,本身實時流處理的思路也和我們的需求差距較大,所以,

尋求一個能提供類似SQL查詢接口,並且速度比較接近於實時,能利用現有集群硬件的實時SQL查詢引擎成為一個現有hive的替代查詢引擎。如果有這個引擎,可以利用

datanode,tasktracker上空閑的內存構成一個分布式的“數據加載內存池”,將數據加載到內存后,再進行計算,這樣無疑會提高大數據查詢的速度。

幸好,創造了hive的facebook,不負眾望,創造了這么一款神器---presto。下面我們來看presto能給我們帶來什么。

 

 

插圖:日常各個dn和tt的節點的內存使用情況,白天有比較多的空閑時段

2.presto的介紹

英文出處:Martin Traverso(Facebook)

 

Presto是一個分布式SQL查詢引擎, 它被設計為用來專門進行高速、實時的數據分析。它支持標准的ANSI SQL,包括復雜查詢、聚合(aggregation)、連接(join)和窗口函數(window functions)。

 

Presto的運行模型和Hive或MapReduce有着本質的區別。Hive將查詢翻譯成多階段的MapReduce任務, 一個接着一個地運行。 每一個任務從磁盤上讀取輸入數據並且將中間結果輸出到磁盤上。 然而Presto引擎沒有使用MapReduce。它使用了一個定制的查詢和執行引擎和響應的操作符來支持SQL的語法。除了改進的調度算法之外, 所有的數據處理都是在內存中進行的。 不同的處理端通過網絡組成處理的流水線。 這樣會避免不必要的磁盤讀寫和額外的延遲。 這種流水線式的執行模型會在同一時間運行多個數據處理段, 一旦數據可用的時候就會將數據從一個處理段傳入到下一個處理段。 這樣的方式會大大的減少各種查詢的端到端響應時間。

 

3.presto部署

首先安裝jdk 1.8,下載jdk 1.8后,解壓

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. tar zxf jdk1.8.0_45.tar.gz  


設置1.8為默認的jdk

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. rm /usr/java/latest  
  2. ln -s /usr/java/jdk1.8.0_45 /usr/java/latest  

 

在/etc/profile里設置

 

export JAVA_HOME=/usr/java/default

然后運行:

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. source /etc/profile  

生效設置。

 

下載presto。

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.100/presto-server-0.100.tar.gz  


解壓presto

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. tar zxf presto-server-0.100.tar.gz  


由於presto有個調度節點和工作節點的區別,所以,我們先配置調度節點。可以在部署后,就用單節點模式,即調度和工作節點為同一台服務器來進行測試。

 

首先配置etc/catalog/hive.properties

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. connector.name=hive-hadoop2  
  2. hive.metastore.uri=thrift://192.168.1.xxx:10001  
  3. hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml  

說明:

 

connector.name是當前集群是hadoop版本,有hadoop1,hadoop2,cdh4,cdh5等可選,詳細可以參考plugin目錄里支持類型。

hive.metasore.uri是對應hive數據源提供的thrift接口,不然presto怎么有元數據呢?

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. hive.config.resources是對應hadoop配置。  

 

 

然后配置:etc/node.properties

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. node.environment=production  
  2. node.id=ffffffff-ffff-ffff-ffff-ffffffffffffnode-103-15  
  3. node.data-dir=/opt/presto/data  

 

重要的,每個節點都有自己唯一id,不然不好協同工作了。

 

所以,node.id一定是一個唯一的id

node.data-dir是本機的一個presto數據文件目錄。

最后配置:etc/config.properties

coordinator=true

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. node-scheduler.include-coordinator=true  
  2. http-server.http.port=1089  
  3. task.max-memory=1GB  
  4. discovery-server.enabled=true  
  5. discovery.uri=http://node-103-15:1089  

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. http-server.http.port指明調度節點的端口,很重要啊,presto集群的機器都得和這個端口通訊。  
[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. discovery.uri=http://node-103-15:1089 也很重要,調度節點的地址,端口,好好指定,集群唯一的。  

 

 

4.遇到問題解決

首先遇到問題就是jdk的兼容,由於presto只兼容1.8以上jdk,以前hadoop的1.6,1.7都不行。

所以要將presto部署好,勢必和以前hadoop環境的jdk有沖突。所以,干脆將系統jdk升級到1.8.

然后stop tasktracker,stop datanode,最后又重啟datanode,tasktracker.最后啟動presto.

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. ./launcher start  


最后啟動presto cli進行查詢

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. ./presto-cli  --server node-103-15:1089 --catalog hive --schema default  


注意,presto-cli是將presto-cli-excute.jar進行重命名,並且chmod后而來的。

 

最后比較尷尬的是,presto對lzo支持不好,特別是分片的lzo,基本就不支持,這個沒辦法,presto本身就講明了

不支持。哎,哪位有辦法,可以聯系下我。

 

5.presto和hive的性能比較

用同一個SQL做查詢,3台服務器presto是:

 

 

采用hive查詢是:

 

 

基本上查詢速度快了10倍。

綜上所述,presto是一個部署容易,又能較好利用空閑內存的近實時查詢引擎。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM