2018年第19周-Presto概念(搭建過程)

原文鏈接:https://segmentfault.com/a/1190000014833443

Presto簡介

不是什麼

雖然Presto可以解析SQL,但它不是一個標準的數據庫。不是MySQL、PostgreSQL或者Oracle的代替品,也不能用來處理在線事務(OLTP)

是什麼

Presto通過使用分佈式查詢,可以快速高效的完成海量數據的查詢。作爲Hive和Pig的替代者,Presto不僅能訪問HDFS,也能訪問不同的數據源,包括:RDBMS和其他數據源(如Cassandra)。

架構

clipboard.png

圖中各個組件的概念及作用會在下文講述。

Presto中SQL運行過程:MapReduce vs Presto

clipboard.png
使用內存計算,減少與硬盤交互。

優點

1.Presto與hive對比,都能夠處理PB級別的海量數據分析,但Presto是基於內存運算,減少沒必要的硬盤IO,所以更快。
2.能夠連接多個數據源,跨數據源連表查,如從hive查詢大量網站訪問記錄,然後從mysql中匹配出設備信息。
3.部署也比hive簡單,因爲hive是基於HDFS的,需要先部署HDFS。

缺點

1.雖然能夠處理PB級別的海量數據分析,但不是代表Presto把PB級別都放在內存中計算的。而是根據場景,如count,avg等聚合運算,是邊讀數據邊計算,再清內存,再讀數據再計算,這種耗的內存並不高。但是連表查,就可能產生大量的臨時數據,因此速度會變慢,反而hive此時會更擅長。  
2.爲了達到實時查詢,可能會想到用它直連MySql來操作查詢,這效率並不會提升,瓶頸依然在MySql,此時還引入網絡瓶頸,所以會比原本直接操作數據庫要慢。

Presto概念

服務器類型(Server Types)

Presto有兩類服務器:coordinator和worker。

Coordinator

Coordinator服務器是用來解析語句,執行計劃分析和管理Presto的worker結點。Presto安裝必須有一個Coordinator和多個worker。如果用於開發環境和測試,則一個Presto實例可以同時擔任這兩個角色。 

Coordinator跟蹤每個work的活動情況並協調查詢語句的執行。 Coordinator爲每個查詢建立模型,模型包含多個stage,每個stage再轉爲task分發到不同的worker上執行。

Coordinator與Worker、client通信是通過REST API。

Worker

Worker是負責執行任務和處理數據。Worker從connector獲取數據。Worker之間會交換中間數據。Coordinator是負責從Worker獲取結果並返回最終結果給client。 

當Worker啓動時,會廣播自己去發現 Coordinator,並告知 Coordinator它是可用,隨時可以接受task。 

Worker與Coordinator、Worker通信是通過REST API。

數據源

貫穿全文,你會看到一些術語:connector、catelog、schema和table。這些是Presto特定的數據源

Connector

Connector是適配器,用於Presto和數據源(如Hive、RDBMS)的連接。你可以認爲類似JDBC那樣,但卻是Presto的SPI的實現,使用標準的API來與不同的數據源交互。  
Presto有幾個內建Connector:JMX的Connector、System Connector(用於訪問內建的System table)、Hive的Connector、TPCH(用於TPC-H基準數據)。還有很多第三方的Connector,所以Presto可以訪問不同數據源的數據。  
每個catalog都有一個特定的Connector。如果你使用catelog配置文件,你會發現每個文件都必須包含connector.name屬性,用於指定catelog管理器(創建特定的Connector使用)。一個或多個catelog用同樣的connector是訪問同樣的數據庫。例如,你有兩個Hive集羣。你可以在一個Presto集羣上配置兩個catelog,兩個catelog都是用Hive Connector,從而達到可以查詢兩個Hive集羣。

Catelog

一個Catelog包含Schema和Connector。例如,你配置JMX的catelog,通過JXM Connector訪問JXM信息。當你執行一條SQL語句時,可以同時運行在多個catelog。 

Presto處理table時,是通過表的完全限定(fully-qualified)名來找到catelog。例如,一個表的權限定名是hive.test_data.test,則test是表名,test_data是schema,hive是catelog。  
Catelog的定義文件是在Presto的配置目錄中。

Schema

Schema是用於組織table。把catelog好schema結合在一起來包含一組的表。當通過Presto訪問hive或Mysq時,一個schema會同時轉爲hive和mysql的同等概念。

Table

Table跟關係型的表定義一樣,但數據和表的映射是交給Connector。

執行查詢的模型(Query Execution Model)

語句(Statement)

Presto執行ANSI兼容的SQL語句。當Presto提起語句時,指的就是ANSI標準的SQL語句,包含着列名、表達式和謂詞。  
之所以要把語句和查詢分開說,是因爲Presto裏,語句知識簡單的文本SQL語句。而當語句執行時,Presto則會創建查詢和分佈式查詢計劃並在Worker上運行。

查詢(Query)

當Presto解析一個語句時,它將其轉換爲一個查詢,並創建一個分佈式查詢計劃(多個互信連接的stage,運行在Worker上)。如果想獲取Presto的查詢情況,則獲取每個組件(正在執行這語句的結點)的快照。  
查詢和語句的區別是,語句是存SQL文本,而查詢是配置和實例化的組件。一個查詢包含:stage、task、split、connector、其他組件和數據源。

Stage

當Presto執行查詢時,會將執行拆分爲有層次結構的stage。例如,從hive中的10億行數據中聚合數據,此時會創建一個用於聚合的根stage,用於聚合其他stage的數據。  
層次結構的stage類似一棵樹。每個查詢都由一個根stage,用於聚合其他stage的數據。stage是Coordinator的分佈式查詢計劃(distributed query plan)的模型,stage不是在worker上運行。

Task

由於stage不是在worker上運行。stage又會被分爲多個task,在不同的work上執行。  
Task是Presto結構裏是“work horse”。一個分佈式查詢計劃會被拆分爲多個stage,並再轉爲task,然後task就運行或處理split。Task有輸入和輸出,一個stage可以分爲多個並行執行的task,一個task可以分爲多個並行執行的driver。

Split

Task運行在split上。split是一個大數據集合中的一塊。分佈式查詢計劃最底層的stage是通過split從connector上獲取數據,分佈式查詢計劃中間層或頂層則是從它們下層的stage獲取數據。 

Presto調度查詢,coordinator跟蹤每個機器運行什麼任務,那些split正在被處理。

Driver

Task包含一個或多個並行的driver。Driver在數據上處理,並生成輸出,然後由Task聚合,最後傳送給stage的其他task。一個driver是Operator的序列。driver是Presto最最低層的並行機制。一個driver有一個輸出和一個輸入。

Operator

Operator消費,傳送和生產數據。如一個Operator從connector中掃表獲取數據,然後生產數據給其他Operator消費。一個過濾Operator消費數據,並應用謂詞,最後生產出子集數據。

Exchange

Exchange在Presto結點的不同stage之間傳送數據。Task生產和消費數據是通過Exchange客戶端。 

參考:https://prestodb.io/docs/curr...

Presto的部署

安裝Presto

1.下載

wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.200/presto-server-0.200.tar.gz

2.解壓

tar -zxvf presto-server-0.200.tar.gz -C /usr/local/

/usr/local/presto-server-0.200則爲安裝目錄,另外Presto還需要數據目錄,數據目錄最好不要在安裝目錄裏面,方便後面Presto的版本升級。

配置Presto

在安裝目錄裏創建etc目錄。這目錄會有以下配置:

  • 結點屬性(Node Properties):每個結點的環境配置
  • JVM配置(JVM Config):Java虛擬機的命令行選項
  • 配置屬性(Config Properties):Persto server的配置
  • Catelog屬性(Catalog Properties):配置Connector(數據源)

結點屬性(Node Properties)

結點屬性文件etc/node.properties,包含每個結點的配置。一個結點是一個Presto實例。這文件一般是在Presto第一次安裝時創建的。以下是最小配置:

node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/presto/data

node.environment: 環境名字,Presto集羣中的結點的環境名字都必須是一樣的。  
node.id: 唯一標識,每個結點的標識都必須是爲一的。就算重啓或升級Presto都必須還保持原來的標識。  
node.data-dir: 數據目錄,Presto用它來保存log和其他數據。

JVM配置(JVM Config)

JVM配置文件etc/jvm.config,包含啓動Java虛擬機時的命令行選項。格式是每一行是一個命令行選項。此文件數據是由shell解析,所以選項中包含空格或特殊字符會被忽略。 

以下是參考配置:

-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError

因爲OutOfMemoryError會導致JVM存在不一致狀態,所以用heap dump來debug,來找出進程爲什麼崩潰的原因。

配置屬性(Config Properties)

配置屬性文件etc/config.properties,包含Presto server的配置。Presto server可以同時爲coordinator和worker,但一個大集羣裏最好就是隻指定一臺機器爲coordinator。  
以下是coordinator的最小配置:

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://example.net:8080

以下是worker的最小配置:

coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery.uri=http://example.net:8080

如果適用於測試目的,需要將一臺機器同時配置爲coordinator和worker,則使用以下配置:

coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=5GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://example.net:8080

coordinator: 是否運行該實例爲coordinator(接受client的查詢和管理查詢執行)。  
node-scheduler.include-coordinator:coordinator是否也作爲work。對於大型集羣來說,在coordinator裏做worker的工作會影響查詢性能。  
http-server.http.port:指定HTTP端口。Presto使用HTTP來與外部和內部進行交流。  
query.max-memory: 查詢能用到的最大總內存
query.max-memory-per-node: 查詢能用到的最大單結點內存  
discovery-server.enabled: Presto使用Discovery服務去找到集羣中的所有結點。每個Presto實例在啓動時都會在Discovery服務裏註冊。這樣可以簡化部署,不需要額外的服務,Presto的coordinator內置一個Discovery服務。也是使用HTTP端口。
discovery.uri: Discovery服務的URI。將example.net:8080替換爲coordinator的host和端口。這個URI不能以斜槓結尾,這個錯誤需特別注意,不然會報404錯誤。 

另外還有以下屬性:
jmx.rmiregistry.port: 指定JMX RMI的註冊。JMX client可以連接此端口
jmx.rmiserver.port: 指定JXM RMI的服務器。可通過JMX監聽。 

詳情請查看Resource Groups

Catelog屬性(Catalog Properties)

Presto通過connector訪問數據。而connector是掛載(mount)在catelog中。connector支持catelog裏所有的schema和table。舉個例子,Hive connector映射每個Hive數據庫到schema,因此Hive connector掛載在hive catelog(所以可以把catelog理解爲目錄,掛載),而且Hive包含table clicks在數據庫web,所以這個table在Presto是hive.web.clicks。  
Catalog的註冊是通過etc/catalog目錄下的catalog屬性文件。例如,創建etc/catalog/jmx.properties,將jmxconnector掛載在jmx catelog:

connector.name=jmx

查看Connectors查看更多信息。

運行Presto

啓動命令:

bin/launcher start

日誌在val/log目錄下:  
launcher.log: 記錄服務初始化情況和一些JVM的診斷。  
server.log: Presto的主要日誌文件。會自動被壓縮。  
http-request.log: 記錄HTTP請求。會自動被壓縮。

運行Presto命令行界面

1.下載 presto-cli-0.200-executable.jar,
2.修改名字 presto-cli-0.200-executable.jar爲 presto
3.修改執行權限chmod +x
4.運行

./presto --server localhost:8080 --catalog hive --schema default
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章