收藏 分享(赏)

大数据技术基础培训-Hive的原理与操作.pptx

上传人:IT人 文档编号:1420898 上传时间:2018-07-15 格式:PPTX 页数:73 大小:2.93MB
下载 相关 举报
大数据技术基础培训-Hive的原理与操作.pptx_第1页
第1页 / 共73页
大数据技术基础培训-Hive的原理与操作.pptx_第2页
第2页 / 共73页
大数据技术基础培训-Hive的原理与操作.pptx_第3页
第3页 / 共73页
大数据技术基础培训-Hive的原理与操作.pptx_第4页
第4页 / 共73页
大数据技术基础培训-Hive的原理与操作.pptx_第5页
第5页 / 共73页
点击查看更多>>
资源描述

1、大数据技术基础培训,1,大数据处理的需求和特点,2,计算模式的演变,3,计算模式的变革开始撼动传统数据存储和数据分析技术,Transaction,Relational Database,Batch,DataWarehouse,Analyze,Cluster,Unstructured,Streaming,Devices,Analyze,(MapReduce),Organize,Traditional Data Analysis,Big Data Analysis,扩展性: 纵向扩展 横向扩展 分布式: 集中计算/存储 分布计算/存储可用性: 高可靠硬件 软件自动容错易用性: 单计算机 数据中心作

2、为一台计算机,Hadoop简史,2003 -2004 Google GFS and Map/Reduce papers2004-2006 Develop DFS and Map/Reduce for Nutch (Doug Cutting and two other part-time engineers)2006 -2008 Hadoop web-scale deployment in Yahoo!(in 2008)2006 Google Big Table paper published2006-2007 First HBase implementation by Powerset2007

3、-2009 Hive initially developed at Facebook, processing petabyte data2009 Clouderas first hadoop distribution released2010 Facebook deployed HBase for its messaging system2011 Hortonworks spinoff from Yahoo!,4,大数据软件栈,5,Hive的原理与操作,内容,Hive基础介绍Hive的数据模型Hive操作Hive内存表介绍,内容,Hive基础介绍Hive的数据模型Hive操作Hive内存表介绍

4、,Hive基础,Hive是搭建在Hadoop上的数据仓库Hive用来管理和查询结构化数据使用MapReduce计算模型进行计算Mapreduce计算框架Spark计算框架使用HDFS(HBase)进行存储Hive的组成Metastore用来保存结构化数据SchemaHive Engine编译,优化,运行查询语句Hive ServerHive代理服务器,支持JDBC连接,Hive支持的数据类型,Primitive TypeTiny intSmall int IntBig intBoolean FloatDoubleStringBinaryTimeStampComplex TypeStructMa

5、pArray,10,Hive支持的数据类型(复杂类型),Struct 字段的集合不同的字段可以有不同的类型Map无序的Key-Value队的集合,Key必须是基础类型,Value可以是任何类型Key必须是相同类型,值也必须是相同类型Array相同类型的字段的集合,11,建表:hive create table employee(id string, perf map) ROW FORMAT DELIMITED FIELDS TERMINATED BY t COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMINATED BY :; 源数据 $ cat t

6、est7.txt 1 job:80,team:60,person:70 2 job:60,team:80 3 job:90,team:70,person:100 hive LOAD DATA LOCAL INPATH /home/work/data/test7.txt INTO TABLE employee;,HiveQL,HiveQL类似SQL92,使用关系型数据库的概念,包括表,行,列等等为结构化数据设计有一些SQL的常用优化和特性将查询语句转化为一组Mapreduce Jobs进行执行适用于离线分析或者准实时查询,典型的Hive用例,13,Multiple iterations of M

7、apReduce,HDFS,Unstructured input data,Database to hold schema information,MySQL,Hive,SQL,Structured output data,14,Hive架构,MapReduceSpark,Metastore,Hive Engine,ODBC,Interacting with Hive Methods,HDFS,Hive Server,JDBC,Hive Client,Serde,JDBC Applications,ODBC Applications,MySQL,Hive MetaStore,保存Hive中表结

8、构,分区,表属性等信息单独Metastore进程Hive Server和Hive Client在处理请求时都会先访问Metastore获取对应表信息使用MySQL或MySQL Cluster作为底层存储可以在集群中多台机器上部署Metastore进程来实现 HA,客户端会尝试连接配置文件中第一台Metastore服务器,如果连接失败则开始以轮询方式尝试连接第二台及以后的Metastore,Hive Server,接受用户提交的SQL并执行支持三种方式的连接:在命令行模式下使用hive client连接(hive h hive server address)JDBC程序连接ODBC程序连接,Hi

9、ve Serde,一组用来对数据进行序列化和反序列化的接口Hive使用Serde来读/写表一般从InputFormat开始每一个Hive的操作都有自己对应的序列化和反序列化方式应对Java对象序列化和反序列化性能的问题允许用户自己定义自己的序列化和反序列化方式Hive使用一套ObjectInspector的通用接口来获取Java标准对象或Hadoop Writable对象,这在使用Hive UDF函数时经常使用,Hive的Input/Output Format,Hive 使用FileInputFormat来读取源数据Hive支持TextFile和SequenceFileHive自己实现的RCF

10、ile格式Hive支持在运行语句之前设置使用的InputFormat的类型Hive只处理InputFormat中 Value的部分,Hive的配置,在安装Hive之前,需要确保HDFS以及计算框架(Spark/Mapreduce)已安装并且可以正常使用Hive配置文件存放在/etc/hive instance/conf 目录下的hive-site.xml中Hive的表默认存放在hdfs上的/hive instance/user/hive/warehouse中在使用HBase作为数据源时,HBase的配置信息需要放在hive-site.xml文件中,否则会造成连接错误,Hive执行日志,Hive

11、使用log4j作为日志系统配置文件在/etc/hive instance/conf/hive-log4j.properties实际的日志文件在/tmp/user name/hive.log中,20,Hive的一些限制,不支持存储过程,需要使用外部的辅助脚本工具(bash,perl等)SQL的编译和任务的启动都会占用一部分的额外时间(Inceptor中已经进行了改进)不支持非等值的Join(通常需要进行SQL的改写,才能支持相同的语意)不支持对数据的更新和删除不支持插入单条数据,内容,Hive基础介绍Hive的数据模型Hive操作Hive内存表介绍,Hive表,包括了数据存储以及Meta表的存放

12、Hive的表分为内部和外部两种格式对内部表,Hive管理表数据也管理表Meta数据,在删除内部表时,表数据和Meta数据都会被删除对外部表Hive只管理Meta数据,删除外部表时仅仅是删除Meta数据对一个分区表上的数据创建外部表时,分区的内容需要手工添加进Hive的Meta信息当中当数据源可以是HDFS上的文件,HDFS上的支持对压缩过后的文件直接读取(根据文件的扩展名来决定压缩的格式)数据源在HBase上时,只能创建外部表,创建Hive表的命令,hive show tables; 显示所有的数据表hive create table hivetable(id int, value strin

13、g) row format delimited fields terminated by t stored as textfile;创建一个内部表,这个表包括两列,分别是整数类型以及字符串类型,使用文本文件表达,数据域之间的分隔符为thive describe EXTENDED|FORMATTED hivetable;显示所创建的数据表的描述,即创建时候对于数据表的定义 EXTENDED 显示更详细信息 FORMATED以表格式显示元数据信息,Hive表的数据导入,Load的方式从本地磁盘读入hive load data inpath “simple_table”into table simp

14、le_table;HDFS put 的方式将本地文件放入Hive中hdfs dfs put simple_table hdfs:/路径/simple_table如果需要提高数据加载速度 ?,25,分区,根据表中的某个或者某几个字段将表分成不同的区每一个分区都是一个独立的HDFS目录,格式是 /table/part1=value1/part2=value2/数据文件用来创建分区的字段会被标识为String类型在分区表上执行语句会获得更高的效率select & filtergroup by分区不适宜过多,过多的分区会导致Meta信息增大,影响执行效率典型的应用于分区的字段有:小时,类型,地区编号等

15、不适宜使用分区的字段有: 手机号,车牌号,身份证号等,创建分区表,create external table simple_table_pb ( id int, dtime int ) partitioned by(value string) clustered by(id) into 4 buckets stored as rcfile location /extdata/simple_table_pb;,27,对源数据进行分区,常用做法是使用multi-insertfrom datasourcesinsert overwrite table simple_table_pb partitio

16、n(value=str1) select id, time_id where value=str1insert overwrite table simple_table_pb partition(value=str2)select id, time_id where value=str2insert overwrite table simple_table_pb partition(value=str3)select id, time_id where value=str3insert overwrite table simple_table_pb partition(value=str4)s

17、elect id, time_id where value=str4;,28,$ hadoop fs -ls /user/hive/warehouse/studentstat_date=20120802/Found 2 items-rw-r-r- 1 work supergroup 31 2012-07-31 19:52 /user/hive/warehouse/student/stat_date=20120802/000000_0-rw-r-r- 1 work supergroup 39 2012-07-31 19:52 /user/hive/warehouse/student/stat_d

18、ate=20120802/000001_0,分桶,表和分区表可以进一步对数据字段进行分桶根据字段值计算哈希值之后决定该条记录存放位置使用文件名作为桶编号,不同的桶存放在同一个文件夹下桶数量可控分桶可以使SQL的执行效率更高select & filtergroup by join分桶常见的作用字段:手机号,车牌号等,在分区表的基础上对数据分桶,create external table simple_table_pb ( id int, dtime int ) partitioned by(value string) clustered by(id) into 4 buckets stored

19、as rcfile location /extdata/simple_table_pb;,30,对源数据进行分区分桶,set hive.enforce.bucketing=true;from datasourcesinsert overwrite table simple_table_pb partition(value=str1) select id, time_id where value=str1insert overwrite table simple_table_pb partition(value=str2)select id, time_id where value=str2in

20、sert overwrite table simple_table_pb partition(value=str3)select id, time_id where value=str3insert overwrite table simple_table_pb partition(value=str4)select id, time_id where value=str4;,31,分区 vs 分桶,相同点都是对数据分布情况的一种描述都可以SQL的执行起到优化作用,如带WHERE条件的查询,JOIN和GROUPBY等不同点划分方式不同:分区是按照字段的值进行划分,而分桶是按照字段值的哈希值进行

21、划分存储方式不同:分区是按照目录区分的,分桶是按照文件名区分的支持的数据字段特征不同:分区主要是作用在有固定取值范围的字段上,分桶则主要作用在离散度高的字段上分桶可以精确控制桶数量,从而控制每个桶的大小分区比较直观,对于过滤条件支持的种类更多对已分桶的字段上进行Join会有性能提升,32,Hive中COMMON JOIN的实现,33,Co-Partition和Co-Location,两张或多张表满足Co-Partition条件,表示对Join Key创建bucket后,相同哈希值的Key在相同的Split中如果相同哈希值的Key分布在不同的Split中,但是单一的Split仅仅包含了一个哈希值

22、的Key,那么这几个Split可以合并为同一个Split,可满足Co-Partition的条件两张或多张表Co-Location表示相同的Split的数据在同一台机器上Co-Location能极大的避免数据在多台机器见传输,完全避免网络开销,以及TCP协议栈中对CPU的消耗,34,分区和分桶后的优势,Map/Reduce Map-Only在分区/分桶的表格上做满足特定条件的聚合(GroupBy Aggregation)和关联(JOIN)操作可以避免Reduce过程避免网络传输和Shuffle如果数据是Co-Partition并且是Co-Location的,那么可以在Groupby 或者 Joi

23、n的时候可以完全避免网络传输,即没有任何Shuffle操作Co-Partition的含义是拥有相等Shuffle Key的记录在同一个Split中Co-Location的含义是拥有相等Shuffle Key的记录在同一台机器上进一步降低网络传输Combine(合并)具有相同hash key的split可以使用/*+combine(列名)*/ 这个hint 来达到在多个split中间进行桶数据的合并,也可以对split的数据进行合并,35,分区和分桶的联合使用,Group by select /*+combine(id)*/ id,count(*) from simple_table_pb_ne

24、w group by id;select /*+combine(value)*/ value,count(*) from simple_table_pb_new group by value;Joinselect /*+combine(id)*/ * from simple_table_pb_new a join simple_table_pb_new b on a.id=b.id;select /*+combine(id)*/ * from simple_table_pb_new a join simple_table_pb_new b on a.id=b.id where a.value=

25、str4;,对子查询的优化,select a.msisdn, a.hour, a.stream from (select /*+combine(msisdn)*/ msisdn, substring(time_id,9,2) as hour, sum(downstream_vol + upstream_vol) as stream from wap_bucket group by msisdn, substring(time_id,9,2) ) a join (select msisdn, max(stream) as maxstream from (select /*+combine(msi

26、sdn)*/ msisdn, substring(time_id,9,2) as hour, sum(downstream_vol + upstream_vol) as stream from wap_bucket group by msisdn, substring(time_id,9,2) ) tmp group by msisdn ) bon a.stream = b.maxstream and a.msisdn = b.msisdn;,内容,Hive基础介绍Hive的数据模型Hive操作Hive内存表介绍,Hive提供服务的组件,cli:Hive的命令行接口,这个主要是用来调试SQL的

27、接口Hiveserver:让Hive以Thrift服务器的形式运行,接受Thrift,JDBC,ODBC连接的客户端的通信,默认端口为HIVE_PORT=10000,这个是默认的使用方式,可以使用”hive -h Address:Host”metastore:在通常情况下, metastore作为单独的进程运行,为hive-server以及hive Client提供获取hive表环境变量METASTORE_PORT可以指定服务器监听端口号mysql:提供Metastore数据的存储服务,默认配置,Hive中的元数据存储 Metastore,Metastore的配置情况,Hive Server,

28、通过service hive-server-instance name start运行可以启动一个服务,而后可以通过不同的客户端连接到这个服务去访问Hive提供的功能除了Java编程之外,还可以通过 hive h hive-server 来访问hive server并执行SQL,Hive客户端,JDBC驱动:提供纯Java的JDBC驱动,连接字符串类似于jdbc:hive:/host:port/dbname,除非使用了嵌入的模式,否则JDBC模式的驱动访问了Thrift服务器由Client直接执行SQL,Hive JDBC,Hive 支持了标准的数据库查询接口JDBC在JDBC中需要指定驱动字

29、符串以及连接字符串驱动器字符串为“org.apache.hadoop.hive.jdbc.HiveDriver”,即在Hive的软件包中已经加入了对应的JDBC的驱动程序连接字符串则是标志了对应Hive服务器,例如jdbc:hive:/master:10000/default之后,可以直接使用传统的JDBC编程技术去访问Hive所提供的功能,Hive JDBC程序举例,MySQL,用来存放Hive Metastore的元数据Hive Metastore使用My SQL Connector来连接MySQL并获取数据MySQL数据库的用户名和密码以明文的方式存放在配置文件中建议使用单独的MySQL

30、供Hive使用,不要和上层应用放在同一个数据库中使用 service mysqld start/stop 启动和停止MySQL Cluster 来确保MySQL本身的HAMySQL Cluster启动延时很长,需要耐心等待一段时间,46,Hive语法,Hive的语法类似其他的SQL语法使用Hive不需要掌握Map/Reduce计算框架Hive支持自定义的UDF函数Hive支持自定义脚本Hive支持Multi-InsertHive不支持存储过程Hive有少量不支持SQL92的语法通过改写SQL的方式可以保持原SQL语意不变,47,创建Database,CREATE DATABASE DROP D

31、ATABASE USE ,48,表操作,创建一张表:hive CREATE TABLE mytable (name chararray, age int)ROW FORMAT DELIMITEDFIELDS TERMINATED BY ,STORED AS TEXTFILE;ROW FORMAT定义了数据源中每一行中每一个单元的分隔符HiveQL 语句中使用;作为分隔符关于表的其他操作:SHOW TABLECREATE TABLEALTER TABLEDROP TABLE,49,表管理,列出所有Hive表:hive SHOW TABLES;查看表定义:hive DESCRIBE mytable

32、;修改表名:ALTER TABLE mytable to mt;在Hive表中添加一列:ALTER TABLE mytable ADD COLUMNS (mycol STRING);删除一个表的分区ALTER TABLE mytable DROP PARTITION (age=17),50,Select,SELECT 简单查询:SELECT * FROM mytable;带条件的查询支持布尔条件可以带Distinct/All条件重复结果是否返回支持HAVING子句支持LIMIT子句Select中支持正则表达式SELECT (ds|hr)?+.+ FROM sales;,51,Overwrite

33、,OVERWRITE会替换目标位置中的原始数据,否则则是以添加的方式插入数据INSERT OVERWRITE TABLE newtable SELECT * FROM mytable;可以写HDFS目录INSERT OVERWRITE DIRECTORY /hdfs/myresult SELECT * FROM mytable;可以写Linux本地目录INSERT OVERWRITE LOCAL DIRECTORY.,52,JOIN,Hive支持等值的INNER JOIN,LEFT OUTER JOIN,RIGHT OUTER JOIN,FULL OUTER JOIN非等值的Join需要通过中

34、间过程转化为等值Join,53,Map Join,Hive可以使用Mapjoin更有效完成大表和小表的JOINselect /*+mapjoin(small)*/ * from bigtable big join smalltable small on big.id=small.id;MapJoin只能支持对于大表的Outer Join对多张表的情况,只能允许有一张大表多张小表情况select /*+mapjoin(b), mapjoin(c)*/ * from bigtable a join smalltable b on a.id=b.id join smalltable c on a.i

35、d=c.id;特别适合Join Key倾斜严重的情况,54,Co-Partition Join,利用表分桶的特性优化Join的处理逻辑当两张表的Join条件中的Column与他们的分桶Column相同时,两张表的数据都可以避免Shuffle操作当一张表的Join Column与该表的分桶column相同时,该表的数据可以不用做Shuffle操作当表分桶后产生的Split在同一台机器上时,可以完全避免网络数据传输,55,Group By,支持对于多Key的Groupby如果在分区(分桶)表上对分区(分桶)的字段进行聚合操作,或者是聚合操作中多个字段包含了这个字段,那么在聚合过程中可以避免shuf

36、fle操作,56,Sorting,ORDER BY全排序,只能使用一个ReduceSORT BY可以有多个Reduce,确保每一个Reduce输出内容有序,57,View,使用CREATE VIEW view AS SELECT 来创建视图VIEW是只读的,不支持INSERT/LOADVIEW是逻辑上的概念,HIVE暂时不支持物化视图 VIEW内可能包含ORDER BY/LIMIT语句,假如一个针对VIEW的查询也包含这些语句, 则VIEW中的语句优先级高VIEW可以迭代使用,58,Index,Index是Hive提供的一组接口Hive提供了一个Index的默认实现pact.CompactIn

37、dexHandler建立Index的语法是:CREATE INDEX index_name ON TABLE base_table_name (col_name, .) AS index_type WITH DEFERRED REBUILD,59,Hive UDF,UDF(User-Defined-Function) Concat()UDAF(User- Defined Aggregation Funcation) Count()Sum()Avg()UDTF(User-Defined Table-Generating Functions) Explode(),60,Hive Built-in

38、Functions,数值函数round(DOUBLE a)sqrt(DOUBLE a)日期函数to_date(timestamp) 将string或者timestamp转成yyyy-MM-dd格式的日期字符串,失败返回NULLunix_timestamp(date) 返回bigint类型的时间戳year(date)date_add(date,int days)date_format(date, pattern)将string或者timestamp转成指定pattern格式的日期字符串,失败返回NULL,61,Hive Built-in Functions,条件函数CASE WHEN a THE

39、N b WHEN c THEN d* ELSE e ENDnvl(expr1, expr2)/nvl2(expr1, expr2 expr3)/lnnvl(conditition)decode(value, if1, then1, if2,then2, if3,then3, . . . else )字符函数concat_ws(string SEP, string A, string B.) 以SEP作为字符串拼接的分割符translate(str, from_string, to_string)将from_string中的字符替换成to_string中对应的字符,例如translate(abc

40、defg,abc,12345)将返回123defgto_number(value, format_mask)将string类型的value按格式返回对应的double类型,失败返回NULLreverse(string A),62,Hive正则表达式函数,regexp(123, d+)判断字符串是否满足正则表达式匹配regexp_extract(123,d+,1)返回正则表达式匹配条件的子串,第三个参数表示返回第几个匹配的子串regexp_replace(123abc, d+, 456)将字符串中满足正则表达式条件的部分替换成新的字符串,63,内容,Hive基础介绍Hive的数据模型Hive操作

41、Hive内存表介绍,Transwarp Inceptor 介绍,Transwarp Inceptor是一个整合spark, shark和off-heap内存表的分析数据库Spark是一个Map/Reduce计算引擎也分为Map阶段和Reduce阶段使用hash partitioner, 但Shuffle之前不需要排序轻量级的调度框架和多线程计算模型Task的调度延时非常的低(10毫秒级)延迟计算一个SQL不会再被翻译成多个Job,避免在SQL运算过程中对HDFS的无意义读写对于多个SQL串联执行,或者有SubQuery的SQL拥有非常好的执行性能数据驻留内存单个Map/Reduce的运算过程中

42、,当前运算Split的所有数据都必须在内存中,因此当数据量较大时,需要设置比Map/Reduce更多的Task数量可使用HashMap归并相同的KeyInceptor可以将表Load进入内存后,对该表进行反复查询大量优化Inceptor通过SQL hint允许用户创建各种过滤器Inceptor对于分区、分桶的表拥有大量的优化方式,65,Inceptor的语法,Inceptor以Hive为前端,HQL可以在Inceptor上执行Hive是Map/Reduce和Inceptor的通用前端,HQL也可以作用于内存表中Inceptor支持所有的UDF,UDAF和UDTFInceptor不支持自己设置I

43、nputFormatInceptor不支持IndexInceptor目前无法自动计算Reduce数量,用户通过set map.reduce.tasks命令来设置reduce数量,66,内存表的创建,内存表是利用Transwarp Inceptor 执行引擎创建出来的利用集群中机器的内存存放数据的技术,提升对进行该表扫描、聚合、关联等操作的性能使用CTAS的语法创建内存表drop table c;create table c tblproperties(“cache”=“heap”)asselect * from simple_table;c表为内存表,在hive的warehouse中会有一个目

44、录表示该表,但是在目录下没有实际文件,同时Map/Reduce框架也无法对该表数据进行读取,只有Transwarp Inceptor才能够对内存表创建和分析,67,高级过滤器功能,高级过滤器是创建在内存表上特殊表属性过滤器只表征内存表中数据分布的特性过滤器可以帮助在扫描过程中减小搜索范围过滤器可以帮助优化表聚合和关联算法,68,创建带过滤器的内存表,set mapred.reduce.tasks=2;drop table c;create table c tblproperties(cache=heap,filters=UniqueValue:value|HashBucket(2):id) a

45、sselect * from simple_table where value=str1 distribute by id;insert into table c select * from simple_table where value=str2 distribute by id;insert into table c select * from simple_table where value=str3 distribute by id;insert into table c select * from simple_table where value=str4 distribute b

46、y id;,69,过滤器的类型,UniqueValueFilter单值过滤器,表示该表的指定字段在单个Split中值是相同的HashBucketFilter哈希桶过滤器,表示该表的指定字段在单个Split中对桶大小(Bucket Size)取摸是相同的BloomFilter布隆过滤器StringRangeFilter默认过滤器,表征String字段的范围,70,基于Filter的Combine,Combine是把具有相同条件的表的Split合并成为一个的技术Combine只有Inceptor能够支持满足Combine条件的SQL执行时可以极大的避免网络以及磁盘IO的消耗需要注意Combine之

47、后单个Task的数据量,如果单个Task的数据量过大,那么可能需要分更多的bucket,71,Combine示例,set mapred.reduce.tasks=2;select /*+combine(id)*/ id,count(*) from c group by id;select /*+combine(value)*/ value,count(*) from c group by value;select /*+combine(value)*/ id,value,count(*) from c group by value,id;select /*+combine(id)*/ * from c a join d b on a.id=b.id;select /*+combine(id)*/ * from c a join d b on a.id=b.id join c e on a.id = e.id;select /*+combine(id)*/ * from c a join d b on a.id=b.id where a.value=str4;,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 管理信息系统

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报