版权声明:本文为博主原创文章,未经博主允许不得转载。 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插槽资源!