天天看點

CDH 安裝 presto-server-0.216

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)兩者的基本架構

CDH 安裝 presto-server-0.216

hive:Client将查詢請求發送到hive Service,它會和Metastor互動,擷取表的源資訊(如表的位置結構)之後Hive Service會進行文法分析,解析成文法樹,變成查詢計劃,進行優化後将查詢計劃交給執行引擎(預設是Map reduce),然後翻譯成Map Reduce任務來運作。

Presto:presto是在它内部做hive類似的邏輯

2 Presto内部架構

CDH 安裝 presto-server-0.216

Presto是一個運作在多台伺服器上的分布式系統。 完整安裝包括一個coordinator和多個worker。 由用戶端送出查詢,從Presto指令行CLI送出到coordinator。 coordinator進行解析,分析并執行查詢計劃,然後分發處理隊列到worker

CDH 安裝 presto-server-0.216

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運作流程:

CDH 安裝 presto-server-0.216

    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

CDH 安裝 presto-server-0.216

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
           
CDH 安裝 presto-server-0.216

該步驟需要在Presto叢集的所有節點進行操作,這裡以utility節點為例。

3.在/opt/cloudera/parcels/presto/bin/launcher檔案如下位置添加JAVA環境變量用whereis java,java -version,檢視linux都有那些版本的java

[[email protected] ~]# 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
[[email protected] ~]# /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 中增加一下内容:

CDH 安裝 presto-server-0.216

使用這種方式就可以直為Presto服務指定JAVA環境,而不會影響伺服器上其它服務的JAVA環境

3.5準備Presto的配置檔案并分發

1.在Presto叢集所有節點建立/opt/cloudera/parcels/presto/etc目錄

建立node.properties檔案,内容如下:

[[email protected] 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檔案,内容如下:

[[email protected] 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,内容如下:

[[email protected] etc]# vi log.properties 
com.facebook.presto=INFO
           

将jvm.config和log.properties配置檔案拷貝至Presto叢集所有節點

4.建立config.properties檔案

     該配置檔案包含了Presto Server的所有配置資訊。每個Presto Server既是Coordinator也是一個Worker。在大型叢集中,處于性能考慮,建議單獨用一台伺服器作為Coordinator。

coordinator節點的配置如下:

[[email protected] 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節點的配置如下:

[[email protected] 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的注冊。

[[email protected] 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服務

[[email protected] bin]# /opt/cloudera/parcels/presto/bin/launcher start
Already running as 8908
           

2.在Presto叢集的所有節點執行如下指令來停止Presto服務

[[email protected] bin]# /opt/cloudera/parcels/presto/bin/launcher stop
           

關于Presto的更多指令,可以通過如下指令檢視

[[email protected] 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)

CDH 安裝 presto-server-0.216

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
           
[[email protected] bin]# mv presto-cli-0.216-executable.jar presto
[[email protected] bin]# chmod +x presto 
[[email protected] bin]# ll presto
-rwxr-xr-x 1 qmjkdw qmjkdw 15209119 2月  22 14:38 presto
           

然後執行:

[[email protected] 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服務內建使用,内容如下:

[[email protected] catalog]# vi hive.properties 
connector.name=hive-hadoop2
hive.metastore.uri=thrift://utility:9083
           

配置項解釋:

hive.metastore.uri 内容對應 hive-site.xml 中添加的hive.metastore.uris配置:

CDH 安裝 presto-server-0.216

将hive.properties配置檔案拷貝至Presto叢集所有節點/opt/cloudera/parcels/presto/etc/catalog目錄下

重新開機Presto服務,在Presto叢集所有節點執行如下指令:

[[email protected] bin]# /opt/cloudera/parcels/presto/bin/launcher restart
           

Presto與Hive內建測試

在指令行執行指令通路Hive庫:

[[email protected] bin]# ./presto --server 10.18.100.116:9999 --catalog=hive --schema=default          
presto:default> show tables;
           
CDH 安裝 presto-server-0.216
[[email protected] bin]# ./presto --server 10.18.100.116:9999 --catalog hive            
presto> show schemas;
           
CDH 安裝 presto-server-0.216

登入Presto的9999界面檢視SQL執行記錄

CDH 安裝 presto-server-0.216

5.2 內建mysql

在presto-server-0.216/etc/catalog下建立mysql.properties檔案,包含資訊如下:

[[email protected] catalog]# vi mysql.properties 
connector.name=mysql
connection-url=jdbc:mysql://utility:3306
connection-user=root
connection-password=root
           

Presto與mysql內建測試

在指令行執行指令通路mysql庫:

[[email protected] bin]# ./presto --server 10.18.100.116:9999 --catalog mysql
presto> show schemas;
           
CDH 安裝 presto-server-0.216

登入Presto的9999界面檢視SQL執行記錄

CDH 安裝 presto-server-0.216

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目錄。

CDH 安裝 presto-server-0.216

4.如果worker1,2上啟動時報 :

Path exists and is not a symlink:/data/disk1/presto/etc

則将/data/disk1/presto/下的所有檔案删除。