1. 程式人生 > >hive-索引(加優化)

hive-索引(加優化)

1,索引

hive只有有限的索引功能,hive中沒有普通關係型資料庫中鍵的概念,但是還是可以對一些欄位建立索引來加速某些操作的,一張表的索引資料在另一張表中,說到索引我們也可以理解為這是hive提供的優化功能。他可以減少MapReduce的輸入資料量,因為在索引表中他把每個欄位的索引和偏移量都計算出來,可以說查詢的速度是很快了,尤其是大資料集

1,建立索引我們有一個現成的表zxz_5.

建立格式:
create index zxz_5_index
on table zxz_5 (nid)
as 'bitmap'
with deferred rebuild

注意:as 後面跟的是索引處理器,bitmap處理器普遍應用於排重後值較小的列;
    with deferred rebuild  他是必須要填加的

2,我們建立出來的索引表可以show tables; 檢視

  他的預設顯示就是:default__zxz_5_zxz_5_index__  後面是我們指定的索引表名他們是連在一塊的

3,desc show 這個索引表,裡面就是指定的索引列,和一些桶欄位和偏移量;如果你指定的表是分割槽表,那麼他會顯示分割槽索引而不是全域性索引了。

4,我們要把重建索引表才能得到索引資料;

  普通重建索引: alter index zxz_5_index on zxz_5 rebuild

  分割槽重建索引:alter index zxz_5_index on zxz_5   partition (year="2018")  rebuild

5,我們顯示一些索引表的資訊:

     show fromated index on zxz_5;

6,刪除索引表:

  drop index zxz_5_index on table zxz_5; 注意:如果我們把原表刪除索引表會自動刪除

2,hive優化:

MapReduce
-------------------
    Map : map -> partition -> sortAndSpill() --> Combiner
    hive.exec.compress.output=false                        //輸出檔案是否壓縮,預設false
    hive.exec.compress.intermediate=false                //啟用中間檔案是否壓縮,預設false
    hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec    //設定壓縮編解碼器,預設空
    hive.intermediate.compression.type                    //壓縮型別

hive調優
------------------
    1.使用explain解析查詢結果
        $beeline>explain [extended] select sum(id) from customers ; 


limit優化
--------------------
1.
  <property>
    <name>hive.limit.optimize.enable</name>
    <value>false</value>
    <description>Whether to enable to optimization to trying a smaller subset of data for simple LIMIT first.</description>
  </property>
  
  <property>
    <name>hive.limit.row.max.size</name>
    <value>100000</value>
    <description>When trying a smaller subset of data for simple LIMIT, how much size we need to guarantee each row to have at least.</description>
  </property>
  <property>
    <name>hive.limit.optimize.limit.file</name>
    <value>10</value>
    <description>When trying a smaller subset of data for simple LIMIT, maximum number of files we can sample.</description>
  </property>
  <property>
    <name>hive.limit.optimize.fetch.max</name>
    <value>50000</value>
    <description>
      Maximum number of rows allowed for a smaller subset of data for simple LIMIT, if it is a fetch query. 
      Insert queries are not restricted by this limit.
    </description>
  </property>
  <property>
    <name>hive.limit.pushdown.memory.usage</name>
    <value>0.1</value>
    <description>
      Expects value between 0.0f and 1.0f.
      The fraction of available memory to be used for buffering rows in Reducesink operator for limit pushdown optimization.
    </description>
  </property>
  <property>
    <name>hive.limit.query.max.table.partition</name>
    <value>-1</value>
    <description>
      This controls how many partitions can be scanned for each partitioned table.
      The default value "-1" means no limit.
    </description>
  </property>

hadoop
-------------------
    1.local
        nothing!
        不需要啟動單獨程序。
        所有的java程式都在一個jvm中執行。

    2.偽分散式
        
    3.完全分散式
        

本地模式:
------------------------
    hive.exec.mode.local.auto=true                        //
    hive.exec.mode.local.auto.inputbytes.max=134217728    //
    hive.exec.mode.local.auto.input.files.max=4            //

JVM重用
------------------------
    [不推薦]
    SET mapred.job.reuse.jvm.num.tasks=5;                //在mapreduce-1使用,yarn不適用。
    com.it18zhang.myhadoop273_1211.join.reduce.App

    [yarn]
    //mapred-site.xml
    mapreduce.job.ubertask.enable=false                    //啟用當個jvm按序一些列task,預設false
    mapreduce.job.ubertask.maxmaps=9                    //最大map數>=9,只能調低。
    mapreduce.job.ubertask.maxreduces=1                    //目前只支援1個reduce.
    mapreduce.job.ubertask.maxbytes=128m                //

併發執行
-------------------------
    explain解釋執行計劃,對於沒有固定依賴關係的task,
    可以進行併發執行。
    hive.exec.parallel=true                //啟用mr的併發執行,預設false
    hive.exec.parallel.thread.number=8    //設定併發執行的job數,預設是8.


map端連線
------------------------
    SET hive.auto.convert.join=true;                    //
    SET hive.mapjoin.smalltable.filesize=600000000;        //檔案<= 指定值時可以啟用map連線。
    SET hive.auto.convert.join.noconditionaltask=true;    //不需要在select中使用/*+ streamtable(customers) */暗示.


map bucket端連線
-------------------------
    SET hive.auto.convert.join=true; --default false        //
    SET hive.optimize.bucketmapjoin=true; --default false    //


SkewJoin
-------------------------
    傾斜連線.
    SET hive.optimize.skewjoin=true;        //開啟傾斜優化
    SET hive.skewjoin.key=100000;            //key量超過該值,新的key傳送給未使用的reduce。
    SET hive.groupby.skewindata=true;        //在groupby中使用應用資料傾斜優化,預設false.


analyze
-----------------------
    對錶、partition,column level級別元資料進行統計,作為input傳遞給
    CBO(cost-based Optimizer),會選擇成本最低查詢計劃來執行。
    analyze table customers compute statictics ;
    desc extended customers ;


beeline
---------------------------
    beeline -u jdbc:hive2://            //執行在本地模式下,沒有啟動hiveserver2伺服器。


create table tt (id int,hobbies array<String>,addr struct<province:string,city:string,street:string>,scores map<string,int> ) row format delimited fields terminated by ' ' collection items terminated by ',' map keys terminated by ':' lines terminated by '\n' stored as textfile ;

insert into tt values(1,array('1','2','3'),struct('province':"hebei",'city':'baoding','street':'renmin'),map('a':100,'b':200));

create table stru(id int,a struct<p1:string,p2:string>) row format delimited ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE;

create table map(id int ,a map<string,int>) row format delimited fields terminated by ' ' collection items terminated by ',' map keys terminated by ':' lines terminated by '\n' stored as textfile ;