presto搭建

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

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