<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>

          Kyuubi 實踐 | 有了它!愛奇藝加速 Hive SQL 遷移 Spark

          共 4771字,需瀏覽 10分鐘

           ·

          2022-07-01 01:03


          Hive 作為愛奇藝數(shù)倉的基礎(chǔ),Hive SQL 是愛奇藝大數(shù)據(jù)平臺目前主要的數(shù)據(jù)處理工具,各個業(yè)務(wù)積累大量的 Hive ETL 任務(wù)。Spark 相對于 MapReduce 有著更為靈活的的計算模型,這使得 Spark 相對于 Hive (on MapReduce) 有更好的性能。 


          經(jīng)過測試對比,我們發(fā)現(xiàn)遷移 Hive SQL 到 Spark 將會帶來很大的性能提升和資源節(jié)省。



          Apache Kyuubi (Incubating) 項目提供一個分布式多租戶的 Spark Thrift Server,相對于 Spark 原生的 Spark Thrift Server 有更好的架構(gòu)優(yōu)勢和更多優(yōu)秀的特性,具體對比可參考:Kyuubi v.s. Spark Thrift JDBC/ODBC Server (STS)



          01
          Hive SQL 遷移 Spark
           1.2 TPCDS 數(shù)據(jù)集 


           1.1 對比


          大數(shù)據(jù)平臺中已有大量穩(wěn)定運行的 Hive SQL 任務(wù),為了在遷移的過程中提高用戶遷移意愿,降低與用戶的溝通成本,我們需要保證遷移后 Spark SQL 的穩(wěn)定性以及數(shù)據(jù)準(zhǔn)確性,并盡量減少用戶操作。 

          我們在大數(shù)據(jù)平臺中新增了 Hive SQL 遷移服務(wù),提供一鍵批量雙跑測試和一鍵遷移功能。在遷移前, 我們會對業(yè)務(wù)的 Hive SQL 任務(wù)進(jìn)行批量雙跑測試。改寫業(yè)務(wù) SQL 將輸出替換成臨時庫表,并分別通過 Hive SQL 和 Spark SQL 執(zhí)行。 

          執(zhí)行完成后,對 Hive SQL 和 Spark SQL 的執(zhí)行結(jié)果進(jìn)行校驗,確保遷移后數(shù)據(jù)一致。對每行數(shù)據(jù)進(jìn)行 concat 后計算 crc32 并求和得到 checksum 值,通過對比兩個結(jié)果表的 checksum 值和 count 數(shù),來確定數(shù)據(jù)是否一致。

          select sum(cast(CRC32(concat(*)) as decimal(19,0))) as checksum, count(*) as count 
          from mock_db.mock_table


          通過雙跑測試,我們能夠提前發(fā)現(xiàn) Hive SQL 與 Spark SQL 的一些兼容性問題,以及配置不合理導(dǎo)致任 務(wù)失敗的問題。及時優(yōu)化平臺配置,指導(dǎo)用戶優(yōu)化 SQL 并為任務(wù)提供合適的配置。

           1.2 兼容性適配

          Hive SQL 遷移到 Spark 的過程中,我們遇到了一些語法兼容性的問題,例如:


          • Spark 刪除不存在分區(qū)報錯,而 Hive 中允許刪除不存在分區(qū) 

          • Spark 執(zhí)行 set mapreduce.job.reduces=-1 報錯 

          • 數(shù)字類型與字符串比較,結(jié)果與 Hive 不一致 

          • ..... 


          為了加快遷移的進(jìn)度,減少用戶參與,我們需要兼容部分 Hive 語法。 


          在 Kyuubi 中提供 kyuubi-extension-spark 模塊,維護(hù)Spark SQL的 Extensions,用于優(yōu)化Spark SQL的執(zhí)行計劃,社區(qū)已經(jīng)提供了很多優(yōu)化,詳細(xì)文檔:Auxiliary SQL extension for Spark SQL。我們基于此模塊,為不兼容的語法修改其執(zhí)行計劃,使得與 Hive 保持一致的語義。 


          例如,在 Hive 中由于默認(rèn)的 hive.exec.drop.ignorenonexistent=true 配置,在刪除不存在的表或分區(qū)時不會報錯,但是遷移到 Spark 運行后,出現(xiàn)大量刪除不存在分區(qū)的錯誤。我們在Kyuubi中實現(xiàn)了 DropIgnoreNonexistent 優(yōu)化,改寫 AlterTableDropPartitionCommand/DropTableCommand 等命令的執(zhí)行計劃,將 ifExists 屬性設(shè)置為 true ,從而在刪除不存在分區(qū)時不報錯。 

          Kyuubi提供了只解釋SQL執(zhí)行計劃的運行模式,通過kyuubi.operation.plan.only.mode配置,可以以 PARSE/ANALYZE/OPTIMIZE/PHYSICAL/EXECUTION 的一些模式解釋 SQL 的執(zhí)行計劃而不執(zhí)行它,這樣我們可以快速掃描出有語法兼容問題的一些 SQL。

           1.3 小文件優(yōu)化 

          Hive SQL 遷移 Spark 運行不可避免地會出現(xiàn)小文件的問題。我們使用 Kyuubi 的 Spark Extensions 結(jié)合 Spark AQE 可以有效地控制小文件問題。 

          Kyuubi Spark Extensions 中提供了 RepartitionBeforeWrite 的優(yōu)化,在寫入前插入 repartition 操作,再結(jié)合 AQE 合并小分區(qū),從而實現(xiàn)控制小文件。 

          對于寫入動態(tài)分區(qū)的情況,Kyuubi 中 Repartition 操作指定了動態(tài)分區(qū)字段 ,這樣可以減小動態(tài)分區(qū)導(dǎo)致的小文件。如果動態(tài)分區(qū)數(shù)據(jù)分布不均勻,可能導(dǎo)致部分分區(qū)數(shù)據(jù)傾斜,所以對于動態(tài)分區(qū)寫入 Kyuubi 在 Repartition 時,同時加入了一個隨機數(shù)字段來避免數(shù)據(jù)傾斜。不過這樣由于擴展了分區(qū)字段 的基數(shù),也可能會導(dǎo)致小文件問題。 

          在 spark-defaults.conf 中添加相關(guān)的配置: 


          對于 Spark3.2,Kyuubi 通過在寫入前插入 Rebalance 算子,更好地解決小文件的問題。

          02
          Kyuubi 服務(wù)增強


           2.1 標(biāo)簽化配置  

          對于不同用戶和業(yè)務(wù)的 SQL,由于數(shù)據(jù)量和業(yè)務(wù)處理邏輯存在差異,可能需要對不同的任務(wù)進(jìn)行單獨的 配置優(yōu)化。我們在數(shù)據(jù)開發(fā)平臺上提供了用戶配置參數(shù)的能力,允許用戶對 SQL 任務(wù)添加配置。


          對于同一用戶或者業(yè)務(wù)會存在一些具有相同的特效的一些 SQL,我們提供標(biāo)簽化配置,定義一些標(biāo)簽綁定特有的配置,并在任務(wù)提交時帶上相關(guān)的標(biāo)簽。

          例如,我們定義的部分標(biāo)簽如下:
           
            • Adhoc:用于即席查詢平臺任務(wù),數(shù)據(jù)量小,要求快速響應(yīng)。配置 USER 共享級別的引擎,較大 Driver 內(nèi)存,以及 Spark 任務(wù)搶占策略等。
            • Batch:用于數(shù)據(jù)開發(fā)平臺任務(wù),定時調(diào)度運行,穩(wěn)定要求較高。配置 CONNECTION 級別獨立引 擎,使得任務(wù)完全資源隔離,并添加小文件、AQE 等優(yōu)化配置。
            • User/Business/Custom:允許定義用戶、業(yè)務(wù)或其他自定義標(biāo)簽,綁定特有的一些配置,如:隊列、資源、兼容性適配相關(guān)配置等,降低用戶使用門檻。

          Kyuubi 中已經(jīng)支持了對用戶添加默認(rèn)配置,例如在配置文件中添加 "___bob___.spark.executor.memory=8g" 配置,為 bob 用戶的任務(wù)默認(rèn)指定 8G 的 executor 內(nèi)存,具體使用參考:User Default

          同時,在Kyuubi 的 kyuubi-server-plugin 中,提供了 SessionConfAdvisor 接口,用于為 Session 注入配置。可以將標(biāo)簽配置保存在數(shù)據(jù)庫中,并實現(xiàn) SessionConfAdvisor 接口,根據(jù) Session 配置 的標(biāo)簽從數(shù)據(jù)庫中獲取對應(yīng)的配置

           2.2 SQL 審計 

          Kyuubi 服務(wù)中定義了一些事件,可用于 SQL 審計操作。

          Kyuubi Server 中定義了如下事件:

            • KyuubiServerInfoEvent:Kyuubi Server 啟動、停止事件信息 
            • KyuubiSessionEvent:Session 開啟、關(guān)閉事件,以及連接相關(guān)信息 
            • KyuubiOperationEvent:Kyuubi Operation 執(zhí)行事件,包括了 SQL 執(zhí)行相關(guān)信息  

          目前 Kyuubi 僅實現(xiàn)了 JSON 寫入本地文件的方式采集事件,相關(guān)配置:


          將事件寫入 JSON 文件后,可以借助日志收集插件采集到 Kakfa 中并落地到 ElasticSearch 中,方便后續(xù) 對 SQL 執(zhí)行事件進(jìn)行審計分析。 

          我們在 Kyuubi Server 中通過實現(xiàn)自定義的 EventHandler ,處理 Kyuubi Server 的事件,直接將事件 寫入到 ElasticSearch 中。分析失敗 SQL 執(zhí)行事件的錯誤信息,完善 Spark SQL 運維知識庫,并添加正則匹配分析規(guī)則,匹配執(zhí)行事件的錯誤信息給出對應(yīng)的解決方案,方便用戶自行排障。


          文中文檔可參考:


          • Kyuubi v.s. Spark Thrift JDBC/ODBC Server (STS) ——https://kyuubi.apache.org/docs/latest/overview/kyuubi_vs_thriftserver.html

          • Auxiliary SQL extension for Spark SQL—— https://kyuubi.apache.org/docs/latest/sql/rules.html#

          • DropIgnoreNonexistent——https://github.com/apache/incubator-kyuubi/blob/master/extensions/spark/kyuubi-extension-spark-3-1/src/main/scala/org/apache/kyuubi/sql/DropIgnoreNonexistent.scala

          • User Defaults—— https://kyuubi.apache.org/docs/latest/deployment/settings.html#user-defaults


          ?

           END










          Apache Kyuubi 推特賬號 現(xiàn)已開通

          推特搜索 Apache Kyuubi 或 瀏覽器 打開下方鏈接 

          即可關(guān)注~

          https://twitter.com/KyuubiApache


          還可以加入 Apache Kyuubi Slack

          https://join.slack.com/t/apachekyuubi/shared_invite/zt-1bhswm1n6-n~0wMbkvhsp0WZX0FZXvPA

          和海外開發(fā)者交流互動哦~


          最后

          Kyuubi 在這里提醒大家

          文明上網(wǎng) 科學(xué)上網(wǎng)




           往期精彩 



          · 如何優(yōu)化 Spark 小文件,Kyuubi 一步搞定!

          · Kyuubi on Kubernetes 模式從 0 到 1 部署

          · Become A Committer of Apache Kyuubi



          丨記得點關(guān)注

               

          看到這里記得多多點贊、評論、收藏
          還可以把 Kyuubi 分享給更多朋友~


          瀏覽 200
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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级性爱视频 | 蜜桃传媒视频在线播放 | 国产黄色影视 | 欧美成人性爱可下载视频 | 国产黄色电影在线 |