使用 hint 來改寫執行計劃
顯然 fctOrder 表的記錄要比 employees 多上好幾個數量級。將 fctOrders 放在第一位導致第一遍 map 跑批的資料量增大。因此當儘量用小表在 join 的左邊。
有了 hint, 就不必在意 join 兩表的順序了:
使用配置來改寫執行計劃
同樣是將 join 的兩表進行位置互換,這一次是使用配置。
所有的配置需要固化下來,都可以放在 $HOME/.hiverc 檔案中
使用 partition
針對大資料量的事實表做分割槽,比如按月做分割槽,那麼查詢每個月的基本資料量時,只需掃描單個分割槽即可,而不必要掃描整張大表。假設極限情況下,所有其他月的資料並不夠多,而只是其中一個月的資料量很大,那麼只有對這個月的資料進行有效分割槽之後,才能真正達到高效。
分割槽本質上還是分而治之,但如果分割槽資料並不是分佈在每臺叢集中的伺服器上,僅僅是儲存在其中一臺伺服器上,分割槽也沒有太大意義,在這種情況下就變成了單例項的資料庫。除非分割槽在分散式叢集中,也是均攤到各個叢集節點伺服器上。
使用 sequencefile 儲存格式
當hdfs上的檔案小於一個hdfs block的時候,被稱作小檔案。處理小檔案並不是 hadoop 的專長,同樣也不是 hive 的專長。
碰到這類問題,就需要將小檔案統統歸檔到一個大檔案裡面去,比如 sequencefile.
比如 /user/hive/warehouse/logs 下面很多 10MB 的 log 檔案,我們可以用 text file 來將整個目錄下的檔案都從邏輯上歸檔到一張表 temp_table 中去,再建立一張 sequenfile 表,將 temp_table中的資料裝載到 sequencefile 中。
使用 ORCfile 儲存:
官方說明,predicate-push-down, compression 等技術使得 ORCfile 在 join 兩張大表的時候,更能體現效能的優勢。來自 hortonworks 官方的說明, 對每張表都採用 ORCfile 格式儲存,已經是個不爭的技巧。
使用 Apache Tez 執行引擎
Tez 是基於 YARN 的一個計算引擎。配置 Tez 對於 Hive 有益的地方在於有效利用 YARN 帶來的比 MapReduce 1 優異的效能。其中之一就是有效利用每臺節點伺服器的記憶體,防止浪費,也有效防止因資料得不到充足的記憶體而故障造成的任務延遲。
在最終的結果生成時,有效利用並行輸出也是提高整體 HQL 的一環。
使用 vectorization 技術
在計算類似 scan, filter, aggregation 的時候, vectorization 技術以設定批處理的增量大小為 1024 行單次來達到比單條記錄單次獲得更高的效率。
成本最佳化器:傳統的資料庫,成本最佳化器做出最最佳化的執行計劃是依據統計資訊來計算的。Hive 的成本最佳化器也一樣。
以上開啟了 cost based optimization.
下面的命令重新計算了統計資訊:
語句級別的調優
比如: row_number 可以解決 Hive 級別的 Join 導致的網路傳輸速度慢的問題,但在 sql server 中就不能這麼用了。
這類應用在 sql server 和 Hive 中各自的效率是不一樣的。
使用
這裡最重要的思想便是將所有的計算拆成利用多個 reducer 進行計算的模式,而不是將全部的計算都壓到一個 reducer.
good:SELECT GROUP BY userId, gender bad: SELECT GROUP BY gender,userId
userId 在前面,可利用多個 reducer 進行分組運算,而 gender 則之多會應用 3 個 reduer. 一是男,二是女,三未知。
每組前 N 個的應用場景,在資料分析領域常用。在 SQL 中一般用視窗函式 Rank()Over(Partition By)來計算。
而 Hive 中為了更好的發揮分散式運算,需要利用多個 reducer 來處理。
使用 predicate pushdown (PPD) 在儲存級別執行過濾
使用 hint 來改寫執行計劃
顯然 fctOrder 表的記錄要比 employees 多上好幾個數量級。將 fctOrders 放在第一位導致第一遍 map 跑批的資料量增大。因此當儘量用小表在 join 的左邊。
有了 hint, 就不必在意 join 兩表的順序了:
使用配置來改寫執行計劃
同樣是將 join 的兩表進行位置互換,這一次是使用配置。
所有的配置需要固化下來,都可以放在 $HOME/.hiverc 檔案中
使用 partition
針對大資料量的事實表做分割槽,比如按月做分割槽,那麼查詢每個月的基本資料量時,只需掃描單個分割槽即可,而不必要掃描整張大表。假設極限情況下,所有其他月的資料並不夠多,而只是其中一個月的資料量很大,那麼只有對這個月的資料進行有效分割槽之後,才能真正達到高效。
分割槽本質上還是分而治之,但如果分割槽資料並不是分佈在每臺叢集中的伺服器上,僅僅是儲存在其中一臺伺服器上,分割槽也沒有太大意義,在這種情況下就變成了單例項的資料庫。除非分割槽在分散式叢集中,也是均攤到各個叢集節點伺服器上。
使用 sequencefile 儲存格式
當hdfs上的檔案小於一個hdfs block的時候,被稱作小檔案。處理小檔案並不是 hadoop 的專長,同樣也不是 hive 的專長。
碰到這類問題,就需要將小檔案統統歸檔到一個大檔案裡面去,比如 sequencefile.
比如 /user/hive/warehouse/logs 下面很多 10MB 的 log 檔案,我們可以用 text file 來將整個目錄下的檔案都從邏輯上歸檔到一張表 temp_table 中去,再建立一張 sequenfile 表,將 temp_table中的資料裝載到 sequencefile 中。
使用 ORCfile 儲存:
官方說明,predicate-push-down, compression 等技術使得 ORCfile 在 join 兩張大表的時候,更能體現效能的優勢。來自 hortonworks 官方的說明, 對每張表都採用 ORCfile 格式儲存,已經是個不爭的技巧。
使用 Apache Tez 執行引擎
Tez 是基於 YARN 的一個計算引擎。配置 Tez 對於 Hive 有益的地方在於有效利用 YARN 帶來的比 MapReduce 1 優異的效能。其中之一就是有效利用每臺節點伺服器的記憶體,防止浪費,也有效防止因資料得不到充足的記憶體而故障造成的任務延遲。
在最終的結果生成時,有效利用並行輸出也是提高整體 HQL 的一環。
使用 vectorization 技術
在計算類似 scan, filter, aggregation 的時候, vectorization 技術以設定批處理的增量大小為 1024 行單次來達到比單條記錄單次獲得更高的效率。
cost based query optimization成本最佳化器:傳統的資料庫,成本最佳化器做出最最佳化的執行計劃是依據統計資訊來計算的。Hive 的成本最佳化器也一樣。
以上開啟了 cost based optimization.
下面的命令重新計算了統計資訊:
語句級別的調優
比如: row_number 可以解決 Hive 級別的 Join 導致的網路傳輸速度慢的問題,但在 sql server 中就不能這麼用了。
這類應用在 sql server 和 Hive 中各自的效率是不一樣的。
避免使用 SELECT COUNT(Distinct field) FROM tblTable使用
這裡最重要的思想便是將所有的計算拆成利用多個 reducer 進行計算的模式,而不是將全部的計算都壓到一個 reducer.
慎重考慮用於分組的笛卡爾運算:good:SELECT GROUP BY userId, gender bad: SELECT GROUP BY gender,userId
userId 在前面,可利用多個 reducer 進行分組運算,而 gender 則之多會應用 3 個 reduer. 一是男,二是女,三未知。
Each-Top-N 的求解每組前 N 個的應用場景,在資料分析領域常用。在 SQL 中一般用視窗函式 Rank()Over(Partition By)來計算。
而 Hive 中為了更好的發揮分散式運算,需要利用多個 reducer 來處理。
使用 predicate pushdown (PPD) 在儲存級別執行過濾