hive面试题汇总

2022-03-11 08:21:54 浏览数 (1)

Hive的metastore的三种模式

  • 内嵌Derby⽅式 这个是Hive默认的启动模式,⼀般⽤于单元测试,这种存储⽅式有⼀个缺点:在同⼀时间只能有⼀个进程连接使⽤数据库。
  • Local⽅式 本地MySQL
  • Remote⽅式 远程MySQL,⼀般常⽤此种⽅式

Hive 内部表和外部表的区别

建表时带有external关键字为外部表,否则为内部表

内部表和外部表建表时都可以⾃⼰指定location

删除表时,外部表不会删除对应的数据,只会删除元数据信息,内部表则会删除

其他⽤法是⼀样的

  1. Hive 四种排序⽅式的区别

order by:order by 是要对输出的结果进⾏全局排序,这就意味着只有⼀个reducer才能实现(多个reducer⽆法保证全局有序)但是当数据量过⼤的时候,效率就很低。如果在严格模式下(hive.mapred.mode=strict),则必须配合limit使⽤

sort by:sort by 不是全局排序,只是在进⼊到reducer之前完成排序,只保证了每个reducer中数据按照指定字段的有序性,是局部排序。配置mapred.reduce.tasks=nums可以对输出的数据执⾏归并排序。可以配合limit使⽤,提⾼性能

distribute by:distribute by 指的是按照指定的字段划分到不同的输出reduce⽂件中,和sort by⼀起使⽤时需要注意, distribute by必须放在前⾯

cluster by:cluster by 可以看做是⼀个特殊的distribute by sort by,它具备⼆者的功能,但是只能实现倒序排序的⽅式,不能指定排序规则为asc 或者desc

Hive中⼤表join⼩表的优化⽅法

在⼩表和⼤表进⾏join时,将⼩表放在前边,效率会⾼,hive会将⼩表进⾏缓存

Hive中join都有哪些

Hive中除了⽀持和传统数据库中⼀样的内关联(JOIN)、左关联(LEFT JOIN)、右关联(RIGHT JOIN)、全关联(FULL JOIN),还⽀持左半关联(LEFT SEMI JOIN)

  • 内关联(JOIN) 只返回能关联上的结果。
  • 左外关联(LEFT OUTER JOIN) 以LEFT OUTER JOIN关键字前⾯的表作为主表,和其他表进⾏关联,返回记录和主表的记录数⼀致,关联不上的字段置为NULL。
  • 右外关联(RIGHT OUTER JOIN) 和左外关联相反,以RIGTH OUTER JOIN关键词后⾯的表作为主表,和前⾯的表做关联,返回记录数和主表⼀致,关联不上的字段为NULL。
  • 全外关联(FULL OUTER JOIN) 以两个表的记录为基准,返回两个表的记录去重之和,关联不上的字段为NULL。
  • LEFT SEMI JOIN 以LEFT SEMI JOIN关键字前⾯的表为主表,返回主表的KEY也在副表中的记录
  • 笛卡尔积关联(CROSS JOIN) 返回两个表的笛卡尔积结果,不需要指定关联键。

Hive SQL 是怎样解析成 MR job 的?

主要分为6个阶段:

  1. Hive使⽤Antlr实现语法解析.根据Antlr制定的SQL语法解析规则,完成SQL语句的词法/语法解析,将SQL转为抽象语法树AST.
  2. 遍历AST,⽣成基本查询单元QueryBlock.QueryBlock是⼀条SQL最基本的组成单元,包括三个部分:输⼊源,计算过程,输出.
  3. 遍历QueryBlock,⽣成OperatorTree.Hive最终⽣成的MapReduce任务,Map阶段和Reduce阶段均由 OperatorTree组成。Operator就是在Map阶段或者Reduce阶段完成单⼀特定的操作。QueryBlock⽣成 Operator Tree就是遍历上⼀个过程中⽣成的QB和QBParseInfo对象的保存语法的属性.
  4. 优化OperatorTree.⼤部分逻辑层优化器通过变换OperatorTree,合并操作符,达到减少MapReduce Job,减少shuffle数据量的⽬的
  5. OperatorTree⽣成MapReduce Job.遍历OperatorTree,翻译成MR任务.
    • 对输出表⽣成MoveTask
    • 从OperatorTree的其中⼀个根节点向下深度优先遍历
    • ReduceSinkOperator标示Map/Reduce的界限,多个Job间的界限遍历其他根节点,遇过碰到JoinOperator合并MapReduceTask
    • ⽣成StatTask更新元数据
    • 剪断Map与Reduce间的Operator的关系
  6. 优化任务. 使⽤物理优化器对MR任务进⾏优化,⽣成最终执⾏任务

Hive UDF 简单介绍

在Hive中,⽤户可以⾃定义⼀些函数,⽤于扩展HiveQL的功能,⽽这类函数叫做UDF(⽤户⾃定义函数)。UDF分为两⼤类:UDAF(⽤户⾃定义聚合函数)和UDTF(⽤户⾃定义表⽣成函数)。

Hive有两个不同的接⼝编写UDF程序。⼀个是基础的UDF接⼝,⼀个是复杂的GenericUDF接⼝。

  1. org.apache.hadoop.hive.ql. exec.UDF 基础UDF的函数读取和返回基本类型,即Hadoop和Hive的基本类型。如,Text、IntWritable、LongWritable、DoubleWritable等。
  2. org.apache.hadoop.hive.ql.udf.generic.GenericUDF 复杂的GenericUDF可以处理Map、List、Set类型。

HMaster宕机的时候,哪些操作还能正常⼯作

对表内数据的增删查改是可以正常进⾏的,因为hbase client 访问数据只需要通过 zookeeper 来找到 rowkey 的具体 region 位置即可。

但是对于创建表/删除表等的操作就⽆法进⾏了,因为这时候是需要HMaster介⼊,并且region的拆分、合并、迁移等操作也都⽆法进⾏了。

Impala 和 hive 的查询有哪些区别

Impala是基于Hive的⼤数据实时分析查询引擎,直接使⽤Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中。并且impala兼容Hive的sql解析,实现了Hive的SQL语义的⼦集,功能还在不断的完善 中。

Impala相对于Hive所使⽤的优化技术

1、没有使⽤ MapReduce进⾏并⾏计算,虽然MapReduce是⾮常好的并⾏计算框架,但它更多的⾯向批处理模式,⽽不是⾯向交互式的SQL执⾏。与MapReduce相⽐:Impala把整个查询分成⼀执⾏计划树,⽽不是⼀连串的MapReduce任务,在分发执⾏计划后,Impala使⽤拉式获取 数据的⽅式获取结果,把结果数据组成按执⾏树流式传递汇集,减少的了把中间结果写⼊磁盘的步骤,再从磁盘读取数据的开销。Impala使⽤服务的⽅式避免每次执⾏查询都需要启动的开销,即相⽐Hive没了MapReduce启动时间。

2、使⽤LLVM产⽣运⾏代码,针对特定查询⽣成特定代码,同时使⽤Inline的⽅式减少函数调⽤的开销,加快执⾏效率。

3、充分利⽤可⽤的硬件指令(SSE4.2)。

4、更好的IO调度,Impala知道数据块所在的磁盘位置能够更好的利⽤多磁盘的优势,同时Impala⽀持直接数据块读取和本地代码计算checksum。

5、通过选择合适的数据存储格式可以得到最好的性能(Impala⽀持多种存储格式)。

6、最⼤使⽤内存,中间结果不写磁盘,及时通过⽹络以stream的⽅式传递。

本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://cloud.tencent.com/developer/article/1954475

0 人点赞