Hive一张图看懂Hive:1Hive简介Hive由Facebook实现并开源,是建立在Hadoop之上的数据仓库解决方案,支持将结构化的数据文件映射为一张表,提供HQL(HiveSQL)实现方便高效的数据查询,底层数据存储在HDFS上。Hive的本质是将HQL转换为MapReduce程序去执行,使不熟悉MapReduce的用户很方便地利用HQL进行数据ETL操作。Hive的用户接口层,CLI即Shell命令行,CLI最常用。表1Hive与传统数据库对比更友好的接口:Hive提供类SQL语法使开发人员在使用接口时几乎没有门槛。更低的学习成本:Hive底层自动实现SQL到MapReduce任务的转换,大大减少开发人员学习和应用MapReduce成本。更好的可扩展性:Hive可自由扩展集群规模而无需重启服务,此外Hive还支持用户自定义函数。良好的容错性:当Hive节点出现问题,SQL仍可继续无中断执行。2Hive系统架构3Hive数据模型4使用Hive的过程6HiveVs.HBaseandHiveoverHBase5Hive优劣分析DataNodeCLIJDBC/ODBCWebUIThriftServerDriver(Compiler/Optimizer/Executor)MetaStoreNodeManagerNameNodeResourceManagerHadoopHive将元数据存储在数据库中,连接到这些数据库(mysql,derby)的模式分三种:单用户模式、多用户模式、远程服务器模式。元数据包括Database、表名、表的列及类型、存储空间、分区、表数据所在目录等。完成HQL的查询语句的词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并由MapReduce调用执行。Hive的数据存储在HDFS中,针对大部分的HQL查询请求,Hive内部自动转换为MapReduce任务执行。创建表创建视图拷贝数据文件到指定目录自定义函数(可选)使用Hive查询和分析数据createtabletest(idint,contstring)rowformatdelimitedfieldsterminatedby','storedastextfile;loaddata(local)inpath‘/data/test’overwriteintotabletest;createviewtest_viewasselect*fromtestwhereidisnotnull;集成Hive的UDF类:importorg.apache.hadoop.hive.ql.exec.UDF;引入类Jar包:addjar/hadoop/hive-0.9.0/test/lib/testudf.jar;创建自定义函数:createtemporaryfunctionmytestfunas'com.huawei.hadoop.hive.udf.mytestfun';select*fromtestlimit10;//此请求不会转化成MR任务。selectcount(distinctip)ipcountfromtestgroupbyXXX;如果创建的是外部表,则不用装载数据,只需要直接指定数据的存储位置。注意,Hive不支持所有非等值的连接。Hive的存储结构包括数据库、文件、表和视图。Hive并未指定专门的数据存储格式,也没有为数据建立索引,因此用户可以非常灵活的操作Hive中的表,只要在创建表时告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。Hive的元数据存储在RDBMS中,除元数据外的其它所有数据都基于HDFS存储。Hive中的表分为内部表、外部表、分区表和Bucket表。Hive的元数据存储在RDBMS中,所有其它数据都基于HDFS存储。Hive没有专门的数据存储格式,也没有为数据建立索引。Hive默认支持多种文件格式,也支持用户自定义格式。基于Hive的分析过程支持从不同数据源装载数据。存储灵活性执行效率可扩展性容错性可视化Hive基于MapReduce,因此Sort和Groupby等都依赖MapReduce。MapReduce可以理解为固化了的执行算子。此外Hive对Join算子的支持不够全面。在特定应用场景下,内存拷贝和数据预处理同样可能影响Hive的执行效率。Hive的数据处理量是PB级的,因此它具备非常好的水平可扩展性,支持集群部署,支持通过简单地增加资源以支持更大的数据量和负载。Hive基于HadoopHDFS和MapReduce构建,天然具备较好的容错性,基于Hive实现的数据仓库可以部署在普通机器构建的分布式集群之上。Hive的可视化界面基本属于字符终端,对用户的技术水平要求比较高。提供个性化的可视化展现(GUI),是Hive改进的重要方向。Hive在扩展性和容错性方面有强大优势,但是在执行引擎高效化和多样化接口与可视化等方面,与传统并行数据仓库还存在一定差距。此外像Tenzing、DryadLINQ、Dremel、HadoopDB等新兴数据仓库,都有Hive值得借鉴的地方。Hive的诞生带动了Hadoop开源栈系统的进一步发展,支持用户从零开始快速搭建数据仓库系统,推动了整个产业链的进步。DatabaseInternalTablePartitionTableExternalTableBucketTable【分区表】在Hive中表的一个Partition对应表下的一个子目录,所有Partition的数据都存储在对应子目录中。假设test表包含date和lang两个partition,则对应于date=20140428,lang=zh的HDFS子目录为/warehouse/test/date=20140428/lang=zh。例句:createtabletest_partition_table(keystring)partitionedby(dtstring)【内部表】与传统数据中的表类似,在Hive中每一个Table都有对应的目录存取其数据。假设表在HDFS上的存储路径为/warehouse/test,则表test的所有数据都会存储在该路径下。当删除表时,其元数据和表中的数据都会被删除。例句:createtabletest_inner_table(keystring)【外部表】与内部表不同,外部表在创建过程中,并不会移动数据到数据仓库的目录中,只是与外部数据建立一个链接。删除外部表时,只会删除该外部表的元数据,外部数据不会删除。因此如果想在数据加载时跳过导入数据过程,推荐采用外部表。例句:createexternaltabletest_external_table(keystring)【Bucket表】选择表的某列通过Hash算法将表横向切分成不同的文件存储,具备这类属性的表称之为BucketTable。如果业务计算需采用Map并行方式,推荐创建BucketTable。例句:createtabletest_bucket_table(keystring)clusteredby(key)into20bucketsView【视图】与传统数据库视图类似,只读,基于基本表创建。如果基本表改变,增加数据或增加列不会影响视图的呈现;但如果删除列或删除数据,会影响视图的呈现。基于基本表创建视图时,如果不指定视图的列,视图的列由select语句生成。例句:createviewtest_viewasselect*fromtest_inner_table。HiveRDBMS查询语言HQLSQL数据存储HDFS本地文件系统执行MapReduce非MapReduce数据处理规模大小索引简单索引复杂索引事务不支持支持执行延迟高低应用场景海量数据查询实时查询可扩展性好差数据加载模式读时模式(快)写时模式(慢)数据操作数据覆盖追加行级更新删除Hive与HBase的整合实现是利用两者对外的API接口互相进行通信的,相互通信主要是依靠hive_hbase-handler.jar工具类。在将HBase和Hive集成的过程中注意确保hbasejar包的一致性。Hive集成HBase需要在Hive表和HBase表之间建立映射关系,也就是Hive表的列和列类型与HBase表的列族及列限定词建立关联。每一个在Hive表中的列都存在于HBase中,但反过来在Hive表中则不需要包含所有的HBase中的列。【文件存储格式】在建表语句中通过“STOREDASFILE_FORMAT”指定。TEXTFILE:默认格式,数据不做压缩,磁盘开销大,数据解析开销大,结合Gzip/Bzip2使用,采用此种方式不支持对数据进行切分,从而无法实现数据的并行操作。SEQUENCEFILE:HadoopAPI提供的一种二进制文件,使用方便,支持数据切分与压缩。有三种压缩方式,NONE、RECORD(压缩率低)、BLOCK(推荐使用)。RCFILE:一种行列存储相结合的方式。首先将数据按行分块,保证同一行记录在同一个块上;其次将块数据进行列式存储,这样有利于数据压缩和快速的列存储。采用这种格式在数据加载时耗费的性能较大,但是具备较好的数据压缩比和查询响应,在一次写入多次读取的场景下推荐采用。自定义格式:当用户的数据文件格式不能被Hive识别时,通过实现InputFormat和OutputFormat来自定义输入输出格式。表2Hive与HBase对比HiveHBase存储方式行存列存执行延迟高低数据格式结构化的非结构化的应用场景面向分析,append-only批处理面向查询,行级更新表类型纯逻辑表(不存数据)物理表(存储数据)查询效率低高SQL提供HQL不支持,NoSQL索引简单索引简单索引事务不支持仅支持单行事务行更新不支持支持数据库类型关系型非关系型Hive主要是为简化编写MapReduce程序而生,而HBase是为查询而生。通过Hive的存储接口,Hive和HBase可以整合使用。Hive通过与HBase集成后能够实现快速的查询。同时,由于HBase不支持类SQL语句,通过与Hive集成,Hive为HBase提供SQL语法解析的外壳。