近實(shí)時(shí)運(yùn)算的利器---presto在公司實(shí)踐 - joomlaer的專欄 - 博客頻道 - CSDN.NET
http://blog.csdn.net/joomlaer/article/details/45889759
1.起因
公司Hadoop集群里的datanonde和tasktracker節(jié)點(diǎn)負(fù)載主要集中于晚上到凌晨,平日工作時(shí)間負(fù)載不是很高。但在工作時(shí)間內(nèi),公司業(yè)務(wù)人員有實(shí)時(shí)查詢需求,現(xiàn)在主要
借助于Hive提供業(yè)務(wù)人員日常查詢。總所周知,hive是一個(gè)基于MR的類SQL查詢工具,它會(huì)把輸入的查詢SQL解釋為MapReduce,能極大的降低使用大數(shù)據(jù)查詢的門檻,
讓一般的業(yè)務(wù)人員也可以直接對(duì)大數(shù)據(jù)進(jìn)行查詢。但一個(gè)弊病也是很明顯,它的查詢速度由于基于MR,會(huì)是非常的讓人著急。
在Spark,Storm橫行的時(shí)代,spark由于耗用內(nèi)存高而很難滿足這種改良的需求,Storm由于和hive不是一個(gè)套路,本身實(shí)時(shí)流處理的思路也和我們的需求差距較大,所以,
尋求一個(gè)能提供類似SQL查詢接口,并且速度比較接近于實(shí)時(shí),能利用現(xiàn)有集群硬件的實(shí)時(shí)SQL查詢引擎成為一個(gè)現(xiàn)有hive的替代查詢引擎。如果有這個(gè)引擎,可以利用
datanode,tasktracker上空閑的內(nèi)存構(gòu)成一個(gè)分布式的“數(shù)據(jù)加載內(nèi)存池”,將數(shù)據(jù)加載到內(nèi)存后,再進(jìn)行計(jì)算,這樣無疑會(huì)提高大數(shù)據(jù)查詢的速度。
幸好,創(chuàng)造了hive的facebook,不負(fù)眾望,創(chuàng)造了這么一款神器---presto。下面我們來看presto能給我們帶來什么。
插圖:日常各個(gè)dn和tt的節(jié)點(diǎn)的內(nèi)存使用情況,白天有比較多的空閑時(shí)段
2.presto的介紹
英文出處:Martin Traverso(Facebook)。
Presto是一個(gè)分布式SQL查詢引擎, 它被設(shè)計(jì)為用來專門進(jìn)行高速、實(shí)時(shí)的數(shù)據(jù)分析。它支持標(biāo)準(zhǔn)的ANSI SQL,包括復(fù)雜查詢、聚合(aggregation)、連接(join)和窗口函數(shù)(window functions)。
Presto的運(yùn)行模型和Hive或MapReduce有著本質(zhì)的區(qū)別。Hive將查詢翻譯成多階段的MapReduce任務(wù), 一個(gè)接著一個(gè)地運(yùn)行。 每一個(gè)任務(wù)從磁盤上讀取輸入數(shù)據(jù)并且將中間結(jié)果輸出到磁盤上。 然而Presto引擎沒有使用MapReduce。它使用了一個(gè)定制的查詢和執(zhí)行引擎和響應(yīng)的操作符來支持SQL的語法。除了改進(jìn)的調(diào)度算法之外, 所有的數(shù)據(jù)處理都是在內(nèi)存中進(jìn)行的。 不同的處理端通過網(wǎng)絡(luò)組成處理的流水線。 這樣會(huì)避免不必要的磁盤讀寫和額外的延遲。 這種流水線式的執(zhí)行模型會(huì)在同一時(shí)間運(yùn)行多個(gè)數(shù)據(jù)處理段, 一旦數(shù)據(jù)可用的時(shí)候就會(huì)將數(shù)據(jù)從一個(gè)處理段傳入到下一個(gè)處理段。 這樣的方式會(huì)大大的減少各種查詢的端到端響應(yīng)時(shí)間。
3.presto部署
首先安裝jdk 1.8,下載jdk 1.8后,解壓
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
tar zxf jdk1.8.0_45.tar.gz
設(shè)置1.8為默認(rèn)的jdk
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
rm /usr/java/latest
ln -s /usr/java/jdk1.8.0_45 /usr/java/latest
在/etc/profile里設(shè)置
export JAVA_HOME=/usr/Java/default
然后運(yùn)行:
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
source /etc/profile
生效設(shè)置。
下載presto。
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
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上查看代碼片派生到我的代碼片
tar zxf presto-server-0.100.tar.gz
由于presto有個(gè)調(diào)度節(jié)點(diǎn)和工作節(jié)點(diǎn)的區(qū)別,所以,我們先配置調(diào)度節(jié)點(diǎn)。可以在部署后,就用單節(jié)點(diǎn)模式,即調(diào)度和工作節(jié)點(diǎn)為同一臺(tái)服務(wù)器來進(jìn)行測(cè)試。
首先配置etc/catalog/hive.properties
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
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是當(dāng)前集群是hadoop版本,有hadoop1,hadoop2,cdh4,cdh5等可選,詳細(xì)可以參考plugin目錄里支持類型。
hive.metasore.uri是對(duì)應(yīng)hive數(shù)據(jù)源提供的thrift接口,不然presto怎么有元數(shù)據(jù)呢?
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
hive.config.resources是對(duì)應(yīng)hadoop配置。
然后配置:etc/node.properties
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffffnode-103-15
node.data-dir=/opt/presto/data
重要的,每個(gè)節(jié)點(diǎn)都有自己唯一id,不然不好協(xié)同工作了。
所以,node.id一定是一個(gè)唯一的id
node.data-dir是本機(jī)的一個(gè)presto數(shù)據(jù)文件目錄。
最后配置:etc/config.properties
coordinator=true
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
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
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
http-server.http.port指明調(diào)度節(jié)點(diǎn)的端口,很重要啊,presto集群的機(jī)器都得和這個(gè)端口通訊。
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
discovery.uri=http://node-103-15:1089 也很重要,調(diào)度節(jié)點(diǎn)的地址,端口,好好指定,集群唯一的。
4.遇到問題解決
首先遇到問題就是jdk的兼容,由于presto只兼容1.8以上jdk,以前hadoop的1.6,1.7都不行。
所以要將presto部署好,勢(shì)必和以前hadoop環(huán)境的jdk有沖突。所以,干脆將系統(tǒng)jdk升級(jí)到1.8.
然后stop tasktracker,stop datanode,最后又重啟datanode,tasktracker.最后啟動(dòng)presto.
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
./launcher start
最后啟動(dòng)presto cli進(jìn)行查詢
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
./presto-cli --server node-103-15:1089 --catalog hive --schema default
注意,presto-cli是將presto-cli-excute.jar進(jìn)行重命名,并且chmod后而來的。
最后比較尷尬的是,presto對(duì)lzo支持不好,特別是分片的lzo,基本就不支持,這個(gè)沒辦法,presto本身就講明了
不支持。哎,哪位有辦法,可以聯(lián)系下我。
5.presto和hive的性能比較
用同一個(gè)SQL做查詢,3臺(tái)服務(wù)器presto是:
采用hive查詢是:
基本上查詢速度快了10倍。
綜上所述,presto是一個(gè)部署容易,又能較好利用空閑內(nèi)存的近實(shí)時(shí)查詢引擎。