1、Hive的架构
2、Hive的特点
- 数据存储位置
Hive的数据存储在hdfs上,元数据可以存储在指定的地方比如mysql,PostgreSQL等。 - 数据更新
Hive处理数据时一般不对数据进行改写,因为它不支持行级别的增删操作,如果要进行更新数据,一般可以通过分区或者表直接覆盖。 - 执行效率
Hive 执行延迟较高。虽然在小数据量时传统数据库延迟更低,但是当数据规模大到超过传统数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。 - 数据规模
Hive 支持大规模的数据计算,通常是PB级别的数据
3、内部表和外部表的区别?
- 内部表(MANAGED_TABLE):内部表其实就是管理表,当我们删除一个管理表时,Hive 也会删除这个表中数据。因此管理表不适合和 其他工具共享数据。
- 外部表(EXTERNAL_TABLE):删除该表并不会删除掉原始数据,删除的是表的元数据。
4、Hive怎么处理数据倾斜
倾斜原因: map输出数据按Key Hash分配到reduce中,由于key分布不均匀、或者业务数据本身的特点。等原因造成的reduce上的数据量差异过大。
- key分布不均匀
- 业务数据本身的特性
- SQL语句造成数据倾斜
解决方案 - 参数调节
hive.map.aggr=true
hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定为true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;
第二个MR Job在根据预处理的数据结果按照 Group By Key 分布到Reduce中(这个过程可以保证相同的 Group By Key 被分布到同一个Reduce中),最后完成最终的聚合操作。 - SQL语句调节:
1)选用join key 分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表join的时候,数据量相对变小的效果。
2)大小表Join: 使用map join让小的维度表(1000条以下的记录条数)先进内存。在Map端完成Reduce。
3)大表Join大表:把空值的Key变成一个字符串加上一个随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终的结果。
4)count distinct大量相同特殊值:count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在做后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union.
5、请说明hive中 sort by ,order by ,cluster by ,distribute by各代表什么意思。
order by :会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序).只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
sort by :不是全局排序,其在数据进入reducer前完成排序
distribute by :按照指定的字段对数据进行划分输出到不同的reduce中
cluster by :除了具有distribute by 的功能外还兼具sort by 的功能
6、Hive的分组方式
row_number() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页
dense_rank() 是连续排序,两个第二名仍然跟着第三名
rank() 是跳跃排序的,两个第二名下来就是第四名
7、Hive 的 sort by 和 order by 的区别
order by 会对输入数据做全局排序,只有一个 reduce,数据量较大时,很慢。
sort by 不是全局排序,只能保证每个 reduce 有序,不能保证全局有序,需设置mapred.reduce.tasks>1。