<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Presto介紹及常用查詢優(yōu)化方法總結

          共 3138字,需瀏覽 7分鐘

           ·

          2021-12-09 18:44

          1、Presto簡介
          Presto是Facebook開源的MPP(Massive Parallel Processing)SQL引擎,其理念來源于一個叫Volcano的并行數(shù)據(jù)庫,該數(shù)據(jù)庫提出了一個并行執(zhí)行SQL的模型,它被設計為用來專門進行高速、實時的數(shù)據(jù)分析。
          Presto是一個SQL計算引擎,分離計算層和存儲層,其不存儲數(shù)據(jù),通過Connector SPI實現(xiàn)對各種數(shù)據(jù)源(Storage)的訪問。
          1.1 架構
          Presto沿用了通用的Master-Slave架構,一個Coordinator,多個Worker。
          Coordinator負責解析SQL語句,生成執(zhí)行計劃,分發(fā)執(zhí)行任務給Worker節(jié)點執(zhí)行,Worker節(jié)點負責實際執(zhí)行查詢?nèi)蝿铡?/span>
          Presto提供了一套Connector接口,用于讀取元信息和原始數(shù)據(jù)。
          Presto 內(nèi)置有多種數(shù)據(jù)源,如 Hive、MySQL、Kudu、Kafka 等。
          Presto 的擴展機制允許自定義 Connector,從而實現(xiàn)對定制數(shù)據(jù)源的查詢。
          假如配置了Hive Connector,需要配置一個Hive MetaStore服務為Presto提供Hive元信息,Worker節(jié)點通過Hive Connector與HDFS交互,讀取原始數(shù)據(jù)。
          1.2 實現(xiàn)低延時的原理
          Presto是一個交互式查詢引擎,我們最關心的是Presto實現(xiàn)低延時查詢的原理,以下幾點是其性能脫穎而出的主要原因:
          • 完全基于內(nèi)存的并行計算
          • 流水線
          • 本地化計算
          • 動態(tài)編譯執(zhí)行計劃
          • 小心使用內(nèi)存和數(shù)據(jù)結構
          • GC控制
          • 無容錯
          2、Presto查詢優(yōu)化
          2.1 存儲優(yōu)化
          ① 合理設置分區(qū)
          與Hive類似,Presto會根據(jù)元信息讀取分區(qū)數(shù)據(jù),合理的分區(qū)能減少Presto數(shù)據(jù)讀取量,提升查詢性能。
          ② 使用列式存儲
          Presto對ORC文件讀取做了特定優(yōu)化,因此在Hive中創(chuàng)建Presto使用的表時,建議采用ORC格式存儲。相對于Parquet,Presto對ORC支持更好
          ③ 使用壓縮
          數(shù)據(jù)壓縮可以減少節(jié)點間數(shù)據(jù)傳輸對IO帶寬壓力,對于即席查詢需要快速解壓,建議采用snappy壓縮
          ④ 預先排序
          有條件的話提前做好排序,對于已經(jīng)排序的數(shù)據(jù),在查詢的數(shù)據(jù)過濾階段,ORC格式支持跳過讀取不必要的數(shù)據(jù)。
          比如對于經(jīng)常需要過濾的字段可以預先排序。
          2.2 查詢優(yōu)化
          ① select時只選擇必要字段,避免使用 * 號
          ② 過濾條件加上分區(qū)字段,減少查詢數(shù)據(jù)量
          ③ 合理安排Group by語句中字段順序?qū)π阅苡幸欢ㄌ嵘?/span>
          將Group By語句中字段按照每個字段distinct數(shù)據(jù)多少進行降序排列。示例中uid是用戶id,比性別數(shù)據(jù)大很多。
          [GOOD]: SELECT GROUP BY uid, gender [BAD]:??SELECT?GROUP?BY?gender,?uid
          ④ Order by時使用Limit
          Order by需要掃描數(shù)據(jù)到單個worker節(jié)點進行排序,導致單個worker需要大量內(nèi)存。如果是查詢Top N或者Bottom N,使用limit可減少排序計算和內(nèi)存壓力。
          ⑤ 用regexp_like代替多個like語句
          Presto查詢優(yōu)化器沒有對多個like語句進行優(yōu)化,使用regexp_like對性能有較大提升
          [GOOD] SELECT?...?FROM?access?WHERE regexp_like(method, 'GET|POST|PUT|DELETE') 
          [BAD] SELECT?...?FROM?access?WHERE?method?LIKE?'%GET%'?OR??method?LIKE?'%POST%'?OR??method?LIKE?'%PUT%'?OR??method?LIKE?'%DELETE%'
          ⑥ 使用Rank函數(shù)代替row_number函數(shù)來獲取Top N
          在進行一些分組排序場景時,使用rank函數(shù)性能更好
          2.3 Join優(yōu)化
          ① 使用Join語句時將大表放在左邊
          Presto中join的默認算法是broadcast join,即將join左邊的表分割到多個worker,然后將join右邊的表數(shù)據(jù)整個復制一份發(fā)送到每個worker進行計算。
          如果右邊的表數(shù)據(jù)量太大,則可能會報內(nèi)存溢出錯誤。
          ② 如果左表和右表都比較大
          為防止內(nèi)存溢出,做如下配置:
          1)修改配置distributed-joins-enabled (presto version >=0.196)
          2)在每次查詢開始使用distributed_join的session選項
          set?session?distributed_join?=?'true' 
          SELECT?...?FROM large_table1 join large_table2 on?large_table1.id?=?large_table2.id
          核心點就是使用distributed join,也就是hash join。
          Presto的這種配置類型會將左表和右表同時以join key的hash value為分區(qū)字段進行分區(qū)。
          所以即使右表也是大表,也會被拆分,相比broadcast join,這種join方式的會增加很多網(wǎng)絡數(shù)據(jù)傳輸,效率慢。
          ③ 多個join的OR條件使用union代替
          SELECT?...?FROM?t1?JOIN?t2 ON?t1.a1?=?t2.a1?ORt1.a2?=?t2.a2?
          改為
          SELECT?... FROM?t1?JOIN?t2?ON?t1.a1?=?t2.a1 union SELECT?... FROM?t1?JOIN?t2 ON?t1.a2?=?t2.a2
          ④ 使用WITH語句
          使用Presto分析統(tǒng)計數(shù)據(jù)時,可考慮把多次查詢合并為一次查詢,用Presto提供的子查詢完成。
          WITH tmp AS (   SELECT DISTINCT a1, a2   FROM t2) SELECT ... FROM t1 JOIN tmp ON t1.a1 = tmp.a1 union SELECT ... FROM t1 JOIN tmp ON t1.a2 = tmp.a2;
          ⑤ 盡量用UNION ALL代替UNION
          和distinct類似, UNION有去重的功能, 所以會使用到內(nèi)存,如果只是拼接兩個或者多個SQL查詢的結果, 考慮用UNION ALL

          八千里路云和月 | 從零到大數(shù)據(jù)專家學習路徑指南

          互聯(lián)網(wǎng)最壞的時代可能真的來了

          我在B站讀大學,大數(shù)據(jù)專業(yè)

          我們在學習Flink的時候,到底在學習什么?

          193篇文章暴揍Flink,這個合集你需要關注一下

          Flink生產(chǎn)環(huán)境TOP難題與優(yōu)化,阿里巴巴藏經(jīng)閣YYDS

          Flink CDC我吃定了耶穌也留不住他!| Flink CDC線上問題小盤點

          我們在學習Spark的時候,到底在學習什么?

          在所有Spark模塊中,我愿稱SparkSQL為最強!

          硬剛Hive | 4萬字基礎調(diào)優(yōu)面試小總結

          數(shù)據(jù)治理方法論和實踐小百科全書

          標簽體系下的用戶畫像建設小指南

          4萬字長文 | ClickHouse基礎&實踐&調(diào)優(yōu)全視角解析

          【面試&個人成長】2021年過半,社招和校招的經(jīng)驗之談

          大數(shù)據(jù)方向另一個十年開啟 |《硬剛系列》第一版完結

          我寫過的關于成長/面試/職場進階的文章

          當我們在學習Hive的時候在學習什么?「硬剛Hive續(xù)集」

          瀏覽 120
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠躁日日躁夜夜躁A片无码 | 一级特黄录像免费播放下载软件 | 亚洲精品92内射 | 视频一区二区77在线 | 夜夜操夜夜操 |