为什么创建类 DataWritable?
【揭秘hive常见面试题(一)-13】
如何实现统计手机流量?
【揭秘hive常见面试题(一)-13】
对比 hive 与 mapreduce 统计手机流量的区别?
【揭秘hive常见面试题(一)-13】
如今有 10 个文件夹,每个文件夹都有 1000000 个 url.如今让你找出top1000000url
不思考歪斜,功能,运用 2 个 job,第一个 job 直接用 filesystem 读取 10 个文件夹作为
map 输入,url 做 key,reduce 计算个 url 的 sum,下一个 job map 顶用 url 作 key,运用-sum 作二次排序,reduce 中取 top10000000第二种方法,建 hive 表 A,挂分区 channel,每个文件夹是一个分区.select x.url,x.c from(select url,count(1) as c from A where channel ='' group byurl)x order by x.c desc limie 1000000;
hive 的物理模型跟传统数据库的不同
hive 底层与数据库交互原理
Hive和Hbase有各自不同的特征:hive是高延迟、结构化和面向分析的,hbase是低延迟、非结构化和面向编程的。Hive数据仓库在hadoop上是高延迟的。Hive集成Hbase就是为了使用hbase的一些特性。
Hive集成HBase可以有效利用HBase数据库的存储特性,如行更新和列索引等。在集成的过程中注意维持HBase jar包的一致性。Hive集成HBase需要在Hive表和HBase表之间建立映射关系,也就是Hive表的列(columns)和列类型(column types)与HBase表的列族(column families)及列限定词(column qualifiers)建立关联。每一个在Hive表中的域都存在于HBase中,而在Hive表中不需要包含所有HBase中的列。HBase中的RowKey对应到Hive中为选择一个域使用:key来对应,列族(cf:)映射到Hive中的其它所有域,列为(cf:cq)。
有一个 1G 大小的一个文件,里面每一行是一个词,词的大小不超过 16 字节,内存限制大小是 1M。返回频数最高的 100 个词。
方案:顺序读文件中,对于每个词 x,取 hash(x)%5000,然后按照该值存到 5000 个小文
件(记为 x0,x1,…x4999)中。这样每个文件大概是 200k 左右。如果其中的有的文件超过了 1M 大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过 1M。对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用 trie 树/hash_map 等),并取出出现频率最大的 100 个词(可以用含 100 个结 点的最小堆),并把 100 个词及相应的频率存入文件,这样又得到了 5000 个文件。下一步就是把这 5000 个文件进行归并(类似与归并排序)的过程了。
hive 中的压缩格式 RCFile、TextFile、SequenceFile 各有什么区别?以上 3 种格式一样大的文件哪个占用空间大小
你们的 hive 处理数据能达到的指标是多少?
Hive分桶
在实际生产环境中,每一个表都可能存储很多的数据,如果直接进行join,通过笛卡尔积会造成大量的shuffle溢出,会延迟job完成时间甚至内存不足的想象,那么就可以对两个表先进行分桶,然后在join。这样就可以大大减少笛卡尔积
Hive内部表和外部表的区别:
1、导入数据的时候:
外部表是复制,内部表是剪切
2、删除表的时候:
外部表只删除元数据,数据仍然保留
内部表会删除元数据和数据
Hive中的UDF
先开发一个java类,继承UDF,并重载evaluate方法
常用的hive分析函数
1、row_number:行号递增
2、rank:行号递增,如果有相等的,相当的部分行号一样。然后下面直接递增N
3、dense_rank:行号递增,相等的行号仍然递增
join中出现数据倾斜优化
hive.optimize.skewjoin=true;
如果join过程中出现了数据倾斜,应该设置为true
set hive.skewjoin.key=100000;
这个是join的键对应的记录条数超过这个值则会进行优化,优化措施:正常是只有一个job的,优化后会有两个job。当数据量达到100000以上的时候,hive会在启动一个job,然后将原有的数据的key加上的一个随机数,将数据打乱。这样数据就会分不到不同的节点上计算。在原打乱的基础上在做一次计算,然后启动一个job,恢复原来的key,在做一次计算。
Hive中的mapjoin
就是将小表加载到缓存中,这样所有的节点都可以访问到这个小表
开启方式:
set hive.auto.convert.join=true;
hive.mapjoin.smalltable.filesize默认值是25Mb
这个是自动判断的,当文件小于25M的时候,自动启动
或者这样使用:手动
select /+ mapjoin(A)/ f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802)
其中A表是小表,B表是大表,这样让join发生在map端
mapjoin的使用场景:
1、关联操作中有一张小表
2、不等值的链接操作
mapjoin最好是手动操作
hive bucket join
1、两个表以相同的方式划分桶
2、两个表的桶的个数是倍数关系
create table order(cid int , price float) clustered by (cid) into 32 buckets;
create table customer(id int , first string) clustered by(id) into 32 buckets;
select price from order t join customer s on t.cid=s.id;
关于where和join的优化
优化前:
select o* from order o join customer c on o.cid=c.id where o.time='2017-01-01'
优化后:
select o.* from (select cid from order where time='2016-01-01') o join customer c on o.cid=c.id;
优化前是先join后再通过where进行过滤,这样并没有减轻reduce的压力。
优化后是先在map端执行where,过滤数据,然后在join。这样就会降低计算量
Hive group by优化
1、hive.groupby.skewindata=true;
如果group by过程出现倾斜,应该设置为true
2、set hive.groupby.mapagger.checkinterval=100000;
group对应的键对应的记录条数超过这个值则会进行优化,这个仍然是启动两个job
hive的表优化
1、分区
‘表’相当于一个大目录,分区就是在这个大目录下面的小目录
分区包括静态分区和动态分区
静态分区:就是在建表的时候指定分区的
如果数据量量多,一个分区需要一个insert,就会很麻烦,所以可以使用动态分区
动态分区:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
默认值:strict
描述:strict是避免全分区字段是动态的,必须有至少一个分区字段是指定有值的
hive job的优化 并行化执行
hive执行过程中的job是按照默认的顺序来执行的,如果没有太大的依赖关系,最好并行执行,减少执行的时间,每个查询被hive转化成多个阶段,有些阶段关联性不大,则可以并行执行,减少执行时间。
set hive.exec.parallel=true;
set hive.exec.parallel.thread.numbe=16(默认8);