鸣宇淳:Hive 快速入门实战解析

向作者提问
目前就职于某知名互联网公司,从事大数据研发工作,正在编写《大数据技术·降龙十八掌》一书
查看本场Chat

2017年6月13日,周二晚上8点30分,就职于某知名互联网公司,从事大数据研发工作的鸣宇淳带来了主题为《Hive快速入门》的交流。以下是主持人天怡整理的问答实录,记录了作者和读者间问答的精彩时刻。


内容提要:

  • 请问和Hive类似的工具还有哪些,能否做一个简单的比较和使用场景分析?
  • Hive有什么好的活跃社区推荐?
  • 请问Hive与SparkSQL的目标与实现机制有河主要差异?适用场景有分别吗?
  • 看你写的介绍,Hive适合利用SQL工具处理离线大数据的计算,想咨询一下,离线数据是按照什么规则和要求写进HDFS,以便可以让Hive能够计算的?
  • 想知道如何进行Hive SQL的查询优化,有没有相关书籍推荐?
  • 关于更新目标表,有几种比较好处理方法?
  • 推荐下关于Hive转Mapreduce原理或者优化Hive SQL的书籍或者博客之类的资料?
  • 我们现在正在迁移数据库(从MySQL到Hive上),MySQL有大量的存储过程,请问有什么比较好的处理方式吗?
  • Hive的运维难度相比同类工具,难易程度?
  • 你经历过的使用Hive的项目,数据量大概多大,对应的Hive Query的性能如何?

问:请问和Hive类似的工具还有哪些,能否做一个简单的比较和使用场景分析?

答:和Hive类似的有MapReduce、Pig、Impala。

用MapReduce处理HDFS上的数据更加的灵活,Hive是对MapReduce的封装,最终也是转换为MapReduce程序来执行的,当用Hive灵活性和功能性满足不了需求的时候,可以直接开发MapReduce程序处理数据。比如数据非常不规范、程序员更加精细地控制数据、数据不能映射为二维表。MapReduce实际中用的比较少,因为Hive太好用了。

Pig同样也是对MapReduce程序的封装,最终也是转换为MapReduce程序去执行,但是Pig对数据的规范性要求很低,可以同时处理结构化、半结构化、非结构化的数据,而Hive对数据规范性要求比较高。Pig好像市面上用的人更少了,因为它用起来确实复杂了一些。封装为SQL来实现复杂的功能,确实方便,是一种趋势,不止HiveSQL,SparkSQL等等都向这方面发展。

在对比Hive和Pig的时候,我有一个很有意思的想法,就是猜测Hive为什么命名为Hive(小蜜蜂),Pig为什么命名为Pig(猪),以下纯粹属于我瞎猜,没有任何依据:

<瞎猜开始>

Hive是小蜜蜂,小蜜蜂对食物(数据格式)要求比较高,只采颜色鲜艳的花朵,庞大的蜜蜂群(集群)能采很多花朵(大数据);Pig是猪,猪的特点对食物(数据格式)没有要求,几乎可以吃任何东西,什么都能消化(处理),但是猪确实很聪明(可以优化执行),针对不同的食物(不同格式的数据)采取最优的消化方式(处理方式)。

<瞎猜结束>

Impala也是通过SQL查询大数据的工具,Impala查询非常的快速,可以看做实时交互,这是因为它底层没有采用MapReduce,而是使用分布式查询引擎。Impala适合于查询结果比较小的场景下使用,而Hive适合于输出数据量非常大的场景,实际使用时,Impala通常做为Hive的补充,比如先用Impala做分析结果的少数据量的验证,然后再用Hive进行真正的执行。


问:Hive有什么好的活跃社区推荐?

答:要说社区,还得算强大的Stack Overflow。你可能问的是怎么学习Hive,学习开源技术最好的参考是官方文档,这个是不变的真理。另一个真理是看源代码。可是一个客观的事实对很多人来说英语是个障碍,国外的社区也有这个问题。国内大牛写技术文章的也有很多,看起来容易多了。另外就是看书,我比较喜欢看书,因为书里的知识更系统。再在实际工作中进行印证,确实是个好玩的过程。


问:请问Hive与SparkSQL的目标与实现机制有河主要差异?适用场景有分别吗?

答: Hive SQL是大数据量的离线计算,SparkSQL是实时迭代计算。Hive实现机制实际是MapReduce,执行过程中将中间结果都存入硬盘,还有Shuffle阶段,所以速度很慢。SparkSQL被设计为通过RDD尽量在内存中计算,这是导致它计算快的很重要的一个原因。另外Spark SQL抛弃MapReduce,少了Shuffle,是计算快的主要原因。


问:看你写的介绍,Hive适合利用SQL工具处理离线大数据的计算,想咨询一下,离线数据是按照什么规则和要求写进HDFS,以便可以让Hive能够计算的?

答:线索数据来源,Hive表里的数据来源一般有三类:业务数据的定时接入、日志类数据、离线计算的结果数据。要先定义好了Hive表结构,这个表结构就是写入数据必须遵守的格式规则,在写入数据之前要经过数据清洗,数据清洗是一个数据规范化的过程,去除异常数据、错误数据、重复数据,然后再写入Hive表。这个过程叫做ETL。ETL是抽取(extract)、转换(transform)、加载(load)的过程,从数据源抽取出所需要的数据、经过数据清洗,最终按照预先定义好的格式加载到Hive表里去。总而言之,对于写入Hive表的数据的要求是:符合Hive表定义的格式和没有异常、重复数据的。这里其实体现了一个Hive的局限性,就是hive要求数据是有一定格式的,是有一定格式规范的。这里我想再说明一点,Hive的表结构看上去跟MySQL的表结构很像,是一张二维表,但是不同点是Hive中的数据不用遵守关系型数据库的范式,第一范式都不用遵守,更没有主键、外键约束,也没有索引,它只是一个HDFS上文件内容的一个二维化的映射而已。


问:想知道如何进行Hive SQL的查询优化,有没有相关书籍推荐?

答:我的文章里也介绍了很多查询优化的方式,网上也有很多,不过这些都是告诉你其然,没有告诉你所以然。能够对Hive SQL进行很好地优化,最根本方法就是研究明白MapReduce的执行细节,并弄清楚HiveSQL怎么转换为MapReduce程序的,这很关键的。有一本是《MapReduce设计模式》挺好的,讲到了基本上常见的MapReduce,读完那本书会对Hive的执行会有深刻了解,便于理解Hive的优化。我挺看好这本书的,不过Hive方面的书中文版确实少。还有另外一点很重要,就是在实践中不断摸索总结,技巧和原理相互印证,这个确实是个对Hive和MapReduce学习的过程。


问:关于更新目标表,有几种比较好处理方法?

答:目标表不知道说的是什么意思,什么叫目标表,就当是要更新的表。

Hive数据是存在HDFS上的,HDFS上的数据是不能更新的,只能追加、删除。不能单条记录更新的,HDFS被设计的就不支持。在Hive里有分区的概念,一个分区的数据存储在HDFS上的一个目录中,可以对某一个分区的数据采用删除后重新写入的方式实现更新操作。就一个分区里数据,全部删除,再写入。可以理解为,HDFS就是一个只能insert,不能update和delete操作的数据库。比如一个分区里存储一天数据, 这能这一天的数据全部删除后,再插入,就达到更新的效果了。只能一个分区里的全删,不能单条记录更新,HDFS就是这个特点。这个特点是为了达到高的吞吐量而牺牲的。HBase可以做到单条更新,HBase的数据也是存储在HDFS上,但是HBase采用了很巧妙的方式达到了单条更新的目的。


问:推荐下关于Hive转Mapreduce原理或者优化Hive SQL的书籍或者博客之类的资料?

答: Hive 转 Mapreduce原理,有个美团的文章写的非常好:

http://tech.meituan.com/hive-sql-to-mapreduce.html

Hive转Mapreduce的原理还有就是《MapReduce设计模式》这本书,讲的其实挺好的。比如最复杂的join,讲了各种join的过程实现,Hive就是那样实现的,比较经典就是 map join 优化是怎么做到的。


问:我们现在正在迁移数据库(从MySQL到Hive上),MySQL有大量的存储过程,请问有什么比较好的处理方式吗?

答:存储过程是迁移不了的,迁移的只是数据,不能迁移MySQL的计算,而且把数据迁移到Hive上,如果MySQL上没有了备份就做不到了实时查询,Hive不是实时查询的数据库。我的关系型数据库的每个表都有一个lasttime字段,是记录最新的更改时间,每天凌晨会根据这个字段将截止到0点的数据全量传输到Hive,MySQL里还留着,这些Hive数据用于离线计算,归档数据可以不保留,签入Hive。


问:Hive的运维难度相比同类工具,难易程度?

答:Hive是非常简单的,运维难度不大,说到底,Hive只不过是一个HDFS文件的映射关系而已,数据不存在Hive中,而存在HDFS,计算也不用Hive,而是转为Mapreduce运行在Hadoop 的YARN上,至于运维,其实就是Hadoop的运维,Hive的运维难度很大程度上就是hadoop的运维难度。


问:你经历过的使用Hive的项目,数据量大概多大,对应的Hive Query的性能如何?

答:实际做项目的时候,其实最怕的就是数据量大,首先想到的就是怎么先减少数据量再计算,并不是数据量越大感觉自己越厉害。Hive就像一把大刀,确实可以砍大块的肉,但是却不能蛮砍,得尽量躲着点骨头,这就是我的感觉。我处理过1P数据,没有用,你真的需要这1P全部参与处理吗?大多数是不需要的。大部分的Hive SQL脚本都在半个小时内要处理完。关于怎么减少处理的数据?举个例子,Hive里的数据在创建表的时候就规划好,分好区,查询的时候尽量带着分区查询条件,这样就能减少很多数据量。再就是,分步进行,可以将符合条件的数据存入一个临时表,再用这个筛选后的参与关联。


本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。


在此感谢异步社区为本次活动提供的赠书《Hive编程指南》。

异步社区是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架。

enter image description here

微信扫描登录