Presto實戰


一、Presto簡介

1、PRESTO是什么?

Presto是一個開源的分布式SQL查詢引擎,適用於交互式分析查詢,數據量支持GB到PB字節。

Presto的設計和編寫完全是為了解決像Facebook這樣規模的商業數據倉庫的交互式分析和處理速度的問題。

2、它可以做什么?

Presto支持在線數據查詢,包括Hive, Cassandra, 關系數據庫以及專有數據存儲。一條Presto查詢可以將多個數據源的數據進行合並,可以跨越整個組織進行分析。

Presto以分析師的需求作為目標,他們期望響應時間小於1秒到幾分鍾。 Presto終結了數據分析的兩難選擇,要么使用速度快的昂貴的商業方案,要么使用消耗大量硬件的慢速的“免費”方案。

3、介紹

Presto是一個運行在多台服務器上的分布式系統。 完整安裝包括一個coordinator和多個worker。 由客戶端提交查詢,從Presto命令行CLI提交到coordinator。 coordinator進行解析,分析並執行查詢計划,然后分發處理隊列到worker。

clip_image002

4、需求

Presto的基本需求

Linux or Mac OS X

Java 8, 64-bit

Python 2.4+

5、連接器

Presto支持插接式連接器提供的數據。 各連接器的設計需求會有所不同。

HADOOP / HIVE

Presto支持從以下版本的Hadoop中讀取Hive數據:

Apache Hadoop 1.x

Apache Hadoop 2.x

Cloudera CDH 4

Cloudera CDH 5

支持以下文件類型:Text, SequenceFile, RCFile, ORC

此外,需要有遠程的Hive元數據。 不支持本地或嵌入模式。 Presto不使用MapReduce,只需要HDFS。

二、Presto安裝部署

1、下載presto tar包:

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

2、將下載的presto tar包通過ftp工具上傳到linux服務器上,然后解壓安裝文件。

tar -zxvf presto-server-0.189.tar.gz -C /opt/cdh-5.3.6/

chown -R hadoop:hadoop /opt/cdh-5.3.6/presto-server-0.189/

3、配置presto

分別執行以下步驟:

在安裝目錄中創建一個etc目錄。 在這個etc目錄中放入以下配置信息:

l 節點屬性:每個節點的環境配置信息

l JVM 配置:JVM的命令行選項

l 配置屬性:Presto server的配置信息

l Catalog屬性:configuration forConnectors(數據源)的配置信息

1)Node Properties

節點屬性配置文件:etc/node.properties包含針對於每個節點的特定的配置信息。 一個節點就是在一台機器上安裝的Presto實例。 這份配置文件一般情況下是在Presto第一次安裝的時候,由部署系統創建的。 一個etc/node.properties配置文件至少包含如下配置信息:

node.environment=production

node.id=ffffffff-ffff-ffff-ffff-ffffffffffff

node.data-dir=/var/presto/data

針對上面的配置信息描述如下:

node.environment: 集群名稱。所有在同一個集群中的Presto節點必須擁有相同的集群名稱。

node.id: 每個Presto節點的唯一標示。每個節點的node.id都必須是唯一的。在Presto進行重啟或者升級過程中每個節點的node.id必須保持不變。如果在一個節點上安裝多個Presto實例(例如:在同一台機器上安裝多個Presto節點),那么每個Presto節點必須擁有唯一的node.id。

node.data-dir: 數據存儲目錄的位置(操作系統上的路徑)。Presto將會把日期和數據存儲在這個目錄下。

2)JVM配置

JVM配置文件,etc/jvm.config, 包含一系列在啟動JVM的時候需要使用的命令行選項。這份配置文件的格式是:一系列的選項,每行配置一個單獨的選項。由於這些選項不在shell命令中使用。 因此即使將每個選項通過空格或者其他的分隔符分開,java程序也不會將這些選項分開,而是作為一個命令行選項處理。(就想下面例子中的OnOutOfMemoryError選項)。

一個典型的etc/jvm.config配置文件如下:

-server

-Xmx16G

-XX:+UseG1GC

-XX:G1HeapRegionSize=32M

-XX:+UseGCOverheadLimit

-XX:+ExplicitGCInvokesConcurrent

-XX:+HeapDumpOnOutOfMemoryError

-XX:+ExitOnOutOfMemoryError

由於OutOfMemoryError將會導致JVM處於不一致狀態,所以遇到這種錯誤的時候我們一般的處理措施就是將dump headp中的信息(用於debugging),然后強制終止進程。

Presto會將查詢編譯成字節碼文件,因此Presto會生成很多class,因此我們我們應該增大Perm區的大小(在Perm中主要存儲class)並且要允許Jvm class unloading。

3)Config Properties

Presto的配置文件:etc/config.properties包含了Presto server的所有配置信息。 每個Presto server既是一個coordinator也是一個worker。 但是在大型集群中,處於性能考慮,建議單獨用一台機器作為 coordinator。

一個coordinator的etc/config.properties應該至少包含以下信息:

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:指定是否運維Presto實例作為一個coordinator(接收來自客戶端的查詢情切管理每個查詢的執行過程)。

node-scheduler.include-coordinator:是否允許在coordinator服務中進行調度工作。對於大型的集群,在一個節點上的Presto server即作為coordinator又作為worke將會降低查詢性能。因為如果一個服務器作為worker使用,那么大部分的資源都不會被worker占用,那么就不會有足夠的資源進行關鍵任務調度、管理和監控查詢執行。

http-server.http.port:指定HTTP server的端口。Presto 使用 HTTP進行內部和外部的所有通訊。

task.max-memory=1GB:一個單獨的任務使用的最大內存 (一個查詢計划的某個執行部分會在一個特定的節點上執行)。 這個配置參數限制的GROUP BY語句中的Group的數目、JOIN關聯中的右關聯表的大小、ORDER BY語句中的行數和一個窗口函數中處理的行數。 該參數應該根據並發查詢的數量和查詢的復雜度進行調整。如果該參數設置的太低,很多查詢將不能執行;但是如果設置的太高將會導致JVM把內存耗光。

discovery-server.enabled:Presto 通過Discovery 服務來找到集群中所有的節點。為了能夠找到集群中所有的節點,每一個Presto實例都會在啟動的時候將自己注冊到discovery服務。Presto為了簡化部署,並且也不想再增加一個新的服務進程,Presto coordinator 可以運行一個內嵌在coordinator 里面的Discovery 服務。這個內嵌的Discovery 服務和Presto共享HTTP server並且使用同樣的端口。

discovery.uri:Discovery server的URI。由於啟用了Presto coordinator內嵌的Discovery 服務,因此這個uri就是Presto coordinator的uri。修改example.net:8080,根據你的實際環境設置該URI。注意:這個URI一定不能以“/“結尾。

4)日志級別

日志配置文件:etc/log.properties。在這個配置文件中允許你根據不同的日志結構設置不同的日志級別。每個logger都有一個名字(通常是使用logger的類的全標示類名). Loggers通過名字中的“.“來表示層級和集成關系。 (像java里面的包). 如下面的log配置信息:

com.facebook.presto=INFO

This would set the minimum level to INFO for both com.facebook.presto.server and com.facebook.presto.hive. The default minimum level is INFO (thus the above example does not actually change anything). There are four levels: DEBUG, INFO, WARN and ERROR.

5)Catalog Properties

Presto通過connectors訪問數據。這些connectors掛載在catalogs上。 connector 可以提供一個catalog中所有的schema和表。 例如: Hive connector 將每個hive的database都映射成為一個schema, 所以如果hive connector掛載到了名為hive的catalog, 並且在hive的web有一張名為clicks的表, 那么在Presto中可以通過hive.web.clicks來訪問這張表。

通過在etc/catalog目錄下創建catalog屬性文件來完成catalogs的注冊。 例如:可以先創建一個etc/catalog/jmx.properties文件,文件中的內容如下,完成在jmxcatalog上掛載一個jmxconnector:

connector.name=jmx

查看Connectors的詳細配置選項。

4、運行Presto

在安裝目錄的bin/launcher文件,就是啟動腳本。Presto可以使用如下命令作為一個后台進程啟動:

bin/launcher start

另外,也可以在前台運行, 日志和相關輸出將會寫入stdout/stderr(可以使用類似daemontools的工具捕捉這兩個數據流):

bin/launcher run

運行bin/launcher–help,Presto將會列出支持的命令和命令行選項。 另外可以通過運行bin/launcher–verbose命令,來調試安裝是否正確。

啟動完之后,日志將會寫在var/log目錄下,該目錄下有如下文件:

launcher.log: 這個日志文件由launcher創建,並且server的stdout和stderr都被重定向到了這個日志文件中。 這份日志文件中只會有很少的信息,包括:

在server日志系統初始化的時候產生的日志和JVM產生的診斷和測試信息。

server.log: 這個是Presto使用的主要日志文件。一般情況下,該文件中將會包括server初始化失敗時產生的相關信息。這份文件會被自動輪轉和壓縮。

http-request.log: 這是HTTP請求的日志文件,包括server收到的每個HTTP請求信息,這份文件會被自動輪轉和壓縮。

三、部署presto client

1、下載:

https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.189/presto-cli-0.189-executable.jar

上傳linux服務器上,重命名為presto:

$mv presto-cli-0.189-executable.jar presto

$chmod a+x presto

執行以下命令:

$ ./presto --server localhost:8080 --catalog hive --schema default

四、proste連接hive

1、編輯hive-site.xml文件,增加以下內容:

<property>

<name>hive.server2.thrift.port</name>

<value>10000</value>

</property>

<property>

<name>hive.server2.thrift.bind.host</name>

<value>chavin.king</value>

</property>

<property>

<name>hive.metastore.uris</name>

<value>thrift://chavin.king:9083</value>

</property>

2、啟動hiveserver2和hive元數據服務:

bin/hive --service hiveserver2 &

bin/hive --service matestore &

3、配置hive插件,etc/catalog目錄下創建hive.properties文件,輸入如下內容。

3.1)hive配置:

connector.name=hive-hadoop2 #這個連接器的選擇要根據自身集群情況結合插件包的名字來寫

hive.metastore.uri=thrift://chavin.king:9083  #修改為 hive-metastore 服務所在的主機名稱,這里我是安裝在master節點

3.2)HDFS Configuration:

如果hive metastore的引用文件存放在一個存在聯邦的HDFS上,或者你是通過其他非標准的客戶端來訪問HDFS集群的,請添加以下配置信息來指向你的HDFS配置文件:

hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml

大多數情況下,Presto會在安裝過程中自動完成HDFS客戶端的配置。 如果確實需要特殊配置,只需要添加一些額外的配置文件,並且需要指定這些新加的配置文件。 建議將配置文件中的配置屬性最小化。盡量少添加一些配置屬性,因為過多的添加配置屬性會引起其他問題。

3.3)Configuration Properties

Property Name

Description

Example

hive.metastore.uri

The URI of the Hive Metastore to connect to using the Thrift protocol. This property is required.

thrift://192.0.2.3:9083

hive.config.resources

An optional comma-separated list of HDFS configuration files. These files must exist on the machines running Presto. Only specify this if absolutely necessary to access HDFS.

/etc/hdfs-site.xml

hive.storage-format

The default file format used when creating new tables

RCBINARY

hive.force-local-scheduling

Force splits to be scheduled on the same node as the Hadoop DataNode process serving the split data. This is useful for installations where Presto is collocated with every DataNode.

true

4、presto連接hive schema,注意presto不能進行垮庫join操作,測試結果如下:

$ ./presto --server localhost:8080 --catalog hive --schema chavin

presto:chavin> select * from emp;

empno | ename | job | mgr | hiredate | sal | comm | deptno

-------+--------+-----------+------+------------+--------+--------+--------

7369 | SMITH | CLERK | 7902 | 1980/12/17 | 800.0 | NULL | 20

7499 | ALLEN | SALESMAN | 7698 | 1981/2/20 | 1600.0 | 300.0 | 30

7521 | WARD | SALESMAN | 7698 | 1981/2/22 | 1250.0 | 500.0 | 30

7566 | JONES | MANAGER | 7839 | 1981/4/2 | 2975.0 | NULL | 20

7654 | MARTIN | SALESMAN | 7698 | 1981/9/28 | 1250.0 | 1400.0 | 30

7698 | BLAKE | MANAGER | 7839 | 1981/5/1 | 2850.0 | NULL | 30

7782 | CLARK | MANAGER | 7839 | 1981/6/9 | 2450.0 | NULL | 10

7788 | SCOTT | ANALYST | 7566 | 1987/4/19 | 3000.0 | NULL | 20

7839 | KING | PRESIDENT | NULL | 1981/11/17 | 5000.0 | NULL | 10

7844 | TURNER | SALESMAN | 7698 | 1981/9/8 | 1500.0 | 0.0 | 30

7876 | ADAMS | CLERK | 7788 | 1987/5/23 | 1100.0 | NULL | 20

7900 | JAMES | CLERK | 7698 | 1981/12/3 | 950.0 | NULL | 30

7902 | FORD | ANALYST | 7566 | 1981/12/3 | 3000.0 | NULL | 20

7934 | MILLER | CLERK | 7782 | 1982/1/23 | 1300.0 | NULL | 10

(14 rows)

Query 20170711_081802_00002_ydh8n, FINISHED, 1 node

Splits: 17 total, 17 done (100.00%)

0:05 [14 rows, 657B] [2 rows/s, 130B/s]

presto:chavin>

五、JDBC驅動

通過使用JDBC驅動,可以訪問Presto。下載presto-jdbc-0.100.jar並將這個jar文件添加到你的java應用程序的classpath中,Presto支持的URL格式如下:

jdbc:presto://host:port

jdbc:presto://host:port/catalog

jdbc:presto://host:port/catalog/schema

例如,可以使用下面的URL來連接運行在example.net服務器8080端口上的Presto的hive catalog中的sales schema:

jdbc:presto://example.net:8080/hive/sales

六、presto管理之隊列配置

排隊規則定義在一個Json文件中,用於控制能夠提交給Presto的查詢的個數,以及每個隊列中能夠同時運行的查詢的個數。用config.properties中的query.queue-config-file來指定Json配置文件的名字。

排隊規則如果定義了多個隊列,查詢會按順序依次進入不同的隊列中。排隊規則將按照順序進行處理,並且使用第一個匹配上的規則。在以下的配置例子中,有5個隊列模板,在user.${USER}隊列中,${USER}表示着提交查詢的用戶名。同樣的${SOURCE}表示提交查詢的來源。

同樣有五條規則定義了哪一類查詢會進入哪一個隊列中:

第一條規則將使bob成為管理員,bob提交的查詢進入admin隊列。

第二條規則表示,所有使用了experimental_big_querysession參數並且來源包含pipeline的查詢將首先進入 用戶的個人隊列中,然后進入pipeline隊列,最后進入big隊列中。當一個查詢進入一個新的隊列后,直到查詢結束 才會離開之前的隊列。

第三條規則同上一條類似,但是沒有experimental_big_query的要求,同時用global隊列替換了big隊列。

最后兩條規則跟以上兩條規則類似,但是沒有了pipeline來源的要求。

所有這些規則實現了這樣的策略,bob是一個管理員,而其他用戶需要遵循以下的限制:

每個用戶最多能同時運行5個查詢。

big查詢同時只能運行一個

最多能同時運行10個pipeline來源的查詢。

最多能同時運行100個非big查詢

{

"queues": {

"user.${USER}": {

"maxConcurrent": 5,

"maxQueued": 20

},

"pipeline": {

"maxConcurrent": 10,

"maxQueued": 100

},

"admin": {

"maxConcurrent": 100,

"maxQueued": 100

},

"global": {

"maxConcurrent": 100,

"maxQueued": 1000

},

"big": {

"maxConcurrent": 1,

"maxQueued": 10

}

},

"rules": [

{

"user": "bob",

"queues": ["admin"]

},

{

"session.experimental_big_query": "true",

"source": ".*pipeline.*",

"queues": [

"user.${USER}",

"pipeline",

"big"

]

},

{

"source": ".*pipeline.*",

"queues": [

"user.${USER}",

"pipeline",

"global"

]

},

{

"session.experimental_big_query": "true",

"queues": [

"user.${USER}",

"big"

]

},

{

"queues": [

"user.${USER}",

"global"

]

}

]

}

七、presto連接mysql數據庫

1、在etc/catalog目錄下創建文件mysql.properties,輸入如下內容,保存退出。

connector.name=mysql

connection-url=jdbc:mysql://example.net:3306

connection-user=root

connection-password=secret

2、presto客戶端連接mysql服務並執行查詢:

$ ./presto --server localhost:8080 --catalog mysql --schema chavin

presto:chavin> select * from mysql.chavin.emp;

empno | ename | job | mgr | hiredate | sal | comm | deptno

-------+--------+-----------+------+------------+--------+--------+--------

7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.0 | NULL | 20

7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.0 | 300.0 | 30

7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.0 | 500.0 | 30

7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.0 | NULL | 20

7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.0 | 1400.0 | 30

7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.0 | NULL | 30

7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.0 | NULL | 10

7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.0 | NULL | 20

7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.0 | NULL | 10

7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.0 | 0.0 | 30

7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.0 | NULL | 20

7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.0 | NULL | 30

7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.0 | NULL | 20

7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.0 | NULL | 10

(14 rows)

Query 20170711_085557_00002_hpvqh, FINISHED, 1 node

Splits: 17 total, 17 done (100.00%)

0:00 [14 rows, 0B] [28 rows/s, 0B/s]

八、presto連接postgresql

1、在etc/catalog目錄下創建文件postgresql.properties文件,添加如下內容:

connector.name=postgresql

connection-url=jdbc:postgresql://example.net:5432/database

connection-user=root

connection-password=secret

2、通過presto客戶端查詢postgresql數據庫:

$ ./presto --server localhost:8080 --catalog postgresql --schema postgres

附:

參考文檔:https://prestodb.io/docs/current/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM