hive學習之三:專案中的hive優化實踐

anickname發表於2016-05-17
1.小表放入記憶體,在map端join,並不是所有聚合操作都在reducer端操作,慎重使用mapjoin,一般行數小於2000行,大小小於1M
2.hive.groupby.skewindata變數從上面groupby語句可以看出,這個變數是用於控制負載均衡的。當資料出現傾斜時,如果該變數設定為true,那麼Hive會自動進行負載均衡。當該變數設為
  true時候,不可以使用distinct關鍵字對多列聯合去重
3.合併小檔案
   hive.merge.mapfiles = true是否和並 Map 輸出檔案,預設為 True
   hive.merge.mapredfiles = false是否合併 Reduce 輸出檔案,預設為 False
   hive.merge.size.per.task = 256*1000*1000合併檔案的大小。
4.Order by 實現全域性排序,一個reduce實現,效率低
  Sort by 實現部分有序,單個reduce輸出的結果是有序的,效率高,通常和DISTRIBUTE BY關鍵字一起使用(DISTRIBUTE BY關鍵字 可以指定map 到 reduce端的分發key)
  CLUSTER BY col1 等價於DISTRIBUTE BY col1 SORT BY col1.
  distinct把所有資料傳送到一個reducer上,資料傾斜嚴重。特別是count(distinct field1)使用group by代替,設定多個reducer
5.SQL並行執行優化:
  set hive.exec.parallel=true;--任務並行執行
  set hive.exec.parallel.thread.number=16;--並行執行的執行緒數量
  set hive.groupby.skewindata=true;--防止資料傾斜
  set mapred.reduce.tasks=60;--設定任務執行的reduce數量
  set hive.auto.convert.join=false;--是否自動將common join轉換為map join
  set hive.ignore.mapjoin.hint=false;--列印mapjoin
  set hive.exec.compress.intermediate=true; --中間結果壓縮
  set hive.execution.engine=tez;--更改hive底層執行的計算框架                             
  set hive.exec.reducers.max=200;--任務最大的reduce數量(預設999)
  set hive.map.aggr = true;--map端做聚合(預設true)
 
  -----map數量控制---------------------
  set mapred.max.split.size=100000000;--超過100m不足128M切分
  set mapred.min.split.size.per.node=100000000;--超過100m,切分
  set mapred.min.split.size.per.rack=100000000;--超過100m,切分
  set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
  -----reduce數量控制-----------------
  set hive.exec.reducers.bytes.per.reducer=500000000;--每個reduce任務執行的資料量,預設1G。
6.只有一個reduce的場景:
  a、沒有group by 的彙總
  b、order by
  c、笛卡爾積

7.寫SQL要先了解資料本身的特點,如果有join ,group操作的話,要注意是否會有資料傾斜,如果出現資料傾斜,應當做如下處理:
set hive.exec.reducers.max=200;
set mapred.reduce.tasks= 200;---增大Reduce個數
set hive.groupby.mapaggr.checkinterval=100000 ;--這個是group的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體資料量設定
set hive.groupby.skewindata=true; --如果是group by過程出現傾斜 應該設定為true
set hive.skewjoin.key=100000; --這個是join的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體資料量設定
set hive.optimize.skewjoin=true;--如果是join 過程出現傾斜 應該設定為true

7.檔案壓縮,看HQL是IO密集型的任務還是CPU密集型的任務,通常更高的壓縮比帶來更多的解壓縮CPU消耗,但能夠減小MR傳輸的資料量降低磁碟空間和IO操作。
  相反,壓縮比低,解壓縮快MR執行跟快。
 
8.SQL執行順序:
(8)SELECT (9)DISTINCT  (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
  
一些linux命令:
1.linux檢視大小
du -sh *
2.檢視hdfs儲存在本地檔案的路徑
hdfs-site.xml中
  <property>
      <name>dfs.datanode.data.dir</name>
      <value>/hadoop/hdfs/data</value>
    </property>
3.若刪除了hive的庫,如warehouse,例如使用的使用者是hdfs,則在下面中可以找到
hadoop fs -ls /user/hdfs/.Trash,找到後通過hadoop fs -mv 命令移動到原來的位置
4.lsof -i:port
5.修改hive列名:alter table table_name  change column filed1 field2 field1_type
alter table mid change column val value string;
6.hive增加分割槽
load data local inpath '/home/hdfs/spdb/datas/SAS_ATPT/dt=20160101/000000_0' overwrite into table SAS_ATPT partition(dt='20160101')

相關文章