1.Presto簡介
Presto是由Facebook開源,完全基於內存的並行計算以及分佈式SQL交互式查詢引擎。它可以共享Hive的元數據,然後直接訪問HDFS中的數據,同時支持Hadoop中常見的文件格式比如文本,ORC和Parquet。同Impala一樣,作爲Hadoop之上的SQL交互式查詢引擎,通常比Hive要快5-10倍。另外,Presto不僅可以訪問HDFS,還可以訪問RDBMS中的數據,以及其他數據源比如CASSANDRA。
適合場景:PB級海量數據複雜分析,交互式SQL查詢,⽀持跨數據源查詢
不適合場景:多個大表的join操作,因爲presto是基於內存的,join操作輸入小但產生的中間數據大,在內存裏可能放不下
與Hive的區別:
(1)hive是一個數據倉庫,提供存儲服務,但只能訪問HDSF的數據,presto是一個分佈式的查詢引擎,並不提供數據的儲存服務,爲此,presto是一個插拔式的設計思路,支持多種數據源,包括hive,hdfs,mysql,等。
(2)兩者的基本架構
hive:Client將查詢請求發送到hive Service,它會和Metastor交互,獲取表的源信息(如表的位置結構)之後Hive Service會進行語法分析,解析成語法樹,變成查詢計劃,進行優化後將查詢計劃交給執行引擎(默認是Map reduce),然後翻譯成Map Reduce任務來運行。
Presto:presto是在它內部做hive類似的邏輯
2 Presto內部架構
Presto是一個運行在多臺服務器上的分佈式系統。 完整安裝包括一個coordinator和多個worker。 由客戶端提交查詢,從Presto命令行CLI提交到coordinator。 coordinator進行解析,分析並執行查詢計劃,然後分發處理隊列到worker
Presto查詢引擎是一個Master-Slave的架構模式,由三部分組成:
1.一個 coordinator
2.一個discovery server
3.多個worker
coodinator:用於解析查詢sql,生成執行計劃,並分發給worker執行。
discovery server:通常內嵌與Coordinator節點中,worker上線後,向discovery server註冊。coodinator分發任務前,需要向discovery server獲取可以正常工作worker列表。
worker:具體執行任務的工作節點。
presto可以藉助hive的元信息找到hdfs上的節點
Presto中SQL運行流程:
step1:當我們執行一條sql查詢,coordinator接收到這條sql語句以後,它會有一個sql的語法解析器去把sql語法解析變成一個抽象的語法樹(AST),這抽象的語法樹它裏面只是進行一些語法解析,如果你的sql語句裏面,比如說關鍵字你用的是int而不是Integer,就會在語法解析這裏給暴露出來
step2:如果語法是符合sql語法規範,之後會經過一個邏輯查詢計劃器的組件,他的主要作用是,比如說你sql裏面出現的表,他會通過connector的方式去meta裏面把表的schema,列名,列的類型等,全部給找出來,將這些信息,跟語法樹給對應起來,之後會生成一個物理的語法樹節點,這個語法樹節點裏面,不僅擁有了它的查詢關係,還擁有類型的關係,如果在這一步,數據庫表裏某一列的類型,跟你sql的類型不一致,就會在這裏報錯.
step3:如果通過,就會得到一個邏輯的查詢計劃,然後這個邏輯查詢計劃,會被送到一個分佈式的邏輯查詢計劃器裏面,進行一個分佈式的解析,分佈式解析裏面,他就會去把對應的每一個查詢計劃轉化爲task
step4:在每一個task裏面,他會把對應的位置信息全部給提取出來,交給執行的plan,由plan把對應的task發給對應的worker去執行,這就是整個的一個過程,與hive默認的引擎Mapreduce相比,presto將數據放在內存中,task之間進行數據shuffle時,直接從內存裏處理,所以很快。
3 .安裝
3.1 Presto的安裝基本環境
.Linux或Mac OS X.
.Java 8,64位
.Python 2.4+
連接器:
Presto支持從以下版本的Hadoop中讀取Hive數據:支持以下文件類型:Text, SequenceFile, RCFile, ORC
Apache Hadoop 1.x (hive-hadoop1)
Apache Hadoop 2.x (hive-hadoop2)
Cloudera CDH 4 (hive-cdh4)
Cloudera CDH 5 (hive-cdh5)
Cloudera CDH5安裝文檔:
集羣規劃:
IP地址
HOSTNAME
NodeID
角色
10.18.100.116
utility
presto-cdh1
coordinator
10.18.100.173
master
presto-cdh2
worker
10.18.100.174
worker1
presto-cdh3
worker
10.18.100.175
worker2
presto-cdh4
worker
3.2安裝JDK1.8
presto-server-0.216需要1.8.0_151+版本的,如果默認的版本低於1.8.0_151,則啓動presto時修改Java的臨時環境變量(臨時環境變量只在本終端有效,不影響Java的默認版本),修改方式見 3.4.3 在/opt/cloudera/parcels/presto/bin/launcher文件如下位置添加JAVA環境變量,使用這種方式就可以直爲Presto服務指定JAVA環境,而不會影響服務器上其它服務的JAVA環境。
3.3 安裝python
一般的系統會自帶python,我用的是自帶的Python2.7
3.4安裝presto
Presto服務的安裝目錄爲/opt/cloudera/parcels/presto
1.在Presto官網下載presto-server-0.216.tar.gz安裝包,下載地址:
https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.216/presto-server-0.216.tar.gz
將下載好的presto-server-0.216.tar.gz上傳至Presto集羣的所有服務器上
2.將presto-server-0.216.tar.gz壓縮包解壓至/opt/cloudera/parcels目錄
tar -zxvf presto-server-0.216.tar.gz -C /opt/cloudera/parcels/
爲presto-server-0.216創建persto軟鏈接
ln -s presto-server-0.216 presto
該步驟需要在Presto集羣的所有節點進行操作,這裏以utility節點爲例。
3.在/opt/cloudera/parcels/presto/bin/launcher文件如下位置添加JAVA環境變量用whereis java,java -version,查看linux都有那些版本的java
[root@utility ~]# whereis java
java: /usr/bin/java /usr/lib/java /etc/java /usr/local/java /usr/share/java /app/ins/jdk1.8.0_171/bin/java /usr/share/man/man1/java.1.gz
[root@utility ~]# /usr/bin/java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
/usr/bin/java下是 1.8.0_191版本,在 vim presto/bin/launcher 中增加一下內容:
使用這種方式就可以直爲Presto服務指定JAVA環境,而不會影響服務器上其它服務的JAVA環境
3.5準備Presto的配置文件並分發
1.在Presto集羣所有節點創建/opt/cloudera/parcels/presto/etc目錄
新建node.properties文件,內容如下:
[root@utility etc]# vi node.properties
node.environment=presto
node.id=presto-cdh1
node.data-dir=/data/disk1/presto
配置說明:
node.environment:集羣名稱。所有在同一個集羣中的Presto節點必須擁有相同的集羣名稱。建議環境名稱直接用presto。
node.id:每個Presto節點的唯一標示。每個節點的node.id都必須是唯一的。在Presto進行重啓或者升級過程中每個節點的node.id必須保持不變。如果在一個節點上安裝多個Presto實例(例如:在同一臺機器上安裝多個Presto節點),那麼每個Presto節點必須擁有唯一的node.id。
node.data-dir:數據存儲目錄的位置(操作系統上的路徑)。Presto將會把日期和數據存儲在這個目錄下。
將node.properties拷貝至Presto集羣的所有節點
注意:這裏拷貝了需要將Presto所有節點的node.id修改爲對應節點的ID。
2.配置Presto的JVM參數,創建jvm.config文件,內容如下:
[root@utility etc]# vi jvm.config
-server
-Xmx8G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
配置文件的格式是:一系列的選項,每行配置一個單獨的選項。由於這些選項不在shell命令中使用。因此即使將每個選項通過空格或者其他的分隔符分開,java程序也不會將這些選項分開,而是作爲一個命令行選項處理。(就想下面例子中的OnOutOfMemoryError選項)。
由於OutOfMemoryError將會導致JVM處於不一致狀態,所以遇到這種錯誤的時候我們一般的處理措施就是將dump headp中的信息(用於debugging),然後強制終止進程。
Presto會將查詢編譯成字節碼文件,因此Presto會生成很多class,因此我們我們應該增大Perm區的大小(在Perm中主要存儲class)並且要允許Jvm class unloading。
3.新建日誌文件log.properties,內容如下:
[root@utility etc]# vi log.properties
com.facebook.presto=INFO
將jvm.config和log.properties配置文件拷貝至Presto集羣所有節點
4.創建config.properties文件
該配置文件包含了Presto Server的所有配置信息。每個Presto Server既是Coordinator也是一個Worker。在大型集羣中,處於性能考慮,建議單獨用一臺服務器作爲Coordinator。
coordinator節點的配置如下:
[root@utility etc]# vi coordinator-config.properties
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=9999
query.max-memory=4GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://10.18.100.116:9999
worker節點的配置如下:
[root@utility etc]# vi worker-config.properties
coordinator=false
http-server.http.port=9999
query.max-memory=4GB
query.max-memory-per-node=1GB
discovery.uri=http://10.18.100.116:9999
配置項說明:
coordinator:指定是否運維Presto實例作爲一個coordinator(接收來自客戶端的查詢情切管理每個查詢的執行過程)。
node-scheduler.include-coordinator:是否允許在coordinator服務中進行調度工作。對於大型的集羣,在一個節點上的Presto server即作爲coordinator又作爲worke將會降低查詢性能。因爲如果一個服務器作爲worker使用,那麼大部分的資源都不會被worker佔用,那麼就不會有足夠的資源進行關鍵任務調度、管理和監控查詢執行。
http-server.http.port:指定HTTP server的端口。Presto 使用 HTTP進行內部和外部的所有通訊。
discovery.uri:Discoveryserver的URI。由於啓用了Prestocoordinator內嵌的Discovery 服務,因此這個uri就是Prestocoordinator的uri。修改example.net:9999,根據你的實際環境設置該URI。注意:這個URI一定不能以“/“結尾。
將coordinator-config.properties文件拷貝至utility節點,並重命名爲config.properties
將worker-config.properties文件拷貝至Presto集羣的worker節點,並重命名爲config.properties
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的註冊。
[root@master catalog]# vi jmx.properties
connector.name=jmx
6.Presto需要一個用於存儲日誌、本地元數據等的數據目錄。建議在安裝目錄的外面創建一個數據目錄。本次安裝我用的存儲路徑是/data/disk1/presto
以上在是在etc中創建的Presto的所有配置文件,這些文件的內容是:
.node.properties:每個節點的環境變量配置
.jvm.config:jvm參數 ,Java虛擬機的命令行選項
.config.properties:Presto 服務配置
.log.properties:Server參數 ,允許你根據不同的日誌結構設置不同的日誌級別
.catalog:每個連接者配置(data sources)
至此就完成了Presto集羣的部署。
4 .Presto服務啓停
1.在Presto集羣的所有節點執行如下命令啓動Presto服務
[root@utility bin]# /opt/cloudera/parcels/presto/bin/launcher start
Already running as 8908
2.在Presto集羣的所有節點執行如下命令來停止Presto服務
[root@utility bin]# /opt/cloudera/parcels/presto/bin/launcher stop
關於Presto的更多命令,可以通過如下命令查看
[root@utility bin]# /opt/cloudera/parcels/presto/bin/launcher --help
web端訪問:http://10.18.100.116:9999(config.properties文件中配置的discovery.uri=http://10.18.100.116:9999)
5.presto集成各數據庫
Presto與各數據庫的集成使用Presto提供的Presto CLI,該CLI是一個可執行的JAR文件,也意味着你可以想UNIX終端窗口一樣來使用CLI。
下載Presto的presto-cli-0.216-executable.jar,並重命名爲presto放到presto/bin/ 目錄下,並賦予可以執行權限
https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.216/presto-cli-0.216-executable.jar
[root@utility bin]# mv presto-cli-0.216-executable.jar presto
[root@utility bin]# chmod +x presto
[root@utility bin]# ll presto
-rwxr-xr-x 1 qmjkdw qmjkdw 15209119 2月 22 14:38 presto
然後執行:
[root@utility bin]#$ ./presto --server 10.18.100.116:9999 --catalog hive
presto> show schemas; #查看數據庫
presto> use default;
presto:default> show tables; #查看錶
5.1 集成hive
在presto-server-0.216/etc/catalog下創建hive.properties文件,該文件與Hive服務集成使用,內容如下:
[root@utility catalog]# vi hive.properties
connector.name=hive-hadoop2
hive.metastore.uri=thrift://utility:9083
配置項解釋:
hive.metastore.uri 內容對應 hive-site.xml 中添加的hive.metastore.uris配置:
將hive.properties配置文件拷貝至Presto集羣所有節點/opt/cloudera/parcels/presto/etc/catalog目錄下
重啓Presto服務,在Presto集羣所有節點執行如下命令:
[root@utility bin]# /opt/cloudera/parcels/presto/bin/launcher restart
Presto與Hive集成測試
在命令行執行命令訪問Hive庫:
[root@utility bin]# ./presto --server 10.18.100.116:9999 --catalog=hive --schema=default
presto:default> show tables;
[root@utility bin]# ./presto --server 10.18.100.116:9999 --catalog hive
presto> show schemas;
登錄Presto的9999界面查看SQL執行記錄
5.2 集成mysql
在presto-server-0.216/etc/catalog下創建mysql.properties文件,包含信息如下:
[root@utility catalog]# vi mysql.properties
connector.name=mysql
connection-url=jdbc:mysql://utility:3306
connection-user=root
connection-password=root
Presto與mysql集成測試
在命令行執行命令訪問mysql庫:
[root@utility bin]# ./presto --server 10.18.100.116:9999 --catalog mysql
presto> show schemas;
登錄Presto的9999界面查看SQL執行記錄
6.總結:
1.在指定Presto的node.environment名稱時需要注意,不能包含特殊字符如“-”,否則在啓動時會報錯“Error: Constraint violation with property prefix'': environment is malformed”
2.Presto服務和Presto CLI均是JAVA實現,所以在部署前需要安裝好JAVA的環境
3.如果集羣啓用了Sentry,在訪問hive表時,需要爲presto用戶授權,否則訪問表時會報沒有權限讀寫HDFS目錄。
4.如果worker1,2上啓動時報 :
Path exists and is not a symlink:/data/disk1/presto/etc
則將/data/disk1/presto/下的所有文件刪除。
————————————————
版權聲明:本文爲CSDN博主「jaysen1005」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_36636708/article/details/88037421