HIVE相关学习
前面記一些特定的命令:
從文件中讀sql命令并將結果存儲到xxb.txt:hive -f tmp_sql.sql > xxb.txt
?
?
抄一波百度百科
?
Hive:一種數據倉庫基礎構架,基于Hadoop 的
Hive is a data warehouse infrastructure based on Hadoop.
?
Hive 不適合及時響應的操作,不提供實時的查詢和基于行級的數據更新操作。Hive 的最佳使用場合是大數據集的批處理作業,例如,網絡日志分析。
Hive is not suitable for the timely response of the operation, does not provide real-time query and based on row level data update operation. Hive is suitable for large data sets of batch operations, for example, network log analysis.
?
?
首先,Hive 沒有專門的數據存儲格式,也沒有為數據建立索引,用戶可以非常自由的組織 Hive 中的表,只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據。 其次,Hive 中所有的數據都存儲在 HDFS 中,Hive 中包含以下數據模型:表(Table),外部表(External Table),分區(Partition),桶(Bucket)。 Hive 中的 Table 和數據庫中的 Table 在概念上是類似的,每一個 Table 在 Hive 中都有一個相應的目錄存儲數據。例如,一個表 pvs,它在 HDFS 中的路徑為:/wh/pvs,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的數據倉庫的目錄,所有的 Table 數據(不包括 External Table)都保存在這個目錄中。 Partition 對應于數據庫中的 Partition 列的密集索引,但是 Hive 中 Partition 的組織方式和數據庫中的很不相同。在 Hive 中,表中的一個 Partition 對應于表下的一個目錄,所有的 Partition 的數據都存儲在對應的目錄中。例如:pvs 表中包含 ds 和 city 兩個 Partition,則對應于 ds = 20090801, ctry = US 的 HDFS 子目錄為:/wh/pvs/ds=20090801/ctry=US;對應于 ds = 20090801, ctry = CA 的 HDFS 子目錄為;/wh/pvs/ds=20090801/ctry=CA Buckets 對指定列計算 hash,根據 hash 值切分數據,目的是為了并行,每一個 Bucket 對應一個文件。將 user 列分散至 32 個 bucket,首先對 user 列的值計算 hash,對應 hash 值為 0 的 HDFS 目錄為:/wh/pvs/ds=20090801/ctry=US/part-00000;hash 值為 20 的 HDFS 目錄為:/wh/pvs/ds=20090801/ctry=US/part-00020 External Table 指向已經在 HDFS 中存在的數據,可以創建 Partition。它和 Table 在元數據的組織上是相同的,而實際數據的存儲則有較大的差異。 Table 的創建過程和數據加載過程(這兩個過程可以在同一個語句中完成),在加載數據的過程中,實際數據會被移動到數據倉庫目錄中;之后對數據對訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。 External Table 只有一個過程,加載數據和創建表同時完成(CREATE EXTERNAL TABLE …LOCATION),實際數據是存儲在 LOCATION 后面指定的 HDFS 路徑中,并不會移動到數據倉庫目錄中。當刪除一個 External Table 時,僅刪除元數據,表中的數據不會真正被刪除。
Hive常用優化方法
編輯1、join連接時的優化:當三個或多個以上的表進行join操作時,如果每個on使用相同的字段連接時只會產生一個mapreduce。 2、join連接時的優化:當多個表進行查詢時,從左到右表的大小順序應該是從小到大。原因:hive在對每行記錄操作時會把其他表先緩存起來,直到掃描最后的表進行計算 3、在where字句中增加分區過濾器。 4、當可以使用left semi join 語法時不要使用inner join,前者效率更高。原因:對于左表中指定的一條記錄,一旦在右表中找到立即停止掃描。 5、如果所有表中有一張表足夠小,則可置于內存中,這樣在和其他表進行連接的時候就能完成匹配,省略掉reduce過程。設置屬性即可實現,set hive.auto.covert.join=true; 用戶可以配置希望被優化的小表的大小 set hive.mapjoin.smalltable.size=2500000; 如果需要使用這兩個配置可置入$HOME/.hiverc文件中。 6、同一種數據的多種處理:從一個數據源產生的多個數據聚合,無需每次聚合都需要重新掃描一次。 例如:insert overwrite table student select * from employee; insert overwrite table person select * from employee; 可以優化成:from employee insert overwrite table student select * insert overwrite table person select * 7、limit調優:limit語句通常是執行整個語句后返回部分結果。set hive.limit.optimize.enable=true; 8、開啟并發執行。某個job任務中可能包含眾多的階段,其中某些階段沒有依賴關系可以并發執行,開啟并發執行后job任務可以更快的完成。設置屬性:set hive.exec.parallel=true; 9、hive提供的嚴格模式,禁止3種情況下的查詢模式。 a:當表為分區表時,where字句后沒有分區字段和限制時,不允許執行。 b:當使用order by語句時,必須使用limit字段,因為order by 只會產生一個reduce任務。 c:限制笛卡爾積的查詢。 10、合理的設置map和reduce數量。 11、jvm重用。可在hadoop的mapred-site.xml中設置jvm被重用的次數。
總結
- 上一篇: Hadoop命令学习
- 下一篇: Emeditor如何跳转到某一行