Hadoop自身的MapReduce計算架構是非常傳統的批量處理模型,對這個模型大多數的應用都是基于Hive,直接使用SQL語句來操作并分析資料,但是在使用過程中,發現其計算的延遲性越來越成為一個顯著的因素。是以,一種能夠增加計算速度的計算模型還是必要的。
為了滿足對于速度的需求,已經有很多基于Hadoop的新的計算架構誕生了,比如Cloudera釋出的Impala,以及Apache Spark等都以記憶體計算架構的形式出現了。期間Facebook繼釋出Hive之後,為了進一步提升計算效率,開發了Presto,并且已經開源。
1. Presto是什麼?
如同Hive一樣,一個分布式的SQL執行引擎,但是它不是基于MapReduce計算模型;它是一個更快的互動式的資料分析工具(根據官方的給出的資料,是較Hive有10倍左右的性能提升),并且能夠處理多種資料源。
2. 系統架構
Presto屬于傳統的主從結構,主要角色有兩個:Coordinator和Worker。使用者通過HTTP協定發送一個查詢請求給Coordinator,Coordinator首先會通過Connector Plugin去找中繼資料(Hive的中繼資料,MySQL的中繼資料等等),以找到對應的表的結構,據此建立一個執行計劃。;然後将任務發送給每個Worker,然後會通過Connector Plugin去讀取相應的資料;然後,Workers在記憶體中運作任務;最後用戶端會從一個Worker上擷取到最終的結果。
Presto(0.76)目前的實作中,支援Cassandra/Hive/JMX/Kafka/MySQL/PostgreSQL等。
3. 部署
Presto與現有的Hadoop叢集基本上是一種松散耦合的關系,更确切的說,它隻與HDFS有聯系,因為Presto需要從中讀取資料。當然,它除了能夠通路HDFS中的資料之外,還有上面提到的各種資料源。
第一步:明确系統的整體結構。在這裡,我們需要确定兩種角色的位置,Coordinator和Worker,Coordinator去指揮衆多的Workers去工作。除此之外,還有一個Discovery Server的角色,它主要是儲存Presto叢集中關于Worker節點的中繼資料,Worker節點會周期性地向Discovery Server報送狀态資訊,而Coordinator安排工作的時候會使用到這些資訊。
第二步:規劃伺服器:
lambda:負責Coordinator和Discovery Server的角色
a00,a01,a02:三台伺服器擔負Worker的角色
第三步:下載下傳程式檔案,到安裝目錄下,并做好連結
第四步:配置Coordinator (lambda)cd /opt/ wget http://central.maven.org/maven2/com/facebook/presto/presto-server/0.76/presto-server-0.76.tar.gz tar xvzf presto-server-0.76.tar.gz ln presto-server-0.76 presto -s
所有的配置檔案都放在etc目錄下。cd /opt/ && mkdir etc
1. 第一個需要建立的檔案是config.properties,它主要包含了一些角色設定的開關:
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
task.max-memory=1GB
discovery-server.enabled=true
discovery.uri=http://lambda:8080
從中我們可以看到,我們将lambda設定成了Coordinator:coordinator=true
我們禁止在Coordinator上運作任務:node-scheduler.include-coordinator=false
本機的PrestoServer所監聽的端口:http-server.http.port=8080
單個任務可以使用的最大的記憶體:task.max-memory=1GB
并且,我們啟用了Discovery Server:discovery-server.enabled=true
最後,我們指定了Discovery Server的位址:discovery.uri=http://lambda:8080
2. JVM啟動參數配置——jvm.config:
-server
-Xmx4G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:PermSize=150M
-XX:MaxPermSize=150M
-XX:ReservedCodeCacheSize=150M
-Xbootclasspath/p:/opt/presto/lib/floatingdecimal-0.1.jar
-Djava.library.path=/usr/lib/hadoop-0.20-mapreduce/lib/native/Linux-amd64-64
需要注意的是最後兩行:
-Xbootclasspath/p:/opt/presto/lib/floatingdecimal-0.1.jar:這會在解析浮點數的時候,提升性能
-Djava.library.path=/usr/lib/hadoop-0.20-mapreduce/lib/native/Linux-amd64-64:這是為了在Presto中支援LZO
3. 配置日志級别——log.properties
com.facebook.presto=INFO
4. 配置與本節點密切相關的一些中繼資料:
node.environment=production
node.id=24a2f667-0395-402d-8521-303050cda031
node.data-dir=/var/presto/data
node.environment=production: 設定環境的名稱,同一叢集中的Presto節點必須有相同的環境名
node.id=24a2f667-0395-402d-8521-303050cda031:節點獨一無二的辨別,Presto服務的重新開機、更新前後,這個值必須一緻。
node.data-dir=/var/presto/data:Presto存儲日志和其它資料的地方。
5. 配置catalog:
mkdir catalog && cd catalog
在其中建立一個Hive的配置:hive.properties,其配置内容為:
connector.name=hive-cdh5
hive.metastore.uri=thrift://gamma:9083
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
connector.name=hive-cdh5: 叢集的版本是CDH5,故我們使用這個插件
hive.metastore.uri=thrift://gamma:9083:這個是Hive中繼資料服務的位址
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml:由于使用了HDFS HA,我們需要指定一下HDFS相關配置檔案。
通過以上的四步,Coordinator已經設定完畢。
下面來設定Workers。其實,所有的配置的目錄結構都是一樣的,隻需要修改上述的兩個檔案就可以達成Workers上的統一配置:
修改第一個檔案:config.properties:
coordinator=false
http-server.http.port=8080
task.max-memory=1GB
discovery.uri=http://lambda:8080
我們看到,作為Worker節點,已經将coordinator禁用掉:coordinator=false;
PrestoServer的監聽位址,還是8080端口;
單任務記憶體數還是1GB;
指向我們的DiscoveryServer:discovery.uri=http://lambda:8080
修改第二個檔案:node.properties
node.environment=production
node.id=c0550bd7-fcc2-407d-bfda-b1f26fb341b0
node.data-dir=/var/presto/data
除了node.id的配置修改外,其它都保持一緻即可,這個ID需要每個節點都不同,是以,這個不能簡單的拷貝到其它Worker節點上,而要在每個節點上都修改成一個獨一無二的值,我這裡是通過uuidgen這個指令來生成的這個串。
4. 添加對LZO的支援:
1. 我們需要在每個Presto節點上的對應的插件目錄下,放置hadoop-lzo.jar檔案,以使其運作時可以加載到相關類:2. JVM啟動參數中,添加如下參數:cd /opt/presto/plugin/hive-cdh5 cp /usr/lib/hadoop/lib/hadoop-lzo.jar .
這樣,HDFS中的LZO檔案就可以正常通路到了。-Djava.library.path=/usr/lib/hadoop-0.20-mapreduce/lib/native/Linux-amd64-64
5. 關于性能的一些測試經驗:
如果不禁止Coordinator上運作任務(node-scheduler.include-coordinator=false),那麼性能的降低也非常明顯。
以上,隻是一些嘗試性的總結和經驗,希望能對有需要的同學有幫助,如果文中有疏漏或者錯誤,也歡迎大家不吝賜教。
關于Presto的有用的資料:
http://prestodb.io/docs/current/installation/deployment.html
http://www.slideshare.net/frsyuki/presto-hadoop-conference-japan-2014