hive开发资料.docx
- 文档编号:29682791
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:34
- 大小:331.05KB
hive开发资料.docx
《hive开发资料.docx》由会员分享,可在线阅读,更多相关《hive开发资料.docx(34页珍藏版)》请在冰豆网上搜索。
hive开发资料
Hive是一个基于Hadoop的数据仓库平台。
通过hive,我们可以方便地进行ETL的工作。
hive定义了一个类似于SQL的查询语言:
HQL,能够将用户编写的QL转化为相应的Mapreduce程序基于Hadoop执行。
本文讲解如何搭建一个Hive平台。
假设我们有3台机器:
hadoop1,hadoop2,hadoop3。
并且都安装好了Hadoop-0.19.2(hive支持的Hadoop版本很多),hosts文件配置正确。
Hive部署在hadoop1机器上。
最简单,最快速的部署方案
在Hadoop-0.19.2中自带了hive的文件。
版本为0.3.0。
我们首先启动Hadoop:
sh$HADOOP_HOME/bin/start-all.sh
然后启动hive即可:
sh$HADOOP_HOME/contrib/hive/bin/hive
这个时候,我们的Hive的命令行接口就启动起来了,你可以直接输入命令来执行相应的hive应用了。
这种部署方式使用derby的嵌入式模式,虽然简单快速,但是无法提供多用户同时访问,所以只能用于简单的测试,无法实际应用于生产环境。
所以,我们要修改hive的默认配置,提高可用性。
搭建多用户的,提供web界面的部署方案
目前只用比较多hive版本是hive-0.4.1。
我们将使用这个版本来搭建hive平台。
首先,下载hive-0.4.1:
svncohttp:
//svn.apache.org/repos/asf/hadoop/hive/tags/release-0.4.1/hive-0.4.1
然后,修改下载文件里面的编译选项文件shims/ivy.xml,将其修改为如下内容(对应的Hadoop版本为0.19.2)
接下来,我们使用ant去编译hive:
antpackage
编译成功后,我们会发现在build/dist目录中就是编译成功的文件。
将这个目录设为$HIVE_HOME
修改conf/hive-default.xml文件,主要修改内容如下:
derby:
//hadoop1:
1527/metastore_db;create=true
在hadoop1机器上下载并安装apachederby数据库:
wget
解压derby后,设置$DERBY_HOME
然后启动derby的networkServer:
sh$DERBY_HOME/bin/startNetworkServer-h0.0.0.0
接下来,将$DERBY_HOME/lib目录下的derbyclient.jar与derbytools.jar文件copy到$HIVE_HOME/lib目录下。
启动Hadoop:
sh$HADOOP_HOME/bin/start-all.sh
最后,启动hive的web界面:
sh$HIVE_HOME/bin/hive--servicehwi
这样,我们的hive就部署完成了。
我们可以直接在浏览器中输入:
http:
//hadoop1:
9999/hwi/进行访问了(如果不行话,请将hadoop1替换为实际的ip地址,如:
http:
//10.210.152.17:
9999/hwi/)。
这种部署方式使用derby的c/s模式,允许多用户同时访问,同时提供web界面,方便使用。
推荐使用这种部署方案。
关注Hive的schema
我们上面谈到的2中部署方案都是使用derby数据库来保存hive中的schema信息。
我们也可以使用其他的数据库来保存schema信息,如mysql。
可以参考这篇文章了解如果使用mysql来替换derby:
我们也可以使用HDFS来保存schema信息,具体的做法是修改conf/hive-default.xml,修改内容如下:
主要分为以下几个部分:
∙用户接口,包括CLI,Client,WUI。
∙元数据存储,通常是存储在关系数据库如mysql,derby中。
∙解释器、编译器、优化器、执行器。
∙Hadoop:
用HDFS进行存储,利用MapReduce进行计算。
1.用户接口主要有三个:
CLI,Client和WUI。
其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。
Client是Hive的客户端,用户连接至HiveServer。
在启动Client模式的时候,需要指出HiveServer所在节点,并且在该节点启动HiveServer。
WUI是通过浏览器访问Hive。
2.Hive将元数据存储在数据库中,如mysql、derby。
Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
3.解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
4.Hive的数据存储在HDFS中,大部分的查询由MapReduce完成(包含*的查询,比如select*fromtbl不会生成MapRedcue任务)。
Hive元数据存储
Hive将元数据存储在RDBMS中,有三种模式可以连接到数据库:
∙SingleUserMode:
此模式连接到一个In-memory的数据库Derby,一般用于UnitTest。
∙MultiUserMode:
通过网络连接到一个数据库中,是最经常使用到的模式。
∙RemoteServerMode:
用于非Java客户端访问元数据库,在服务器端启动一个MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer访问元数据库。
Hive的数据存储
首先,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。
其次,Hive中所有的数据都存储在HDFS中,Hive中包含以下数据模型:
Table,ExternalTable,Partition,Bucket。
1.Hive中的Table和数据库中的Table在概念上是类似的,每一个Table在Hive中都有一个相应的目录存储数据。
例如,一个表pvs,它在HDFS中的路径为:
/wh/pvs,其中,wh是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的数据仓库的目录,所有的Table数据(不包括ExternalTable)都保存在这个目录中。
2.Partition对应于数据库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的很不相同。
在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。
例如:
pvs表中包含ds和city两个Partition,则对应于ds=20090801,ctry=US的HDFS子目录为:
/wh/pvs/ds=20090801/ctry=US;对应于ds=20090801,ctry=CA的HDFS子目录为;/wh/pvs/ds=20090801/ctry=CA
3.Buckets对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucket对应一个文件。
将user列分散至32个bucket,首先对user列的值计算hash,对应hash值为0的HDFS目录为:
/wh/pvs/ds=20090801/ctry=US/part-00000;hash值为20的HDFS目录为:
/wh/pvs/ds=20090801/ctry=US/part-00020
4.ExternalTable指向已经在HDFS中存在的数据,可以创建Partition。
它和Table在元数据的组织上是相同的,而实际数据的存储则有较大的差异。
∙Table的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。
删除表时,表中的数据和元数据将会被同时删除。
∙ExternalTable只有一个过程,加载数据和创建表同时完成(CREATEEXTERNALTABLE……LOCATION),实际数据是存储在LOCATION后面指定的HDFS路径中,并不会移动到数据仓库目录中。
当删除一个ExternalTable时,仅删除
摘要:
由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。
其实
从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。
本文将
从多个方面来阐述Hive和数据库的差异。
数据库可以用在Online的应用中,但是
Hive是为数据仓库而设计的,清楚这一点,有助于从应用角度理解Hive的特性。
Hive和数据库的比较
查询语言
HQL
SQL
数据存储位置
HDFS
RawDevice或者LocalFS
数据格式
用户定义
系统决定
数据更新
支持
不支持
索引
无
有
执行
MapRedcue
Executor
执行延迟
高
低
可扩展性
高
低
数据规模
大
小
1.查询语言。
由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。
熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
2.数据存储位置。
Hive是建立在Hadoop之上的,所有Hive的数据都是存储在HDFS中的。
而数据库则可以将数据保存在块设备或者本地文件系统中。
3.数据格式。
Hive中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:
列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive中默认有三个文件格式TextFile,SequenceFile以及RCFile)。
由于在加载数据的过程中,不需要从用户数据格式到Hive定义的数据格式的转换,因此,Hive在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的HDFS目录中。
而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。
所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
4.数据更新。
由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。
因此,Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERTINTO… VALUES添加数据,使用UPDATE…SET修改数据。
5.索引。
之前已经说过,Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。
Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。
由于MapReduce的引入,Hive可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive仍然可以体现出优势。
数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。
由于数据的访问延迟较高,决定了Hive不适合在线数据查询。
6.执行。
Hive中大多数查询的执行是通过Hadoop提供的MapReduce来实现的(类似select*fromtbl的查询不需要MapReduce)。
而数据库通常有自己的执行引擎。
7.执行延迟。
之前提到,Hive在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。
另外一个导致Hive执行延迟高的因素是MapReduce框架。
由于MapReduce本身具有较高的延迟,因此在利用MapReduce执行Hive查询时,也会有较高的延迟。
相对的,数据库的执行延迟较低。
当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
8.可扩展性。
由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的(世界上最大的Hadoop集群在Yahoo!
,2009年的规模在4000台节点左右)。
而数据库由于ACID语义的严格限制,扩展行非常有限。
目前最先进的并行数据库Oracle在理论上的扩展能力也只有100台左右。
9.数据规模。
由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。
Hive的官方文档中对查询语言有了很详细的描述,请参考:
http:
//wiki.apache.org/hadoop/Hive/LanguageManual,本文的内容大部分翻译自该页面,期间加入了一些在使用过程中需要注意到的事项。
CreateTable
CREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name
[(col_namedata_type[COMMENTcol_comment],...)]
[COMMENTtable_comment]
[PARTITIONEDBY(col_namedata_type[COMMENTcol_comment],...)]
[CLUSTEREDBY(col_name,col_name,...)
[SORTEDBY(col_name[ASC|DESC],...)]INTOnum_bucketsBUCKETS]
[ROWFORMATrow_format]
[STOREDASfile_format]
[LOCATIONhdfs_path]
CREATETABLE创建一个指定名字的表。
如果相同名字的表已经存在,则抛出异常;用户可以用IFNOTEXIST选项来忽略这个异常。
EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
LIKE允许用户复制现有的表结构,但是不复制数据。
用户在建表的时候可以自定义SerDe或者使用自带的SerDe。
如果没有指定ROWFORMAT或者ROWFORMATDELIMITED,将会使用自带的SerDe。
在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
如果文件数据是纯文本,可以使用STOREDASTEXTFILE。
如果数据需要压缩,使用STOREDASSEQUENCE。
有分区的表可以在创建的时候使用PARTITIONEDBY语句。
一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。
而且,表和分区都可以对某个列进行CLUSTEREDBY操作,将若干个列放入一个桶(bucket)中。
也可以利用SORTBY对数据进行排序。
这样可以为特定应用提高性能。
表名和列名不区分大小写,SerDe和属性名区分大小写。
表和列的注释是字符串。
DropTable
删除一个内部表的同时会同时删除表的元数据和数据。
删除一个外部表,只删除元数据而保留数据。
AlterTable
Altertable语句允许用户改变现有表的结构。
用户可以增加列/分区,改变serde,增加表和serde熟悉,表本身重命名。
AddPartitions
ALTERTABLEtable_nameADD
partition_spec[LOCATION'location1']
partition_spec[LOCATION'location2']...
partition_spec:
:
PARTITION(partition_col=partition_col_value,
partition_col=partiton_col_value,...)
用户可以用ALTERTABLEADDPARTITION来向一个表中增加分区。
当分区名是字符串时加引号。
ALTERTABLEpage_viewADD
PARTITION(dt='2008-08-08',country='us')
location'/path/to/us/part080808'
PARTITION(dt='2008-08-09',country='us')
location'/path/to/us/part080809';
DROPPARTITION
ALTERTABLEtable_nameDROPpartition_spec,partition_spec,...
用户可以用ALTERTABLEDROPPARTITION来删除分区。
分区的元数据和数据将被一并删除。
ALTERTABLEpage_viewDROPPARTITION(dt='2008-08-08',country='us');
RENAMETABLE
ALTERTABLEtable_nameRENAMETOnew_table_name
这个命令可以让用户为表更名。
数据所在的位置和分区名并不改变。
换而言之,老的表名并未“释放”,对老表的更改会改变新表的数据。
ChangeColumnName/Type/Position/Comment
ALTERTABLEtable_nameCHANGE[COLUMN]
col_old_namecol_new_namecolumn_type
[COMMENTcol_comment]
[FIRST|AFTERcolumn_name]
这个命令可以允许用户修改一个列的名称、数据类型、注释或者位置。
比如:
CREATETABLEtest_change(aint,bint,cint);
ALTERTABLEtest_changeCHANGEaa1INT;将a列的名字改为a1.
ALTERTABLEtest_changeCHANGEaa1STRINGAFTERb;将a列的名字改为a1,a列的数据类型改为string,并将它放置在列b之后。
新的表结构为:
bint,a1string,cint.
ALTERTABLEtest_changeCHANGEbb1INTFIRST;会将b列的名字修改为b1,并将它放在第一列。
新表的结构为:
b1int,astring,cint.
注意:
对列的改变只会修改Hive的元数据,而不会改变实际数据。
用户应该确定保证元数据定义和实际数据结构的一致性。
Add/ReplaceColumns
ALTERTABLEtable_nameADD|REPLACE
COLUMNS(col_namedata_type[COMMENTcol_comment],...)
ADDCOLUMNS允许用户在当前列的末尾增加新的列,但是在分区列之前。
REPLACECOLUMNS删除以后的列,加入新的列。
只有在使用native的SerDE(DynamicSerDeorMetadataTypeColumnset
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hive 开发 资料