第7讲Hive数据仓库.pptx
- 文档编号:15122894
- 上传时间:2023-07-01
- 格式:PPTX
- 页数:49
- 大小:2.77MB
第7讲Hive数据仓库.pptx
《第7讲Hive数据仓库.pptx》由会员分享,可在线阅读,更多相关《第7讲Hive数据仓库.pptx(49页珍藏版)》请在冰点文库上搜索。
第7讲Hive数据仓库,数据分析者面临的问题,数据日趋庞大,无论是入库和查询,都出现性能瓶颈用户的应用和分析结果呈整合趋势,对实时性和响应时间要求越来越高使用的模型越来越复杂,计算量指数级上升,数据分析者期待的解决方案,完美解决性能瓶颈,在可见未来不容易出现新瓶颈过去所拥有的技能可以平稳过渡。
比如SQL、R转移平台的成本有多高?
平台软硬件成本,再开发成本,技能再培养成本,维护成本,Hive简介,起源自facebook由JeffHammerbacher领导的团队构建在Hadoop上的数据仓库框架设计目的是让SQL技能良好,但Java技能较弱的分析师可以查询海量数据2008年facebook把hive项目贡献给Apache,Hive,数据仓库工具。
可以把Hadoop下的原始结构化数据变成Hive中的表支持一种与SQL几乎完全相同的语言HiveQL。
除了不支持更新、索引和事务,几乎SQL的其它特征都能支持可以看成是从SQL到Map-Reduce的映射器提供shell、JDBC/ODBC、Thrift、Web等接口Hive不适合用于联机事务处理,也不提供实时查询功能。
最适合应用在基于大量不可变数据的批处理作业。
Hive是建立在Hadoop上的数据仓库基础构架。
它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
Hive定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户查询数据。
同时,这个语言也允许熟悉MapReduce开发者的开发自定义的mapper和reducer来处理内建的mapper和reducer无法完成的复杂的分析工作。
Hive现状,Hadoop生态圈中的重要项目企业级数据仓库的主流架构之一解决“即席查询”的问题注意Cloudera的Impala项目,号称比Hive要快3-30倍兼容SQL是目前大数据产品的风向标,体系结构图,1、用户接口主要有三个:
命令行(CLI),客户端(Client)和WEB界面(WUI)。
其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive服务。
Client是Hive的客户端,用户连接至HiveServer。
在启动Client模式的时候,需要指出HiveServer所在节点,并且在该节点启动HiveServer。
WUI是通过浏览器访问Hive。
2、元数据存储。
Hive将元数据存储在数据库中,如mysql、derby嵌入式数据库。
Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
3、执行。
解释器、编译器、优化器完成HiveQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
4、HDFS存储。
Hive的数据存储在HDFS中,大部分的查询由MapReduce完成(包含*的查询,比如select*fromtbl不会生成MapRedcue任务)。
Hive元数据存储Hive将元数据存储在RDBMS中,有三种模式可以连接到数据库:
SingleUserMode:
此模式连接到一个In-memory的数据库Derby,一般用于UnitTest。
Hive安装,内嵌模式:
元数据保持在内嵌的Derby模式,只允许一个会话连接本地独立模式:
在本地安装Mysql,把元数据放到Mysql内远程模式:
元数据放置在远程的Mysql数据库,内嵌模式安装,下载并解压Hive,设置环境变量(修改profile文件),配置文件,hive-env.sh,cphive-env.sh.templatehive-env.sh,hive-site.xml,cphive-default.xml.templatehive-site.xml,启动hive,Hive命令行启动方式:
直接输入/hive/bin/hive命令,或者输入hive-servicecli命令。
Hiveweb界面启动方式:
输入hive-servicehwi命令。
Hive采用远程服务启动方式:
远程服务的端口号为10000,采用hive-servicehiveserver命令。
Hive采用远程后台启动方式:
关闭Hive终端,但是Hive服务不退出,采用nohuphive-servicehiveserver命令。
简单建删表测试,一个常见错误,解决方法,修改hadoop-env.sh,Hive安装:
独立模式,可参考网络资源:
http:
/http:
/,Hive的服务,Hive不仅仅是一个shell,通过配置,还可以提供Thrift服务器、Web接口、元数据和JDBC/ODBC服务,具有强大的功能和良好的可扩展性。
1、Hiveshell执行HiveQL(大约相当于SQL92标准)查看或临时设置Hive参数,只对当前会话有效创建函数导入jar包,HiveQL查询语言,HiveQL是一种类似SQL的语言,HiveQL查询语言,1.查询语言。
由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。
熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
2.数据存储位置。
Hive是建立在Hadoop之上的,所有Hive的数据都是存储在HDFS中的。
而数据库则可以将数据保存在块设备或者本地文件系统中。
3.数据格式。
Hive中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:
列分隔符(通常为空格、”t”、”x001)、行分隔符(”n”)以及读取文件数据的方法(Hive中默认有三个文件格式TextFile,SequenceFile以及RCFile)。
由于在加载数据的过程中,不需要从用户数据格式到Hive定义的数据格式的转换,因此,Hive在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的HDFS目录中。
而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。
所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
HiveQL查询语言,4.数据更新。
由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。
因此,Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERTINTO.VALUES添加数据,使用UPDATE.SET修改数据5.索引。
之前已经说过,Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。
Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。
由于MapReduce的引入,Hive可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive仍然可以体现出优势。
数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。
由于数据的访问延迟较高,决定了Hive不适合在线数据查询。
6.执行。
Hive中大多数查询的执行是通过Hadoop提供的MapReduce来实现的(类似select*fromtbl的查询不需要MapReduce)。
而数据库通常有自己的执行引擎。
HiveQL查询语言,7.执行延迟。
之前提到,Hive在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。
另外一个导致Hive执行延迟高的因素是MapReduce框架。
由于MapReduce本身具有较高的延迟,因此在利用MapReduce执行Hive查询时,也会有较高的延迟。
相对的,数据库的执行延迟较低。
当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
8.可扩展性。
由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的。
而数据库由于ACID语义的严格限制,扩展行非常有限。
9.数据规模。
由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。
HiveQL查询语言,Hive安装与部署成功之后,在命令行输入hive进入shell。
1、退出shell:
Hivequit;2、查看已有表Hiveshowtables;3、查看表结构Hivedescribetablename;,建表,CreateTableCREATEEXTERNALTABLEIFNOTEXISTStable_name(col_namedata_typeCOMMENTcol_comment,.)COMMENTtable_commentPARTITIONEDBY(col_namedata_typeCOMMENTcol_comment,.)CLUSTEREDBY(col_name,col_name,.)SORTEDBY(col_nameASC|DESC,.)INTOnum_bucketsBUCKETSROWFORMATrow_formatSTOREDASfile_formatLOCATIONhdfs_path,CREATETABLE创建一个指定名字的表。
如果相同名字的表已经存在,则抛出异常;用户可以用IFNOTEXIST选项来忽略这个异常。
EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
LIKE允许用户复制现有的表结构,但是不复制数据。
用户在建表的时候可以自定义SerDe或者使用自带的SerDe。
如果没有指定ROWFORMAT或者ROWFORMATDELIMITED,将会使用自带的SerDe。
在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
如果文件数据是纯文本,可以使用STOREDASTEXTFILE。
如果数据需要压缩,使用STOREDASSEQUENCE。
有分区的表可以在创建的时候使用PARTITIONEDBY语句。
一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。
而且,表和分区都可以对某个列进行CLUSTEREDBY操作,将若干个列放入一个桶(bucket)中。
也可以利用SORTBY对数据进行排序。
这样可以为特定应用提高性能。
表名和列名不区分大小写,SerDe和属性名区分大小写。
表和列的注释是字符串。
创建表,创建表,列类型,Hive支持的数据类型如下:
原生类型:
TINYINTSMALLINTINTBIGINTBOOLEANFLOATDOUBLESTRINGBINARY(Hive0.8.0以上才可用)TIMESTAMP(Hive0.8.0以上才可用)复合类型:
arrays:
ARRAYmaps:
MAPstructs:
STRUCTunion:
UNIONTYPE,Hive中表的类型,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。
Hive中所有的数据都存储在HDFS中,Hive中包含以下数据模型:
Table,ExternalTable,Partition,Bucket。
(1)普通表普通表的创建就是一个表对应一个表名和表名对应的文件。
(2)外部表建表的同时指定一个指向实际数据的路径,创建内部表时会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
删除表时,内部表的元数据和数据一起被删,而外部表只删除元数据,不删除数据。
(3)分区表在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,加载数据,Hive不支持一条一条用insert语句进行插入操作,也不支持update操作。
数据以load的方式加载到建立好的表中,一旦导入,不可修改。
LOADDATALOCALINPATHfilepathOVERWRITEINTOTABLEtablenamePARTITION(partcol1=val1,partcol2=val2.)Load操作只是单纯的复制/移动操作,将数据文件移动到Hive表对应的位置。
filepath可以是:
相对路径,例如:
project/data1绝对路径,例如:
/user/hive/project/data1包含模式的完整URI,例如:
hdfs:
/namenode:
9000/user/hive/project/data1,加载的目标可以是一个表或者分区。
如果表包含分区,必须指定每一个分区的分区名。
filepath可以引用一个文件(这种情况下,Hive会将文件移动到表所对应的目录中)或者是一个目录(在这种情况下,Hive会将目录中的所有文件移动至表所对应的目录中)。
如果指定了LOCAL,那么:
load命令会去查找本地文件系统中的filepath。
如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。
用户也可以为本地文件指定一个完整的URI,比如:
file:
/user/hive/project/data1.load命令会将filepath中的文件复制到目标文件系统中。
目标文件系统由表的位置属性决定。
被复制的数据文件移动到表的数据对应的位置。
如果没有指定LOCAL关键字,如果filepath指向的是一个完整的URI,hive会直接使用这个URI。
否则:
如果没有指定schema或者authority,Hive会使用在hadoop配置文件中定义的schema和authority,fs.default.name指定了Namenode的URI。
如果路径不是绝对的,Hive相对于/user/进行解释。
Hive会将filepath中指定的文件内容移动到table(或者partition)所指定的路径中。
如果使用了OVERWRITE关键字,则目标表(或者分区)中的内容(如果有)会被删除,然后再将filepath指向的文件/目录中的内容添加到表/分区中。
如果目标表(分区)已经有一个文件,并且文件名和filepath中的文件名冲突,那么现有的文件会被新文件所替代。
插入数据,SELECT查询,SELECTALL|DISTINCTselect_expr,select_expr,.FROMtable_referenceWHEREwhere_conditionGROUPBYcol_listCLUSTERBYcol_list|DISTRIBUTEBYcol_listSORTBYcol_listLIMITnumber一个SELECT语句可以是一个union查询或一个子查询的一部分table_reference是查询的输入,可以是一个普通表、一个视图、一个join或一个子查询简单查询。
例如,下面这一语句从t1表中查询所有列的信息。
SELECT*FROMt1WHEREClauseWHEREClause是一个布尔表达式,不支持where子句中的in,exit或子查询,使用ALL和DISTINCT选项区分对重复记录的处理。
默认是ALL,表示查询所有记录。
DISTINCT表示去掉重复的记录。
hiveSELECTcol1,col2FROMt113131425hiveSELECTDISTINCTcol1,col2FROMt1131425,基于Partition的查询一般SELECT查询会扫描整个表(除非是为了抽样查询)。
但是如果一个表使用PARTITIONEDBY子句建表,查询就可以利用分区剪枝(inputpruning)的特性,只扫描一个表中它关心的那一部分。
Hive当前的实现是,只有分区断言出现在离FROM子句最近的那个WHERE子句中,才会启用分区剪枝。
例如,如果page_views表使用date列分区,以下语句只会读取分区为2008-03-01的数据。
SELECTpage_views.*FROMpage_viewsWHEREpage_views.date=2008-03-01ANDpage_views.date=2008-03-31;,查询,连接,HiveQL的连接分为内连接、左向外连接、右向外连接、全外连接和半连接5种。
例如:
Selectuserinfor.*,choice.*fromuserinforjoinchoiceon(userinfor.id=choice.userid);,表连接,JDBC/ODBC接口,用户可以像连接传统关系数据库一样使用JDBC或ODBC连接Hive目前还不成熟,JDBC的具体连接过程,1.使用jdbc的方式连接Hive,首先做的事情就是需要启动hive的ThriftServer,否则连接hive的时候会报connectionrefused的错误。
启动命令如下:
hive-servicehiveserver2.新建java项目,然后将hive/lib下的所有jar包和hadoop的核心jar包hadoop-0.20.2-core.jar添加到项目的类路径上。
样板代码,publicstaticvoidmain(Stringargs)throwsException/TODOAuto-generatedmethodstubClass.forName(org.apache.hadoop.hive.jdbc.HiveDriver);StringdropSql=droptablepokes;StringcreateSql=createtablepokes(fooint,barstring);StringinsertSql=loaddatalocalinpath/home/zhangxin/hive/kv1.txtoverwriteintotablepokes;StringquerySql=selectbarfrompokeslimit5;Connectionconnection=DriverManager.getConnection(jdbc:
hive:
/localhost:
10000/default,);Statementstatement=connection.createStatement();statement.execute(dropSql);statement.execute(createSql);statement.execute(insertSql);ResultSetrs=statement.executeQuery(querySql);while(rs.next()System.out.println(rs.getString(bar);,Web接口,假设hive部署在10.20.151.7机器上,conf/hive-default.xml文件都是默认值,那么我们直接在浏览器中输入:
http:
/10.20.151.7:
9999/hwi/就可以访问了,元数据,NUCLEUS_TABLESADBSSEQUENCE_TABLESERDESTBLSSDSPARTITION_KEYSCOLUMNSBUCKETING_COLSSD_PARAMSSORT_COLSSERDE_PARAMSTABLE_PARAMS,Hive的数据放在哪儿?
数据在HDFS的warehouse目录下,一个表对应一个子目录桶与reduce本地的/tmp目录存放日志和执行计划,Hive的数据放在哪儿?
谢谢!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hive 数据仓库