1 hive表關聯查詢,如何解決數據傾斜的問題?
傾斜緣由:
map輸出數據按key Hash的分配到reduce中,因爲key分佈不均勻、業務數據自己的特、建表時考慮不周、等緣由形成的reduce 上的數據量差別過大。
1)、key分佈不均勻;
2)、業務數據自己的特性;
3)、建表時考慮不周;
4)、某些SQL語句自己就有數據傾斜;
如何避免:對於key爲空產生的數據傾斜,能夠對其賦予一個隨機值。
解決方案
1>.參數調節:
hive.map.aggr = true
hive.groupby.skewindata=true
有數據傾斜的時候進行負載均衡,當選項設定位true,生成的查詢計劃會有兩個MR Job。第一個MR Job中,Map的輸出結果集合會隨機分佈到Reduce中,每一個Reduce作部分聚合操做,並輸出結果,這樣處理的結果是相同的Group By Key有可能被分發到不一樣的Reduce中,從而達到負載均衡的目的;第二個MR Job再根據預處理的數據結果按照Group By Key 分佈到 Reduce 中(這個過程能夠保證相同的 Group By Key 被分佈到同一個Reduce中),最後完成最終的聚合操做。
2>.SQL 語句調節:
1)、選用join key分佈最均勻的表做爲驅動表。作好列裁剪和filter操做,以達到兩表作join 的時候,數據量相對變小的效果。
2)、大小表Join:
使用map join讓小的維度表(1000 條如下的記錄條數)先進內存。在map端完成reduce.
4)、大表Join大表:
把空值的key變成一個字符串加上隨機數,把傾斜的數據分到不一樣的reduce上,因爲null 值關聯不上,處理後並不影響最終結果。
5)、count distinct大量相同特殊值:
count distinct 時,將值爲空的狀況單獨處理,若是是計算count distinct,能夠不用處理,直接過濾,在最後結果中加1。若是還有其餘計算,須要進行group by,能夠先將值爲空的記錄單獨處理,再和其餘計算結果進行union。
Hive 原理
1. 用戶提交查詢等任務給Driver。
2. 編譯器得到該用戶的任務Plan。
3. 編譯器Compiler根據用戶任務去MetaStore中獲取須要的Hive的元數據信息。
4. 編譯器Compiler獲得元數據信息,對任務進行編譯,先將HiveQL轉換爲抽象語法樹,而後將抽象語法樹轉換成查詢塊,將查詢塊轉化爲邏輯的查詢計劃,重寫邏輯查詢計劃,將邏輯計劃轉化爲物理的計劃(MapReduce), 最後選擇最佳的策略。
5. 將最終的計劃提交給Driver。
6. Driver將計劃Plan轉交給ExecutionEngine去執行,獲取元數據信息,提交給JobTracker或者SourceManager執行該任務,任務會直接讀取HDFS中文件進行相應的操做。
7. 獲取執行的結果。
8. 取得並返回執行結果。
Mapreduce和hive的區別和聯繫
http://www.360doc.com/content/14/1208/10/20466010_431234360.shtml
hive是基於hadoop的數據倉庫。
那麼爲何說hive是基於Hadoop的呢?
之因此說hive是構建在Hadoop之上的數據倉庫,簡單的說是由於:
①數據存儲在hdfs上
②數據計算用mapreduce
Hive是一種創建在Hadoop文件系統上的數據倉庫架構,並對存儲在HDFS中的數據進行分析和管理;它能夠將結構化的數據文件映射爲一張數據庫表,並提供完整的 SQL 查詢功能,能夠將 SQL 語句轉換爲 MapReduce 任務進行運行,經過本身的 SQL 去查詢分析須要的內容,這套 SQL 簡稱 Hive SQL(HQL),使不熟悉MapReduce 的用戶也能很方便地利用 SQL 語言對數據進行查詢、彙總、分析。
Hive不支持更改數據的操做,Hive基於數據倉庫,提供靜態數據的動態查詢。其使用類SQL語言,底層通過編譯轉爲MapReduce程序,在hadoop上運行,數據存儲在HDFS上。
簡述有Hive以後,爲什麼還要學mapreduce
https://blog.csdn.net/WYpersist/article/details/79981385
你以爲Hive是否支持in函數
https://blog.csdn.net/WYpersist/article/details/79980945
當輸入hive 命令時卡住了,你認爲是爲何,從哪些方面考慮
Cpu ,網絡,內存
說出Hive 安裝數據時,mysql和Derby的區別,爲何安裝mysql ,或爲何安裝Derby,分別有什麼優缺陷
https://blog.csdn.net/WYpersist/article/details/80101617
簡述Hive 桶表什麼,什麼做用,舉例
Hive 分區是什麼,什麼做用,該怎麼分區
Hive 動態分區和靜態分區
Hive 分區重命名
說出Hive 導入數據的過程(表有多個分區,桶)
Hive 排序
什麼是Hive join
說說你所理解的Hive 視圖操做
Hive 序列函數
簡述Hive 自定義函數
知道Hive UDF是什麼嗎,什麼做用,爲何要用
簡述Hive 優缺點
https://blog.csdn.net/wypersist/article/details/79999401
說說Hive內部表和外部表分別是什麼?爲何要建外部表?
Hive內部表和外部表的區別
https://blog.csdn.net/wypersist/article/details/80314022
Hive 建立內部表時,會將數據移動到數據倉庫指向的路徑;若建立外部表,僅記錄數據所在的路徑,不對數據的位置作任何改變。在刪除表的時候,內部表的元數據和數據會被一塊兒刪除,而外部表只刪除元數據,不刪除數據。這樣外部表相對來講更加安全些,數據組織也更加靈活,方便共享源數據。
須要注意的是傳統數據庫對錶數據驗證是 schema on write(寫時模式),而 Hive 在load時是不檢查數據是否符合schema的,hive 遵循的是 schema on read(讀時模式),只有在讀的時候hive才檢查、解析具體的數據字段、schema。
讀時模式的優點是load data 很是迅速,由於它不須要讀取數據進行解析,僅僅進行文件的複製或者移動。
寫時模式的優點是提高了查詢性能,由於預先解析以後能夠對列創建索引,並壓縮,但這樣也會花費要多的加載時間。
被external修飾的是內部表(managed table),被external修飾的爲外部表(external table);
區別:
內部表數據由Hive自身管理,外部表數據由HDFS管理;
內部表數據存儲的位置是hive.metastore.warehouse.dir(默認:/user/hive/warehouse),外部表數據的存儲位置由本身制定;
刪除內部表會直接刪除元數據(metadata)及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除;
對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分區進行修改,則須要修復(MSCK REPAIR TABLE table_name;)
https://blog.csdn.net/wypersist/article/details/80314022
什麼是數據傾斜
Hive 表類型有哪些
https://blog.csdn.net/dsl200970/article/details/70245916
Mapreduce和hive的區別和聯繫
http://www.360doc.com/content/14/1208/10/20466010_431234360.shtml
hive是基於hadoop的數據倉庫。
那麼爲何說hive是基於Hadoop的呢?
之因此說hive是構建在Hadoop之上的數據倉庫,簡單的說是由於:
①數據存儲在hdfs上
②數據計算用mapreduce
Hive是一種創建在Hadoop文件系統上的數據倉庫架構,並對存儲在HDFS中的數據進行分析和管理;它能夠將結構化的數據文件映射爲一張數據庫表,並提供完整的 SQL 查詢功能,能夠將 SQL 語句轉換爲 MapReduce 任務進行運行,經過本身的 SQL 去查詢分析須要的內容,這套 SQL 簡稱 Hive SQL(HQL),使不熟悉MapReduce 的用戶也能很方便地利用 SQL 語言對數據進行查詢、彙總、分析。
Hive不支持更改數據的操做,Hive基於數據倉庫,提供靜態數據的動態查詢。其使用類SQL語言,底層通過編譯轉爲MapReduce程序,在hadoop上運行,數據存儲在HDFS上。
說出Hive 如何調優,提高效率
https://blog.csdn.net/WYpersist/article/details/80030499
https://blog.csdn.net/WYpersist/article/details/80030921
https://blog.csdn.net/WYpersist/article/details/80032327
說出Hive 數據清洗的過程
Hive 編程題
五、海量數據分佈在100臺電腦上,統計出這批數據的TOP10。(寫出核心算法思路)
六、背景:現有商品,買家,賣家三個實體,實現一個小小型的交易系統
1)給出表結構設計
2)帥選出沒有買過商品的用戶
3)寫出sql 語句,帥選出僅僅購買了麪粉的用戶
HIVE與RDBMS關係數據庫的區別
一、hive存儲的數據量比較大,適合海量數據,適合存儲軌跡類歷史數據,適合用來作離線分析、數據挖掘運算,
事務性較差,實時性較差
rdbms通常數據量相對來講不會太大,適合事務性計算,實時性較好,更加接近上層業務
二、hive的計算引擎是hadoop的mapreduce,存儲是hadoop的hdfs文件系統,
rdbms的引擎由數據庫本身設計實現例如mysql的innoDB,存儲用的是數據庫服務器本地的文件系統
三、hive因爲基於hadoop因此存儲和計算的擴展能力都很好,
rdbms在這方面比較弱,好比orcale的分表和擴容就很頭疼
四、hive表格沒有主鍵、沒有索引、不支持對具體某一行的操做,適合對批量數據的操做,不支持對數據的update操做,
更新的話通常是先刪除表而後從新落數據
rdbms事務性強,有主鍵、索引,支持對具體某一行的增刪改查等操做
五、hive的SQL爲HQL,與標準的RDBMS的SQL存在有很多的區別,相對來講功能有限
rdbms的SQL爲標準SQL,功能較爲強大。
Hive分析窗口函數
Hive 數據傾斜類
Hive 取前10條數據
https://blog.csdn.net/wypersist/article/details/80318305
Hive 取最小成績的記錄和最大的記錄
Hive 四種排序
https://blog.csdn.net/wypersist/article/details/80314431
Hive 時間函數
Mysql 和hive的區別
Hive 的sql語句和mysql 的sql語句有什麼不一樣
Mysql和derby
Hive 將元數據存儲在 RDBMS 中,通常經常使用 MySQL 和 Derby。默認狀況下,Hive 元數據保存在內嵌的 Derby 數據庫中,只能容許一個會話鏈接,只適合簡單的測試。實際生產環境中不適用, 爲了支持多用戶會話,則須要一個獨立的元數據庫,使用 MySQL 做爲元數據庫,Hive 內部對 MySQL 提供了很好的支持。
內置的derby主要問題是併發性能不好,能夠理解爲單線程操做。
Derby還有一個特性。更換目錄執行操做,會找不到相關表等
好比在/usr下執行建立表,在/usr下能夠找到這個表。在/etc下執行查找這個表,就會找不到 。
Hive存儲格式
https://blog.csdn.net/ly19901208/article/details/77049824
Hive 工做原理
https://blog.csdn.net/wypersist/article/details/80174647
A全部的hive任務都會有reducer的執行嗎?
答:不是,因爲當前hive的優化,使得通常簡單的任務不會去用reducer任務;只有稍微複雜的任務纔會有reducer任務
舉例:使用select * from person ; 就不會有reducer
使用from person p
insert into person2 select p.age,p.name
B\hive解決了什麼問題
答:多用戶的使用,解決了元數據的衝突,hive2代理管理元數據
區別hive2,hiveserver2是服務,而hive是一個交互窗口
C\設置時鐘同步的定時任務
crontab -e
*/10 * * * * /usr/sbin/ntpdate time.nist.gov
D\hive的函數:UDF UDAF UDTF的區別
UDF: 單行進入,單行輸出
UDAF: 多行進入,單行輸出
UDTF: 單行輸入,多行輸出
E\hive的優化
答:優化能夠從幾個方面着手:
1. 好的模型設計事半功倍。
2. 解決數據傾斜問題。
3. 減小 job 數。
4. 設置合理的 map reduce 的 task 數,能有效提高性能。(好比,10w+級別的計算,用
160 個 reduce,那是至關的浪費,1 個足夠)。
5. 本身動手寫 sql 解決數據傾斜問題是個不錯的選擇。set hive.groupby.skewindata=true;
這是通用的算法優化,但算法優化老是漠視業務,習慣性提供通用的解決方法。 Etl 開發
人員更瞭解業務,更瞭解數據,因此經過業務邏輯解決傾斜的方法每每更精確,更有效。
6. 對 count(distinct)採起漠視的方法,尤爲數據大的時候很容易產生傾斜問題,不抱僥倖
心理。本身動手,豐衣足食。
7. 對小文件進行合併,是行至有效的提升調度效率的方法,假如咱們的做業設置合理的文
件數,對雲梯的總體調度效率也會產生積極的影響。
8. 優化時把握總體,單個做業最優不如總體最優。
F優化:
1\排序優化
Order by 實現全局排序,一個 reduce 實現,效率低
Sort by 實現部分有序,單個 reduce 輸出的結果是有序的,效率高,一般和
DISTRIBUTE BY 關鍵字一塊兒使用(DISTRIBUTE BY 關鍵字 能夠指定 map 到 reduce
端的分發 key)
CLUSTER BY col1 等價於 DISTRIBUTE BY col1 SORT BY col1
2\分區優化
3\合併小文件
4\避免空值關聯,多用聚合函數,多用臨時表
html