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 Presto、Impala性能比較
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的數據源,配置一個Hive的catalog
[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
10)Presto是由一個coordinator節點和多個worker節點組成。在hadoop102上配置成coordinator,在hadoop103、hadoop104上配置為worker。
(1)hadoop102上配置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
(2)hadoop103、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
6)Presto命令行操作
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 使用列式存儲
Presto對ORC文件讀取做了特定優化,因此在Hive中創建Presto使用的表時,建議采用ORC格式存儲。相對於Parquet,Presto對ORC支持更好。
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語句時將大表放在左邊
Presto中join的默認算法是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。