Hive中Beeline提交的SQL查詢同Hive客戶端提交的SQL查詢處理流程有何異同?

如題,據我所知,Beeline是通過JDBC向Thrift-Server提交查詢請求。

Hive客戶端是通過自己的Driver來提交。

但接下來的流程,希望有對源碼比較熟悉的同學能幫忙梳理一下。


我沒讀過代碼,不過你可以參考下面這張圖:

(圖片來源:http://infolab.stanford.edu/~ragho/hive-icde2010.pdf

  • JDBC和ODBC連接都是通過Thrift Server來接入,然後發送給Driver

  • 而CLI(Beeline也一樣)是直接與Driver直接與Driver交互

貼一張Hive的架構圖吧:

(圖片來源:https://cwiki.apache.org/confluence/display/Hive/Design)

而後面做的事情包括:

  • 詞法分析/語法分析
    • 使用antlr將SQL語句解析成抽象語法樹
  • 語義分析
    • 從Megastore獲取模式信息,驗證SQL語句中隊表名,列名,以及數據類型的檢查和隱式轉換
  • 邏輯計劃生成

    • 生成邏輯計劃--運算元樹
  • 邏輯計劃優化
    • 對算字數進行優化,包括列剪枝,分區剪枝,謂詞下推等
  • 物理計劃生成
    • 將邏輯計劃生成包含由MapReduce任務組成的DAG的物理計劃
  • 物理計劃執行

    • 將DAG發送到Hadoop集群進行執行

這些都是沒有區別的。


1、hive客戶端是在本地做sql的編譯,然後將hql翻譯成mr任務提交到hadoop。而beeline實際上是對SQLLine的封裝,實際上是調用hiveserver2來進行查詢的。

2、從許可權控制角度來講,目前hive的許可權控制有兩種,一種是基於對應hdfs操作許可權的控制機制(Storage Based Authorization in the Metastore Server),一種是符合SQL規範的控制機制(SQL Standards Based Authorization in HiveServer2),前者適合於提供給RD的許可權控制(可以防止別人誤刪你的表),後者適合於提供給hive的BI用戶的許可權控制(可以控制到表或欄位可見級別)。後者更細緻,更符合數據倉庫的許可權控制。但是後者只能用在beeline方式下,不能用在命令行中。

3、hive推薦使用beeline


一個走rpc,一個本進程內調用啊


推薦閱讀:

揭秘:去中心化分散式系統的好與壞
使用Apache Zookeeper分散式部署PHP應用程序
hadoop偽分散式環境如何搭建

TAG:分散式計算 | Hadoop | 分散式 | Hive | Spark |