hive的操作及优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/firstchange/article/details/78578868

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插槽资源!
    

猜你喜欢

转载自blog.csdn.net/firstchange/article/details/78578868