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后,解壓
- tar zxf jdk1.8.0_45.tar.gz
設置1.8為默認的jdk
- rm /usr/java/latest
- ln -s /usr/java/jdk1.8.0_45 /usr/java/latest
在/etc/profile里設置
export JAVA_HOME=/usr/java/default
然后運行:
- source /etc/profile
生效設置。
下載presto。
- wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.100/presto-server-0.100.tar.gz
解壓presto
- tar zxf presto-server-0.100.tar.gz
由於presto有個調度節點和工作節點的區別,所以,我們先配置調度節點。可以在部署后,就用單節點模式,即調度和工作節點為同一台服務器來進行測試。
首先配置etc/catalog/hive.properties
- connector.name=hive-hadoop2
- hive.metastore.uri=thrift://192.168.1.xxx:10001
- 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怎么有元數據呢?
- hive.config.resources是對應hadoop配置。
然后配置:etc/node.properties
- node.environment=production
- node.id=ffffffff-ffff-ffff-ffff-ffffffffffffnode-103-15
- node.data-dir=/opt/presto/data
重要的,每個節點都有自己唯一id,不然不好協同工作了。
所以,node.id一定是一個唯一的id
node.data-dir是本機的一個presto數據文件目錄。
最后配置:etc/config.properties
coordinator=true
- node-scheduler.include-coordinator=true
- http-server.http.port=1089
- task.max-memory=1GB
- discovery-server.enabled=true
- discovery.uri=http://node-103-15:1089
- http-server.http.port指明調度節點的端口,很重要啊,presto集群的機器都得和這個端口通訊。
- 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.
- ./launcher start
最后啟動presto cli進行查詢
- ./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是一個部署容易,又能較好利用空閑內存的近實時查詢引擎。