一、什么是Presto?
- 背景知識:Hive的缺點和Presto的背景
Hive使用MapReduce作為底層計算框架,是專為批處理設(shè)計的。但隨著數(shù)據(jù)越來越多,使用Hive進行一個簡單的數(shù)據(jù)查詢可能要花費幾分到幾小時,顯然不能滿足交互式查詢的需求。Presto是一個分布式SQL查詢引擎,它被設(shè)計為用來專門進行高速、實時的數(shù)據(jù)分析。它支持標準的ANSI SQL,包括復(fù)雜查詢、聚合(aggregation)、連接(join)和窗口函數(shù)(window functions)。這其中有兩點就值得探究,首先是架構(gòu),其次自然是怎么做到低延遲來支持及時交互。
- PRESTO是什么?
Presto是一個開源的分布式SQL查詢引擎,適用于交互式分析查詢,數(shù)據(jù)量支持GB到PB字節(jié)。Presto的設(shè)計和編寫完全是為了解決像Facebook這樣規(guī)模的商業(yè)數(shù)據(jù)倉庫的交互式分析和處理速度的問題。
- 它可以做什么?
Presto支持在線數(shù)據(jù)查詢,包括Hive, Cassandra, 關(guān)系數(shù)據(jù)庫以及專有數(shù)據(jù)存儲。 一條Presto查詢可以將多個數(shù)據(jù)源的數(shù)據(jù)進行合并,可以跨越整個組織進行分析。Presto以分析師的需求作為目標,他們期望響應(yīng)時間小于1秒到幾分鐘。 Presto終結(jié)了數(shù)據(jù)分析的兩難選擇,要么使用速度快的昂貴的商業(yè)方案,要么使用消耗大量硬件的慢速的“免費”方案。
- 誰在使用它?
Facebook使用Presto進行交互式查詢,用于多個內(nèi)部數(shù)據(jù)存儲,包括300PB的數(shù)據(jù)倉庫。 每天有1000多名Facebook員工使用Presto,執(zhí)行查詢次數(shù)超過30000次,掃描數(shù)據(jù)總量超過1PB。領(lǐng)先的互聯(lián)網(wǎng)公司包括Airbnb和Dropbox都在使用Presto。
二、Presto的體系架構(gòu)
Presto是一個運行在多臺服務(wù)器上的分布式系統(tǒng)。 完整安裝包括一個coordinator和多個worker。 由客戶端提交查詢,從Presto命令行CLI提交到coordinator。 coordinator進行解析,分析并執(zhí)行查詢計劃,然后分發(fā)處理隊列到worker。
Presto查詢引擎是一個Master-Slave的架構(gòu),由一個Coordinator節(jié)點,一個Discovery Server節(jié)點,多個Worker節(jié)點組成,Discovery Server通常內(nèi)嵌于Coordinator節(jié)點中。Coordinator負責解析SQL語句,生成執(zhí)行計劃,分發(fā)執(zhí)行任務(wù)給Worker節(jié)點執(zhí)行。Worker節(jié)點負責實際執(zhí)行查詢?nèi)蝿?wù)。Worker節(jié)點啟動后向Discovery Server服務(wù)注冊,Coordinator從Discovery Server獲得可以正常工作的Worker節(jié)點。如果配置了Hive Connector,需要配置一個Hive MetaStore服務(wù)為Presto提供Hive元信息,Worker節(jié)點與HDFS交互讀取數(shù)據(jù)。
三、安裝Presto Server
- 安裝介質(zhì)
presto-cli-0.217-executable.jarpresto-server-0.217.tar.gz
- 安裝配置Presto Server
1、解壓安裝包
tar -zxvf presto-server-0.217.tar.gz -C ~/training/
2、創(chuàng)建etc目錄
cd ~/training/presto-server-0.217/mkdir etc
3、需要在etc目錄下包含以下配置文件
Node Properties: 節(jié)點的配置信息JVM Config: 命令行工具的JVM配置參數(shù)Config Properties: Presto Server的配置參數(shù)Catalog Properties: 數(shù)據(jù)源(Connectors)的配置參數(shù)Log Properties:日志參數(shù)配置
- 編輯node.properties
#集群名稱。所有在同一個集群中的Presto節(jié)點必須擁有相同的集群名稱。node.environment=production #每個Presto節(jié)點的唯一標示。每個節(jié)點的node.id都必須是唯一的。在Presto進行重啟或者升級過程中每個節(jié)點的node.id必須保持不變。如果在一個節(jié)點上安裝多個Presto實例(例如:在同一臺機器上安裝多個Presto節(jié)點),那么每個Presto節(jié)點必須擁有唯一的node.id。node.id=ffffffff-ffff-ffff-ffff-ffffffffffff # 數(shù)據(jù)存儲目錄的位置(操作系統(tǒng)上的路徑)。Presto將會把日期和數(shù)據(jù)存儲在這個目錄下。node.data-dir=/root/training/presto-server-0.217/data
- 編輯jvm.config
由于OutOfMemoryError將會導(dǎo)致JVM處于不一致狀態(tài),所以遇到這種錯誤的時候我們一般的處理措施就是收集dump headp中的信息(用于debugging),然后強制終止進程。Presto會將查詢編譯成字節(jié)碼文件,因此Presto會生成很多class,因此我們我們應(yīng)該增大Perm區(qū)的大?。ㄔ赑erm中主要存儲class)并且要允許Jvm class unloading。
-server-Xmx16G-XX:+UseG1GC-XX:G1HeapRegionSize=32M-XX:+UseGCOverheadLimit-XX:+ExplicitGCInvokesConcurrent-XX:+HeapDumpOnOutOfMemoryError-XX:+ExitOnOutOfMemoryError
- 編輯config.properties
coordinator的配置
coordinator=truenode-scheduler.include-coordinator=falsehttp-server.http.port=8080query.max-memory=5GBquery.max-memory-per-node=1GBquery.max-total-memory-per-node=2GBdiscovery-server.enabled=truediscovery.uri=http://192.168.157.226:8080
workers的配置
coordinator=falsehttp-server.http.port=8080query.max-memory=5GBquery.max-memory-per-node=1GBquery.max-total-memory-per-node=2GBdiscovery.uri=http://192.168.157.226:8080
如果我們想在單機上進行測試,同時配置coordinator和worker,請使用下面的配置:
coordinator=truenode-scheduler.include-coordinator=truehttp-server.http.port=8080query.max-memory=5GBquery.max-memory-per-node=1GBquery.max-total-memory-per-node=2GBdiscovery-server.enabled=truediscovery.uri=http://192.168.157.226:8080
參數(shù)說明:
- 編輯log.properties
配置日志級別。
com.facebook.presto=INFO
- 配置Catalog Properties
Presto通過connectors訪問數(shù)據(jù)。這些connectors掛載在catalogs上。 connector可以提供一個catalog中所有的schema和表。例如:Hive connector 將每個hive的database都映射成為一個schema,所以如果hive connector掛載到了名為hive的catalog, 并且在hive的web有一張名為clicks的表, 那么在Presto中可以通過hive.web.clicks來訪問這張表。通過在etc/catalog目錄下創(chuàng)建catalog屬性文件來完成catalogs的注冊。 如果要創(chuàng)建hive數(shù)據(jù)源的連接器,可以創(chuàng)建一個etc/catalog/hive.properties文件,文件中的內(nèi)容如下,完成在hivecatalog上掛載一個hiveconnector。
#注明hadoop的版本connector.name=hive-hadoop2 #hive-site中配置的地址hive.metastore.uri=thrift://192.168.157.226:9083 #hadoop的配置文件路徑hive.config.resources=/root/training/hadoop-2.7.3/etc/hadoop/core-site.xml,/root/training/hadoop-2.7.3/etc/hadoop/hdfs-site.xml
注意:要訪問Hive的話,需要將Hive的MetaStore啟動:hive --service metastore
四、啟動Presto Server
./launcher start
五、運行presto-cli
- 下載:presto-cli-0.217-executable.jar
- 重命名jar包,并增加執(zhí)行權(quán)限
cp presto-cli-0.217-executable.jar presto chmod a+x presto
- 連接Presto Server
./presto --server localhost:8080 --catalog hive --schema default
六、使用Presto
- 使用Presto操作Hive
- 使用Presto的Web Console:端口:8080
- 使用JDBC操作Presto
1、需要包含的Maven依賴
com.facebook.prestopresto-jdbc0.217
2、JDBC代碼