hive一次加载多个文件_Hive总结

hive一次加载多个文件_Hive总结 hive一次加载多个文件_Hive总结Hive总结一、Hive架构1.架构图2.Hive架构解析1用户接口CLIcli即shell命令。CLI最常用CLI启动的时候会同时启动 一个Hive 副本Client Client是Hive的客户端用户连接HiveServer并指出Hive Server 所在的节点以及在该节点启动它WUIWUI是通过浏览器启动Hive2元数据Hive将元数据存储在数据库中如mysql、derby。Hive的元数据信息包 括表的名字、表的列、分区机器及其属性、表的属性、表的目录等3Driver解释器、编译器、优化器完成HQL的查询语句从词法分析、语法分析、 编译、优化以及查询计划的生成。生成的计划存储在HDFS中并在MR 中调用执行Hive的数据存储在HDFS中大部分的查询计算由MR完成4注意事项Hive会不会转换为MR取决于是否用了聚合函数二、Hive数据倾斜问题优化1.现象当Hive放生数据倾斜的时候我们在使用HQL运行mr的时候可以发现map是100%而reduce卡在99%2.当Hive发生数据倾斜的时候我应该怎么办呢第一种方案数据倾斜五分就是key的数据量非常不均匀我们可以开启map聚合的参数hive.map.aggrture开启之后会把数据现在map端进行聚合当reduce端聚合的时候就只需要聚合map端聚合完的参数就可以了第二种是当大表和小表进行JOIN的时候也可能导致数据倾斜。为了解决这个问题考虑使用到mapjoinmapjoin会把小表全部读入内存中在map阶段直接拿另外一个表的数据和在内存中表的数据进行匹配由于mapjion是在map端进行了join操作省去了reduce的运行所以效率会快很多第三种是当大表和大表join的时候发生数据倾斜具体操作室建立一个numbers表其值只有一列int 行比如从1到10具体值可根据倾斜程度确定然后放大B表10倍再取模join三、分区1.Hive静态分区就是在不开启动态分区的条件下都是静态分区使用方式就是HQL2. Hive动态分区1参数设置· 开启动态分区启用动态分区功能 hive set hive.exec.dynamic.partitiontrue;注hive2.x该参数默认为true1.x为false· 模式设置严选模式/非严选模式设置这个参数为nostricthive set hive.exec.dynimac.partiton.modenostrict默认情况下是strict2动态分区的相关参数hive.exec.max.dynimac.partition.pernode 这个参数表示每个mr执行的节点上能创建的最大分区数量默认100hive.exec.max.dynimac.partition 这个参数表示所有mr执行的节点上能创建的最大分区数量默认1000hive.exec.max.creat.files 这个参数代表所有mr job能创建文件的最大数量3动态分区加载数据的方法第一步创建原数据表第二部load data加载数据到原数据表第三部使用from into table inset into table select 。。。。加载数据4静态分区与动态分区的区别静态分区是手动指定分区的动态分区是根据数据来判断5静态分区结合动态分区使用动静结合使用的话静态分区值必须在动态分区值的前面四、Hive SQL1.外部表和内部表区别在于删除的时候只删除元数据而内部表删除的时候连数据都给删除了2.Hive DDL定义Hive的数据定义语言 LanguageManual DDL1建表语句· 创建普通的表: create table abc( id int ) row format delimited fields terminated by ‘,’ stored as textFile· 创建带有分区的表create table abc( id int ) partitioned by (dt String) row format delimited fields terminated by ‘,’· 创建外表create external table abc( id int ) row format delimited fields terminated by ‘,’ location’/home/hive/text.text’;3.Hive DML定义Hive数据操作语言LanguageManual DML1操作语句HDFS上导入数据load data inpath ‘filePath’ into table table/_name;· 从别的表中导入insert into table table/_name1 [patition(dt ‘…’, value)] select id,name from table/_name2· 多重数据插入from table/_name1 t1table/_name2 t2 insert overwrite table table/_name3 [patition(col1val1,col2val2)] select t1.id, t2.id, …;五、Hive优化1.优化一本地模式· 开启本地模式 hive set hive.exec.mode.local.autotrue· 需要注意的是hive.exec.mode.local.auto.inputbytes.max 这个参数默认 是128M这个值表示了当加载文件的值大于这个值的时候该配置仍 会以集 群来运行默认就是集群运行的当项目上线的时候开启 使 用本地模式 的话小数据小表可以避免提交时间的延迟2.优化二并行计算· 开启并行计算 hive set hive.exec.paralleltrue· 相关参数 hive.exec.parallel.thread.number(一次sql计算中允许并执行的 job 数量)· 需要注意的是并行计算会加大集群的压力3.优化三严格模式· 开启严格模式 hive set hive.mapred.mode strict· 主要是防止一群sql查询将集群压力大大增加· 同时它也有一些限制1、对于分区表必须添加where对于分区字段的 条件过滤 1、orderby语句必须包含limit输出限制 3、限制执行笛卡尔积 查询4.优化四排序· order by 对于查询结果做全排序只允许有一个reduce处理· 需要注意的是当数据过大的时候谨慎使用在严选模式下需要结合limit 来使用· sort by 是对单个reduce的数据进行排序· 只会在每个reducer 中对数据进行排序也就是执行局部排序过程只 能保证每个reducer的输出数据都是有序的但并非全局有序· distribut by 是分区排序经常结合sort by一起使用· cluster by 相当于distribut br sort by· cluster by 默认是倒序排序不能用asc和desc来指定排序规则可以通 过distribute by clumn sort by clumn asc|desc方式来指定排序方式5.优化五JOIN· join时将小表放在join的左边· mapjoin在map端进行join可以省略shuffle和reduce提高性能1实现方式1mapJoin标记sql方式在sql语句中添加mapjoin标记mapjoin hint select //mapjoin(smalltable)//smalltable.key bigTable.value from smallTable join bigTable on smallTable.keybigTable.key2实现方式2开启自动的mapjoin参数配置 自动对小表进行mapjoinhive set hive.auto.convert.jointrue相关参数· hive.mapjoin.smalltable.filesize这个值是大表和小表的判定阀值小于这 个值就会被放入内存· hive.ignore.mapjoin.hint 默认为true是够忽略mapjoin hint· hive.aotu.caonvert.join.noconditionaltask 默认为true将普通的join转 换为mapjoin的时候是否将多个mapjoin转为一个mapjoin· hive.aotu.caonvert.join.noconditionaltask.size 将多个mapjoin转为一个 mapjoin的最大值6.优化六聚合开启map聚合 hive set hive.map.aggrtrue相关参数· hive.groupby.mapaggr.checkinterval map端group by执行聚合时处理的多少行数据默认100000· hive.map.aggr.hash.min.reduction 进行聚合的最小比例预先对100000条数据做聚合若聚合之后的数据量 /100000的值大于该配置0.5则不会聚合· hive.map.aggr.hash.percentmemorymap端聚合使用的内存的最大值· hive.map.aggr.hash.force.flush.memory.threshold map端做聚合操作是hash表的最大可用内容大于该值则会触发flush· hive.groupby.skewindata 是否对GroupBy产生的数据倾斜做优化默认为false7.优化七控制Hive中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数 [Map数量 Reduce数量 ]8.优化八JVM的重用适用场景 1、小文件个数过多 2、task个数过多· 通过 set mapred.job.reuse.jvm.num.tasksn; 来设置n为task插槽个数缺点设置开启之后task插槽会一直占用资源不论是否有task运行直 到所有的task即整个job全部执行完成时才会释放所有的task插槽资源六、Hive函数1.函数自定义1UDF 常用一进一出http://blog.csdn.net/duan19056/article/details/179172531UDF 函数可以直接应用于 select 语句对查询结构做格式化处理后再 输出内容。2编写 UDF 函数的时候需要注意一下几点a自定义 UDF 需要继承 org.apache.hadoop.hive.ql.UDF。b需要实现 evaluate 函数evaluate 函数支持重载。3步骤a把程序打包放到目标机器上去b进入 hive 客户端添加 jar 包hiveadd jar /jar/udf/_test.jar;(清除缓存 时记得删除jar包delete jar //*)c创建临时函数hiveCREATE TEMPORARY FUNCTION add/_example AS ‘hive.udf.Add’;d查询 HQL 语句SELECT add/_example(8, 9) FROM scores;SELECT add/_example(scores.math, scores.art) FROM scores;SELECT add/_example(6, 7, 8, 6.8) FROM scores;e销毁临时函数hive DROP TEMPORARY FUNCTION add/_example;2UDAF聚集函数多进一出多行进一行出如 sum()、min()用在 group by 时1必须继承org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类 Eval uator 实现 UDAFEvaluator 接口)2Evaluator 需要实现 init、iterate、terminatePartial、merge、t erminate 这 几个函数· init():类似于构造函数用于 UDAF 的初始化· iterate():接收传入的参数并进行内部的轮转返回 boolean· terminatePartial():无参数其为 iterate 函数轮转结束后返回轮转数据 类似于 hadoop 的 Combinermerge():接收 terminatePartial 的返回结果 进行数据 merge 操作其返回类型为 boolean·terminate():返回最终的聚集函数结果3UDTF一进多出一进多出如 lateralview explore()使用方式 在HIVE会话中add自定义函数的jar 文件然后创建 function 继 而使用函数 这些函数都是针对单元格值的并不是针对行的。七、Hive数据储存Hive没有专门的存储结构数据表视图元数据等等都可以而且也没有专门的数据存储格式textFile、RCFile都可以的Hive只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符Hive就可以解析数据。那么分割符都有那些呢默认的话是列分隔符“ctrlA”默认行分隔符是“/n”八、Hive表1.Hive表常用的存储格式textfile 默认格式 行存储sequencefile 二进制文件 行存储rcfile 按行分块 按列存储orc 按行分块 按列存储2.Hive索引了解一个表上创建索引创建一个索引使用给定的列表的列作为键3.Hive工作原理首先用户先将任务交给Diver接着编译器获得这个用户的plan并根据这个用户的任务去metaStore获取需要的Hive元数据信息然后进行对任务的编译将HQL先后转换为抽象语法树、查询块、逻辑计划、最后转为物理计划mapreduce最终选择最优方案提交给DiverDiver将这个最优方案转交给excutionengion执行将获得的元数据信息交给jobTracker或者sourceManager执行该任务最终这个任务会直接读取HDFS中的文件进行操作取得并返回结果《网络安全从零到精通全套学习大礼包》96节从入门到精通的全套视频教程免费领取如果你也想通过学网络安全技术去帮助就业和转行我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。网络安全学习路线图想要学习 网络安全作为新手一定要先按照路线图学习方向不对努力白费。对于从来没有接触过网络安全的同学我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线大家跟着这个路线图学习准没错。配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取面试真题/经验以上资料如何领取