天天看點

另一種擴充并加速Hadoop計算能力的計算架構—Presto

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的角色

第三步:下載下傳程式檔案,到安裝目錄下,并做好連結

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
           
第四步:配置Coordinator (lambda)
cd /opt/ && mkdir etc
           
所有的配置檔案都放在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檔案,以使其運作時可以加載到相關類:
cd /opt/presto/plugin/hive-cdh5
cp /usr/lib/hadoop/lib/hadoop-lzo.jar .
           
2. JVM啟動參數中,添加如下參數:
-Djava.library.path=/usr/lib/hadoop-0.20-mapreduce/lib/native/Linux-amd64-64
           
這樣,HDFS中的LZO檔案就可以正常通路到了。

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

繼續閱讀