1. 程式人生 > >hive的操作及優化

hive的操作及優化

hive

  • hive案例

    1、基站掉線率統計
        需求
            統計出掉線率最高的前10基站
        資料
            record_time:通話時間
            imei:基站編號
            cell:手機編號
            drop_num:掉話的秒數
            duration:通話持續總秒數
        步驟
            建表
                注意欄位型別和rowformat
                根據需求生成相應的結果表
            load資料
            寫sql,找出掉線率最高的基站
    2、wordcount
        建表
            原始表
                create table docs(line string);
            結果表
                create table wc(word string, totalword int);
        載入資料
            load data local inpath '/tmp/wc' into table docs;
        統計資料
        查詢結果
    
  • hive引數

    hive當中的引數、變數,都是以名稱空間開頭
    通過${}方式進行引用,其中system、env下的變數必須以字首開頭
    hive 引數設定方式
        修改配置檔案
            載入資料
            修改配置檔案 ${HIVE_HOME}/conf/hive-site.xml
        key-value
            啟動hive cli時,通過--hiveconf key=value的方式進行設定
        使用set命令
            進入cli之後,通過使用set命令設定
    hive set命令
        在hive CLI控制檯可以通過set對hive中的引數進行查詢、設定
        set設定:
            set hive.cli.print.header=true;
        set檢視
            set hive.cli.print.header
        hive引數初始化配置
            當前使用者家目錄下的.hiverc檔案
            如:   ~/.hiverc
            如果沒有,可直接建立該檔案,將需要設定的引數寫到該檔案中,hive啟動執行時,會載入改檔案中的配置。
        hive歷史操作命令集
            ~/.hivehistory
    
  • 動態分割槽

    開啟支援動態分割槽
        set hive.exec.dynamic.partition=true;
            預設:false
        set hive.exec.dynamic.partition.mode=nostrict;
            預設:strict(至少有一個分割槽列是靜態分割槽)
            嚴格模式
    相關引數
        set hive.exec.max.dynamic.partitions.pernode;
            每一個執行mr節點上,允許建立的動態分割槽的最大數量(100)
        set hive.exec.max.dynamic.partitions;
            所有執行mr節點上,允許建立的所有動態分割槽的最大數量(1000)
        set hive.exec.max.created.files;
            所有的mr job允許建立的檔案的最大數量(100000)
    載入資料
        from psn21
        insert overwrite table psn22 partition(age, sex)  
        select id, name, likes, address, age, sex distribute by age, sex;
    
  • hive分桶

    什麼是hive分桶
        分桶表是對列值取雜湊值的方式,將不同資料放到不同檔案中儲存。
        對於hive中每一個表、分割槽都可以進一步進行分桶。
        由列的雜湊值除以桶的個數來決定每條資料劃分在哪個桶中。
    適用場景
        做資料抽樣
        map-join
    怎麼用
        開啟支援分桶
            set hive.enforce.bucketing=true;
            注意
                一次作業產生的桶(檔案數量)和reduce task個數一致。
        往分桶表中載入資料
            insert into table bucket_table select columns from tbl;
            insert overwrite table bucket_table select columns from tbl;
    如何進行抽樣查詢
        select * from bucket_table tablesample(bucket 1 out of 4 on columns);
        tablesample語法
            TABLESAMPLE(BUCKET x OUT OF y)
                x:表示從哪個bucket開始抽取資料
                y:必須為該表總bucket數的倍數或因子
        example
            當表總bucket數為32時
            TABLESAMPLE(BUCKET 2 OUT OF 16),抽取哪些資料?
                共抽取2(32/16)個bucket的資料,抽取第2、第18(16+2)個bucket的資料
            TABLESAMPLE(BUCKET 3 OUT OF 256),抽取哪些資料?
                第三個桶的1/8個bucket的資料
    
  • Lateral View

    為什麼要用LV
        因為hql不支援一條語句中使用多個UDTF函式
    LV的使用
        Lateral View用於和UDTF函式(explode、split)結合來使用。
        首先通過UDTF函式拆分成多行,再將多行結果組合成一個支援別名的虛擬表。
        主要解決在select使用UDTF做查詢過程中,查詢只能包含單個UDTF,不能包含其他欄位、以及多個UDTF的問題
    example
        統計人員表中共有多少種愛好、多少個城市?
            select count(distinct(myCol1)), count(distinct(myCol2)) from psn2 
            LATERAL VIEW explode(likes) myTable1 AS myCol1 
            LATERAL VIEW explode(address) myTable2 AS myCol2, myCol3;
    
  • hive檢視

    特點
        和關係型資料庫中的普通檢視一樣,hive也支援檢視
        不支援物化檢視
            oracle有
        只能查詢,不能做載入資料操作
        檢視的建立,只是儲存一份元資料,查詢檢視時才執行對應的子查詢
        view定義中若包含了ORDER BY/LIMIT語句,當查詢檢視時也進行ORDER BY/LIMIT語句操作,view當中定義的優先順序更高
        view支援迭代檢視
    檢視操作
        建立檢視
            CREATE VIEW [IF NOT EXISTS] [db_name.]view_name 
              [(column_name [COMMENT column_comment], ...) ]
              [COMMENT view_comment]
              [TBLPROPERTIES (property_name = property_value, ...)]
              AS SELECT ... ;
        查詢檢視
            select colums from view;
        刪除檢視
            DROP VIEW [IF EXISTS] [db_name.]view_name;
    
  • hive索引

    目的
        優化查詢以及檢索效能
    索引操作
        建立索引
            指定索引表
                create index t1_index on table psn2(name) 
                as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild 
                in table t1_index_table;
            預設索引表
                create index t1_index on table psn2(name) 
                as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild;
        查詢索引
            show index on psn2;
        重建索引
            ALTER INDEX t1_index ON psn2 REBUILD;
        刪除索引
            DROP INDEX IF EXISTS t1_index ON psn2;
    
  • hive執行方式

    四種執行方式
        命令列方式cli:控制檯模式
        指令碼執行方式(實際生產環境中用最多)
        JDBC方式:hiveserver2
        web GUI介面 (hwi、hue等)
    Hive在CLi模式中
        與hdfs互動
            執行執行dfs命令
            例:dfs –ls /
        與Linux互動
            !開頭
            例: !pwd
    hive指令碼執行方式
        hive -e ""
        hive -e "">aaa
            覆蓋重定向
        hive -S -e "">aaa
            靜默模式
        hive -f file
        hive -i /home/my/hive-init.sql
        hive> source file (在hive cli中執行)
    
  • hive gui介面

    下載原始碼包apache-hive-*-src.tar.gz
    將hwi war包放在$HIVE_HOME/lib/
        製作方法:將hwi/web/*裡面所有的檔案打成war包
        cd apache-hive-1.2.1-src/hwi/web
        jar -cvf hive-hwi.war *
    複製tools.jar(在jdk的lib目錄下)到$HIVE_HOME/lib下
    修改hive-site.xml
            <name>hive.hwi.listen.host</name>
            <value>0.0.0.0</value>
            <name>hive.hwi.listen.port</name>
            <value>9999</value>
            <name>hive.hwi.war.file</name>
            <value>lib/hive-hwi.war</value>
    啟動hwi服務(埠號9999)
        hive --service hwi
    瀏覽器通過以下連結來訪問
        http://node03:9999/hwi/
    
  • hive許可權管理

    三種許可權模型
        基於儲存的授權
            可以對Metastore中的元資料進行保護,但是沒有提供更加細粒度的訪問控制(例如:列級別、行級別)。
        基於SQL標準的Hive授權
            完全相容SQL的授權模型,推薦使用該模式。
            除支援對於使用者的授權認證,還支援角色role的授權認證
                role可理解為是一組許可權的集合,通過role為使用者授權
                一個使用者可以具有一個或多個角色
                預設包含另種角色:public、admin
        hive預設授權
            設計目的僅僅只是為了防止使用者產生誤操作,而不是防止惡意使用者訪問未經授權的資料。
    
  • hive優化

    核心思想
        把Hive SQL 當做Mapreduce程式去優化
    有些SQL不會轉為mr執行
        select僅查詢本表字段
        where僅對本表字段做條件過濾
    顯示SQL的執行計劃
        Explain 顯示執行計劃
        EXPLAIN [EXTENDED] query
    hive的執行方式
        本地模式
            對於小檔案,處理速度快,避免了許多資源排程環節
            開啟本地模式:
                set hive.exec.mode.local.auto=true;
            hive.exec.mode.local.auto.inputbytes.max預設值為128M
                表示載入檔案的最大值,若大於該配置仍會以叢集方式來執行!
        叢集模式
    平行計算
        通過設定以下引數開啟並行模式
            set hive.exec.parallel=true;
            注意
                hive.exec.parallel.thread.number
                    一次SQL計算中允許並行執行的job個數的最大值
                最大值應根據叢集來確定
                    並行太多需要叢集的效能越高
                    注意叢集的承載能力
    嚴格模式
        通過設定以下引數開啟嚴格模式
            set hive.mapred.mode=strict;
            (預設為:nonstrict非嚴格模式)
            防止使用者的誤操作
        查詢限制
            1、對於分割槽表,必須新增where對於分割槽欄位的條件過濾;
                防止全表掃描
            2、order by語句必須包含limit輸出限制;
                order by只有一個reduce
            3、限制執行笛卡爾積的查詢。
                開發中不常用笛卡爾積
    排序
        Order By
            對於查詢結果做全排序,只允許有一個reduce處理
            當資料量較大時,應慎用。嚴格模式下,必須結合limit來使用
        Sort By
            對於單個reduce的資料進行排序
            區域性有序
        Distribute By
            分割槽排序,經常和Sort By結合使用
            兩者結合可以做到全域性有序
        Cluster By
            相當於 Sort By + Distribute By
            Cluster By不能通過asc、desc的方式指定排序規則
            可通過 distribute by column sort by column asc|desc 的方式
    join
        Join計算時,將小表(驅動表)放在join的左邊
            優先將小表載入到記憶體
        Map Join
            SQL方式,在SQL語句中新增MapJoin標記(mapjoin hint)
                SELECT  /*+ MAPJOIN(smallTable) */  smallTable.key,  bigTable.value 
                FROM  smallTable  JOIN  bigTable  ON  smallTable.key  =  bigTable.key;
            開啟自動的MapJoin
                自動的mapjoin
                通過修改以下配置啟用自動的mapjoin
                    set hive.auto.convert.join = true;
                    該引數為true時,Hive自動對左邊的表統計量,如果是小表就加入記憶體,即對小表使用Map join
                    相關配置引數
                        hive.mapjoin.smalltable.filesize
                            大表小表判斷的閾值,如果表的大小小於該值則會被載入到記憶體中執行
                        hive.ignore.mapjoin.hint
                            預設值:true;是否忽略mapjoin hint 即mapjoin標記
                        hive.auto.convert.join.noconditionaltask
                            預設值:true;將普通的join轉化為普通的mapjoin時,是否將多個mapjoin轉化為一個mapjoin
                        hive.auto.convert.join.noconditionaltask.size
                            將多個mapjoin轉化為一個mapjoin時,其表的最大值
    Side聚合
        通過設定以下引數開啟在Map端的聚合
            set hive.map.aggr=true
        相關配置引數
            hive.groupby.mapaggr.checkinterval
                map端group by執行聚合時處理的多少行資料(預設:100000)
            hive.map.aggr.hash.min.reduction
                進行聚合的最小比例(預先對100000條資料做聚合,若聚合之後的資料量/100000的值大於該配置0.5,則不會聚合)
            hive.map.aggr.hash.percentmemory
                map端聚合使用的記憶體的最大值
            hive.map.aggr.hash.force.flush.memory.threshold
                map端做聚合操作是hash表的最大可用內容,大於該值則會觸發flush
            hive.groupby.skewindata
                是否對GroupBy產生的資料傾斜做優化,預設為false
    控制map及reduce數量
        控制map用的較少
            mapred.max.split.size
                一個split的最大值,即每個map處理檔案的最大值
            mapred.min.split.size.per.node
                一個節點上split的最小值
            mapred.min.split.size.per.rack
                一個機架上split的最小值
        控制reduce用的較多
            mapred.reduce.tasks
                強制指定reduce任務的數量
            hive.exec.reducers.bytes.per.reducer
                每個reduce任務處理的資料量
            hive.exec.reducers.max
                每個任務最大的reduce數
    jvm重用
        適用場景
            1、小檔案個數過多
            2、task個數過多
        設定
            通過 set mapred.job.reuse.jvm.num.tasks=n; 來設定
        缺點
            設定開啟之後,task插槽會一直佔用資源,不論是否有task執行,直到所有的task即整個job全部執行完成時,才會釋放所有的task插槽資源!