即席查詢--Presto


 

1.1 Presto簡介

1.1.1 Presto概念

 Presto是一個開源的分布式SQL查詢引擎,數據量支持GB到PB字節,主要用來處理秒級查詢的場景。

注意:雖然Presto可以解析SQL,但是他不是一個標准的數據庫。不是MySQL,Oracle的替代品,也不能用來處理在線事務OLTP。

1.1.2 Presto架構

 

1.1.3 Presto優缺點

 

 

 

1.1.4 PrestoImpala性能比較

https://blog.csdn.net/u012551524/article/details/79124532

測試結論Impala性能稍領先於Presto,但是Presto在數據源支持上非常豐富,包括Hive、圖數據庫、傳統關系型數據庫、Redis等。

1.2 Presto安裝

1.2.1 Presto Server安裝

0官網地址

https://prestodb.github.io/

1下載地址

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

2)將presto-server-0.196.tar.gz導入hadoop102的/opt/software目錄,並解壓到/opt/module目錄

[atguigu@hadoop102 software]$ tar -zxvf presto-server-0.196.tar.gz -C /opt/module/

3)修改名稱為presto

[atguigu@hadoop102 module]$ mv presto-server-0.196/ presto

4)進入/opt/module/presto目錄,並創建存儲數據文件夾

[atguigu@hadoop102 presto]$ mkdir data

5)進入/opt/module/presto目錄,並創建存儲配置文件文件夾

[atguigu@hadoop102 presto]$ mkdir etc

6)配置在/opt/module/presto/etc目錄添加jvm.config配置文件

[atguigu@hadoop102 etc]$ vim jvm.config

添加如下內容

-server

-Xmx16G

-XX:+UseG1GC

-XX:G1HeapRegionSize=32M

-XX:+UseGCOverheadLimit

-XX:+ExplicitGCInvokesConcurrent

-XX:+HeapDumpOnOutOfMemoryError

-XX:+ExitOnOutOfMemoryError

7)Presto可以支持多個數據源,在Presto里面叫catalog,這里我們配置支持Hive的數據源,配置一個Hivecatalog

[atguigu@hadoop102 etc]$ mkdir catalog

[atguigu@hadoop102 catalog]$ vim hive.properties 

添加如下內容

connector.name=hive-hadoop2

hive.metastore.uri=thrift://hadoop102:9083

8)將hadoop102上presto分發到hadoop103、hadoop104

[atguigu@hadoop102 module]$ xsync presto

9)分發之后,分別進入hadoop102、hadoop103、hadoop104三台主機的/opt/module/presto/etc的路徑。配置node屬性,node id每個節點都不一樣

[atguigu@hadoop102 etc]$vim node.properties

node.environment=production

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

node.data-dir=/opt/module/presto/data

 

[atguigu@hadoop103 etc]$vim node.properties

node.environment=production

node.id=ffffffff-ffff-ffff-ffff-fffffffffffe

node.data-dir=/opt/module/presto/data

 

[atguigu@hadoop104 etc]$vim node.properties

node.environment=production

node.id=ffffffff-ffff-ffff-ffff-fffffffffffd

node.data-dir=/opt/module/presto/data

10Presto是由一個coordinator節點和多個worker節點組成。在hadoop102上配置成coordinator,hadoop103、hadoop104上配置為worker。

1hadoop102上配置coordinator節點

[atguigu@hadoop102 etc]$ vim config.properties

添加內容如下

coordinator=true

node-scheduler.include-coordinator=false

http-server.http.port=8881

query.max-memory=50GB

discovery-server.enabled=true

discovery.uri=http://hadoop102:8881

2hadoop103、hadoop104上配置worker節點

[atguigu@hadoop103 etc]$ vim config.properties

添加內容如下

coordinator=false

http-server.http.port=8881

query.max-memory=50GB

discovery.uri=http://hadoop102:8881

 

[atguigu@hadoop104 etc]$ vim config.properties

添加內容如下

coordinator=false

http-server.http.port=8881

query.max-memory=50GB

discovery.uri=http://hadoop102:8881

11)在hadoop102的/opt/module/hive目錄下,啟動Hive Metastore,用atguigu角色

[atguigu@hadoop102 hive]$

nohup bin/hive --service metastore >/dev/null 2>&1 &

12)分別hadoop102、hadoop103、hadoop104上啟動Presto Server

1前台啟動Presto,控制台顯示日志

[atguigu@hadoop102 presto]$ bin/launcher run

[atguigu@hadoop103 presto]$ bin/launcher run

[atguigu@hadoop104 presto]$ bin/launcher run

2后台啟動Presto

[atguigu@hadoop102 presto]$ bin/launcher start

[atguigu@hadoop103 presto]$ bin/launcher start

[atguigu@hadoop104 presto]$ bin/launcher start

13)日志查看路徑/opt/module/presto/data/var/log

1.2.2 Presto命令Client安裝

1下載Presto的客戶端

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

2)將presto-cli-0.196-executable.jar上傳hadoop102/opt/module/presto文件夾下

3)修改文件名稱

[atguigu@hadoop102 presto]$ mv presto-cli-0.196-executable.jar  prestocli

4)增加執行權限

[atguigu@hadoop102 presto]$ chmod +x prestocli

5)啟動prestocli

[atguigu@hadoop102 presto]$ ./prestocli --server hadoop102:8881 --catalog hive --schema default

6Presto命令行操作

Presto的命令行操作,相當於Hive命令行操作。每個表必須要加上schema

例如:

select * from schema.table limit 100

1.2.3 Presto可視化Client安裝

1)將yanagishima-18.0.zip上傳hadoop102/opt/module目錄

2解壓縮yanagishima

[atguigu@hadoop102 module]$ unzip yanagishima-18.0.zip

cd yanagishima-18.0

3)進入/opt/module/yanagishima-18.0/conf文件,編寫yanagishima.properties配置

[atguigu@hadoop102 conf]$ vim yanagishima.properties

添加如下內容

jetty.port=7080

presto.datasources=atiguigu-presto

presto.coordinator.server.atiguigu-presto=http://hadoop102:8881

catalog.atiguigu-presto=hive

schema.atiguigu-presto=default

sql.query.engines=presto

4)在/opt/module/yanagishima-18.0路徑啟動yanagishima

[atguigu@hadoop102 yanagishima-18.0]$

nohup bin/yanagishima-start.sh >y.log 2>&1 &

5)啟動web頁面

http://hadoop102:7080

看到界面,進行查詢了。

6)查看表結構

 

這里有個Tree View,可以查看所有表的結構,包括Schema、表、字段等。

比如執行select * from hive.dw_weather.tmp_news_click limit 10,這個句子里Hive這個詞可以刪掉,是上面配置的Catalog

 

每個表后面都有個復制鍵,點一下會復制完整的表名,然后再上面框里面輸入sql語句,ctrl+enter鍵執行顯示結果

 

 

 

1.3 Presto優化之數據存儲

1.3.1 合理設置分區

Hive類似,Presto會根據元數據信息讀取分區數據,合理的分區能減少Presto數據讀取量,提升查詢性能。

1.3.2 使用列式存儲

PrestoORC文件讀取做了特定優化,因此在Hive中創建Presto使用的表時,建議采用ORC格式存儲。相對於ParquetPrestoORC支持更好。

1.3.3 使用壓縮

數據壓縮可以減少節點間數據傳輸對IO帶寬壓力,對於即席查詢需要快速解壓,建議采用Snappy壓縮。

1.4 Presto優化之查詢SQL

1.4.1 只選擇使用的字段

由於采用列式存儲,選擇需要的字段可加快字段的讀取、減少數據量。避免采用*讀取所有字段。

[GOOD]: SELECT time, user, host FROM tbl

 

[BAD]:  SELECT * FROM tbl

1.4.2 過濾條件必須加上分區字段

對於有分區的表,where語句中優先使用分區字段進行過濾。acct_day是分區字段,visit_time是具體訪問時間。

[GOOD]: SELECT time, user, host FROM tbl where acct_day=20171101

 

[BAD]:  SELECT * FROM tbl where visit_time=20171101

1.4.3 Group By語句優化

合理安排Group by語句中字段順序對性能有一定提升。將Group By語句中字段按照每個字段distinct數據多少進行降序排列。

[GOOD]: SELECT GROUP BY uid, gender

 

[BAD]:  SELECT GROUP BY gender, uid

1.4.4 Order by時使用Limit

Order by需要掃描數據到單個worker節點進行排序,導致單個worker需要大量內存。如果是查詢Top N或者Bottom N,使用limit可減少排序計算和內存壓力。

[GOOD]: SELECT * FROM tbl ORDER BY time LIMIT 100

 

[BAD]:  SELECT * FROM tbl ORDER BY time

1.4.5 使用Join語句時將大表放在左邊

Prestojoin的默認算法是broadcast join,即將join左邊的表分割到多個worker,然后將join右邊的表數據整個復制一份發送到每個worker進行計算。如果右邊的表數據量太大,則可能會報內存溢出錯誤。

[GOOD] SELECT ... FROM large_table l join small_table s on l.id = s.id

[BAD] SELECT ... FROM small_table s join large_table l on l.id = s.id

1.5 注意事項

1.5.1 字段名引用

避免和關鍵字沖突:MySQL字段加反引號`Presto字段加雙引號分割

當然,如果字段名稱不是關鍵字,可以不加這個雙引號。

1.5.2 時間函數

對於Timestamp,需要進行比較的時候,需要添加Timestamp關鍵字,而MySQL中對Timestamp可以直接進行比較。

/*MySQL的寫法*/

SELECT t FROM a WHERE t > '2017-01-01 00:00:00';

 

/*Presto中的寫法*/

SELECT t FROM a WHERE t > timestamp '2017-01-01 00:00:00';

1.5.3 不支持INSERT OVERWRITE語法

Presto中不支持insert overwrite語法,只能先delete,然后insert into

1.5.4 PARQUET格式

Presto目前支持Parquet格式,支持查詢,但不支持insert


免責聲明!

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



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