一:Hive内部表和外部表的区别?
Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
二:数据倾斜的原因和解决方案?
1.数据倾斜表现:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。
2.原因:key分布不均匀;业务数据本身的特性;建表时考虑不周;某些SQL语句本身就有数据倾斜。
3.Sql表现
join:其中一个表较小,但是key集中,会造成分发到某一个或几个Reduce上的数据远高于平均值;大表与大表,但是分桶的判断字段0值或空值过多,这些空值都由一个reduce处理,也会造成处理非常慢。group by:group by的字段维度过小,某值的数量过多,会造成处理某值的reduce非常耗时。
count distinct:某特殊值过多,处理此特殊值的reduce耗时。
4.解决数据倾斜
参数调节:map端combine聚合hive.map.aggr=true,随机打散负载均衡hive.groupby.skewindata=true。sql调节:大小表关联使用mapjoin,将值为null的情况单独处理;distinct用group by替代;order by用distruibute by sort by代替,因为order by只启一个reduce,会造成性能负荷。
5.性能调节
多次从同一张表取数考虑建立临时表;left semi join替换exists;一些情况下可以使用union all代替join。
三:Hive Sql的编译原理?
1.Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree。
2.遍历AST Tree,抽象出查询的基本组成单元QueryBlock。
3.遍历QueryBlock,翻译为执行操作树OperatorTree。
4.逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量。
5.遍历OperatorTree,翻译为MapReduce任务。
6.物理层优化器进行MapReduce任务的变换,生成最终的执行计划。
四:Hive的权限控制?
当多个用户共同使用hive时,需要对不同角色做不同的权限控制。权限控制主要指底层的hdfs文件操作控制和hive自身对表的授权管理。hive是通过mysql的元数据来控制hive里的权限。
Hive授权的核心是:User,Group,Role。
User:是基于linux用户的user,哪个linux用户使用hive客户端,那个linux用户就是该hive的user。
Group:同样是linux层面上的用户组。
Role:只有角色是在hive里面自己创建的,可以给角色添加权限属性,再把角色赋予给user,这样该用户就拥有了该角色的权限。
五:Hive的元数据管理?
它是元数据服务组件,hive元数据集中存放地。Metastore组件包括两个部分:metastore服务和后台数据的存储。后台数据存储的介质就是关系数据库,例如mysql数据库。Metastore服务是建立在后台数据存储介质之上,并且可以和hive服务进行交互的服务组件,默认情况下,metastore服务和hive服务是安装在一起的,运行在同一个进程当中。也可以把metastore服务从hive服务里剥离出来,metastore独立安装在一个集群里,hive远程调用metastore服务,这样就可以把元数据这一层放到防火墙之后,客户端访问hive服务,就可以连接到元数据这一层,从而提供了更好的管理性和安全保障。使用远程的metastore服务,可以让metastore服务和hive服务运行在不同的进程里,这样也保证了hive的稳定性,提升了hive服务的效率。
参考文献
http://blog.csdn.net/xia_777ling/article/details/72779982
http://blog.csdn.net/lnho2015/article/details/51417880
https://tech.meituan.com/hive-sql-to-mapreduce.html