Hive的metastore的三种模式
-
内嵌Derby⽅式
这个是Hive默认的启动模式,⼀般⽤于单元测试,这种存储⽅式有⼀个缺点:在同⼀时间只能有⼀个进程连接使⽤数据库。
-
Local⽅式
本地MySQL
-
Remote⽅式
远程MySQL,⼀般常⽤此种⽅式
Hive 内部表和外部表的区别
建表时带有external关键字为外部表,否则为内部表
内部表和外部表建表时都可以⾃⼰指定location
删除表时,外部表不会删除对应的数据,只会删除元数据信息,内部表则会删除
其他⽤法是⼀样的
- 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个阶段:
- Hive使⽤Antlr实现语法解析.根据Antlr制定的SQL语法解析规则,完成SQL语句的词法/语法解析,将SQL转为抽象语法树AST.
- 遍历AST,⽣成基本查询单元QueryBlock.QueryBlock是⼀条SQL最基本的组成单元,包括三个部分:输⼊源,计算过程,输出.
- 遍历QueryBlock,⽣成OperatorTree.Hive最终⽣成的MapReduce任务,Map阶段和Reduce阶段均由 OperatorTree组成。Operator就是在Map阶段或者Reduce阶段完成单⼀特定的操作。QueryBlock⽣成 Operator Tree就是遍历上⼀个过程中⽣成的QB和QBParseInfo对象的保存语法的属性.
- 优化OperatorTree.⼤部分逻辑层优化器通过变换OperatorTree,合并操作符,达到减少MapReduce Job,减少shuffle数据量的⽬的
- OperatorTree⽣成MapReduce Job.遍历OperatorTree,翻译成MR任务.
- 对输出表⽣成MoveTask
- 从OperatorTree的其中⼀个根节点向下深度优先遍历
- ReduceSinkOperator标示Map/Reduce的界限,多个Job间的界限遍历其他根节点,遇过碰到JoinOperator合并MapReduceTask
- ⽣成StatTask更新元数据
- 剪断Map与Reduce间的Operator的关系
- 优化任务. 使⽤物理优化器对MR任务进⾏优化,⽣成最终执⾏任务
Hive UDF 简单介绍
在Hive中,⽤户可以⾃定义⼀些函数,⽤于扩展HiveQL的功能,⽽这类函数叫做UDF(⽤户⾃定义函数)。UDF分为两⼤类:UDAF(⽤户⾃定义聚合函数)和UDTF(⽤户⾃定义表⽣成函数)。
Hive有两个不同的接⼝编写UDF程序。⼀个是基础的UDF接⼝,⼀个是复杂的GenericUDF接⼝。
- org.apache.hadoop.hive.ql. exec.UDF 基础UDF的函数读取和返回基本类型,即Hadoop和Hive的基本类型。如,Text、IntWritable、LongWritable、DoubleWritable等。
- 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://lrting.top/backend/4071/