數倉即席查詢---Presto

Presto簡介

presto是一個開源的分佈式SQL查詢引擎,數據量支持GB到PB級,主要用來處理秒級查詢場景
ps:雖然presto可以解析SQL,但它不是一個標準的數據庫,不是MySQL,oracle的代替品,也不能用來處理在線事務(OLTP);官網:https://prestodb.io/

Presto架構

Presto由一個coordinator和多個worker組成
在這裏插入圖片描述

Presto優缺點

優點

1.基於內存計算,減少了磁盤IO,計算更快
2.能夠連接多個數據源,跨數據源連表查,如從hive查詢大量網站訪問記錄,然後從MySQL中匹配出設備信息

缺點

presto能夠處理PB級別的海量數據分析,但presto並不是把PB級數據都放在內存中計算的;而是根據場景,如count,AVG等聚合運算,是邊讀數據邊計算,再清內存,再讀數據再計算,這種耗內存並不高;但是連表查詢,就可能產生大量的臨時數據,因此速度會變慢,反而hive此時更擅長

Presto和impala的對比

這個文章寫得很好:https://blog.csdn.net/u012551524/article/details/79124532
測試結論:Impala性能稍領先於Presto,但是Presto在數據源支持上非常豐富,包括Hive、圖數據庫、傳統關係型數據庫、Redis等

Presto安裝

Presto Server安裝

1.官網地址:https://prestodb.github.io/
2.下載地址:https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.196/presto-server-0.196.tar.gz
3.將文件上傳到/home/hadoop-jrq/bigdata下
4.解壓:tar -zxvf presto-server-0.196.tar.gz
5.修改名稱爲presto:mv presto-server-0.196/ presto
6.進入presto目錄,並創建存儲數據文件夾:mkdir data
7.創建存儲配置文件文件夾:mkdir etc
8.在presto/etc目錄下添加jvm.config配置文件

vi jvm.config
添加內容:

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

9.Presto可以支持多個數據源,在Presto裏面叫catalog,配置支持Hive的數據源,配置一個Hive的catalog
注意,是在presto/etc目錄下

mkdir catalog
cd catalog
vi hive.properties
添加如下內容:

connector.name=hive-hadoop2
hive.metastore.uri=thrift://master:9083

10.將master上的presto分發到slave1、slave2

scp -r ~/bigdata/presto hadoop-jrq@slave1:~/bigdata/
scp -r ~/bigdata/presto hadoop-jrq@slave2:~/bigdata/

11.分發之後,分別進入master、slave1、slave2三臺主機的presto/etc的路徑。配置node屬性,node id每個節點都不一樣。
vi node.properties

master:
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/home/hadoop-jrq/bigdata/presto/data
slave1:
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-fffffffffffe
node.data-dir=/home/hadoop-jrq/bigdata/presto/data
slave2:
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-fffffffffffd
node.data-dir=/home/hadoop-jrq/bigdata/presto/data

12.Presto是由一個coordinator節點和多個worker節點組成。在master上配置成coordinator,在slave1、slave2上配置爲worker。
master上配置coordinator節點(etc下)
vi 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://master:8881

slave1、slave2上配置worker節點
vi config.properties

coordinator=false
http-server.http.port=8881
query.max-memory=50GB
discovery.uri=http://master:8881

13.啓動Hive Metastore

nohup hive --service metastore > ~/bigdata/hive/logs/metastore.log 2>&1 &

14.分別在master、slave1、slave2上啓動Presto Server
前臺啓動Presto,控制檯顯示日誌(第一次運行建議用這個,可以直接打印日誌信息,如果有錯誤也好直接定位)

bin/launcher run

後臺啓動Presto

 bin/launcher start

15.日誌查看路徑presto/data/var/log
16.問題點:
1)Java HotSpot™ 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000480000000, 2818572288, 0) failed; error=‘Cannot allocate memory’ (errno=12)
原因:機器的內存大小不夠
解決:
config.properties的query.max-memory值視你的機器內存更改
2)java.lang.IllegalArgumentException: No factory for connector hive-maste
原因:hive.properties配置需要指定hadoop的版本
改成這樣就可以了connector.name=hive-hadoop2

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上傳到master的bigdata/presto文件夾下
3.修改文件名稱
mv presto-cli-0.196-executable.jar prestocli
4.增加執行權限
chmod +x prestocli
5.啓動prestocli
./prestocli --server master:8881 --catalog hive --schema default
6.Presto命令行操作
Presto的命令行操作,相當於Hive命令行操作。每個表必須要加上schema(數據庫名)。
例如:
select * from schema.table limit 100

Presto可視化Client安裝

1.下載
https://github.com/yanagishima/yanagishima
2.將yanagishima-18.0.zip上傳到master的/home/hadoop-jrq/bigdata目錄
在這裏插入圖片描述
3.解壓縮yanagishima
unzip yanagishima-18.0.zip
cd yanagishima-18.0
4.進入到yanagishima-18.0/conf文件夾,編寫yanagishima.properties配置
vi 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

5.yanagishima-18.0路徑下啓動yanagishima
nohup bin/yanagishima-start.sh >y.log 2>&1 &
6.啓動web頁面
http://hadoop102:7080
看到界面,進行查詢了。
7.查看錶結構
在這裏插入圖片描述
這裏有個Tree View,可以查看所有表的結構,包括Schema、表、字段等。

Presto優化之

數據存儲方面的優化

1.合理設置分區
與Hive類似,Presto會根據元數據信息讀取分區數據,合理的分區能減少Presto數據讀取量,提升查詢性能。
2.使用列式存儲
Presto對ORC文件讀取做了特定優化,因此在Hive中創建Presto使用的表時,建議採用ORC格式存儲。相對於Parquet,Presto對ORC支持更好。
3.使用壓縮
數據壓縮可以減少節點間數據傳輸對IO帶寬壓力,對於即席查詢需要快速解壓,建議採用Snappy壓縮。

查詢SQL優化

1.只選擇使用的字段
由於採用列式存儲,選擇需要的字段可加快字段的讀取、減少數據量。避免採用*讀取所有字段。
2.過濾條件必須加上分區字段
對於有分區的表,where語句中優先使用分區字段進行過濾。acct_day是分區字段,visit_time是具體訪問時間。
3.Group By語句優化
合理安排Group by語句中字段順序對性能有一定提升。將Group By語句中字段按照每個字段distinct數據多少進行降序排列。
比如:

[GOOD]: SELECT GROUP BY uid, gender

[BAD]:  SELECT GROUP BY gender, uid

4.Order by時使用Limit
Order by需要掃描數據到單個worker節點進行排序,導致單個worker需要大量內存。如果是查詢Top N或者Bottom N,使用limit可減少排序計算和內存壓力。
5.使用Join語句時將大表放在左邊
Presto中join的默認算法是broadcast join,即將join左邊的表分割到多個worker,然後將join右邊的表數據整個複製一份發送到每個worker進行計算。如果右邊的表數據量太大,則可能會報內存溢出錯誤。

注意事項

1.字段名引用
避免和關鍵字衝突:MySQL對字段加反引號`、Presto對字段加雙引號分割
當然,如果字段名稱不是關鍵字,可以不加這個雙引號。
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';

3.不支持INSERT OVERWRITE語法
Presto中不支持insert overwrite語法,只能先delete,然後insert into。
4.PARQUET格式
Presto目前支持Parquet格式,支持查詢,但不支持insert。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章