Presto 分布式SQL查询引擎
文章目錄
- Presto的介紹
- Presto的數(shù)據(jù)模型
- 通過(guò)Presto客戶端查詢Presto命令
- Presto的架構(gòu)
- Java程序訪問(wèn)Presto
- Presto注意點(diǎn)
Presto的介紹
Presto的數(shù)據(jù)模型
Presto查詢語(yǔ)句示例:
# 連接多個(gè)數(shù)據(jù)源進(jìn)行查詢 select * from hive.testdb.tableA a join mysql.testdb.tableB where a.id = b.id # 查看Presto支持的所有數(shù)據(jù)源 show catalogs # 查看所有Schema show schemas通過(guò)Presto客戶端查詢Presto命令
# 端口號(hào)默認(rèn)是7670 --catalog指定連接的數(shù)據(jù)源 --schema指定連接的數(shù)據(jù)庫(kù) ./presto-cli-0.212-executable.jar ip:端口號(hào) --catalog hive --schema defaultPresto的架構(gòu)
Presto也是主從架構(gòu),由三部分組成:一個(gè)Coordinator節(jié)點(diǎn)、一個(gè)Discovery Server節(jié)點(diǎn),多個(gè)Worker節(jié)點(diǎn);
Coordinator為主節(jié)點(diǎn),負(fù)責(zé)解析SQL語(yǔ)句,生成查詢計(jì)劃,分發(fā)執(zhí)行任務(wù);
Discovery Server負(fù)責(zé)維護(hù)Coordinator和Worker的關(guān)系,通常內(nèi)嵌于Coordinator節(jié)點(diǎn);
Worker節(jié)點(diǎn)負(fù)責(zé)執(zhí)行查詢?nèi)蝿?wù)以及與數(shù)據(jù)源進(jìn)行交互讀取數(shù)據(jù)。
Presto連接Hive數(shù)據(jù)源的架構(gòu)圖:
工作原理:Presto Coordinator接收Presto客戶端發(fā)送的SQL語(yǔ)句,根據(jù)Hive的元數(shù)據(jù)信息,解析SQL語(yǔ)句,生成查詢計(jì)劃,并將任務(wù)分發(fā)給多個(gè)Worker節(jié)點(diǎn),Worker節(jié)點(diǎn)會(huì)讀取HDFS上的數(shù)據(jù)到內(nèi)存中來(lái)進(jìn)行計(jì)算,并將結(jié)果返回給Coordinator節(jié)點(diǎn),Coordinator節(jié)點(diǎn)再將數(shù)據(jù)返回給Presto客戶端。
Presto連接多數(shù)據(jù)源的架構(gòu)圖:
Java程序訪問(wèn)Presto
Java程序中,是通過(guò)JDBC的方式訪問(wèn)Presto的,就類(lèi)似于通過(guò)JDBC訪問(wèn)Mysql數(shù)據(jù)庫(kù)一樣,舉例如下:
<!--導(dǎo)入依賴--> <dependency><groupId>com.facebook.presto</groupId><artifactId>presto-jdbc</artifactId><version>0.212</version> </dependency> public static void main(String[] args) throws SQLException {// 注冊(cè)presto驅(qū)動(dòng)try {Class.forName("com.facebook.presto.jdbc.PrestoDriver");} catch (ClassNotFoundException e) {e.printStackTrace();}// 獲取presto連接(指定url、用戶名、密碼)Connection connection = DriverManager.getConnection("jdbc:presto://192.168.110.112:7670/hive/default", "root", "123456");// 執(zhí)行SQL查詢Statement statement = connection.createStatement();ResultSet res = statement.executeQuery("show tables");while (res.next()) {System.out.println(res.getString(1));}res.close();// 假設(shè)表tableA有兩個(gè)字段ResultSet resultSet = statement.executeQuery("select * from tableA");while (res.next()) {System.out.println(resultSet.getString(1) + "---" + resultSet.getString(2));}resultSet.close();connection.close(); }Presto注意點(diǎn)
一般來(lái)說(shuō),使用Presto操作Hive等數(shù)據(jù)源是為了加快查詢速度,并不支持通過(guò)Presto去更新Hive等數(shù)據(jù)源,例如通過(guò)Presto去操作Hive添加分區(qū)會(huì)失敗。
總結(jié)
以上是生活随笔為你收集整理的Presto 分布式SQL查询引擎的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .NET 初中级面试题
- 下一篇: 记录Virtuoso导入工艺库心得