1、1 1顺丰科技顺丰科技-系统与数据集成研发中心系统与数据集成研发中心-数据集成研发部数据集成研发部2 2Hive 是什么Hive 特性 怎么用HiveHive的调优及发展3 3Hive 是什么?Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。本质是将HQL转换为MapReduce程序Hive关注以下几点:在Hadoop中的数据可扩展的SQL处理 可扩展到100PB+结构化和非结构化数据-现阶段公司只是用到结构化的数据4 4Hive的架构简介 在Hadoop生态圈的位置建立在Hive之上的交换层让传统DBA或者Java工程师轻松就能
2、完成更多的工作最终转化成MapReduce JobHive 将元数据存储在数据库中,如 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含*的查询,比如 select*from tbl 不会生成 MapRedcue 任务)。5 5Hive的架构简介 接口1、Hiv
3、e 将元数据存储在数据库中,如 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。2、解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。3、Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含*的查询,比如 select*from tbl 不会生成 MapRedcue 任务)。6 6Hive 和普通关系数据库的异同 Hive RDBMS 查询语言 HQL SQL
4、数据存储 HDFS Raw Device or Local FS 索引 无 有 执行 MapReduce Excutor 执行延迟 高 低 处理数据规模 大 小 1、查询语言。专门设计了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。2、数据存储位置。Hive 的数据都是存储在 HDFS 中的。3、数据格式。Hive 中没有定义专门的数据格式,数据格式可以由用户指定.4、数据更新。Hive 中不支持对数据的改写即没有更新5、执行。Hive 中大多数查询的执行是通过 MapReduce 来实现的。6、执行延迟。hive延迟较高。但由于MR框架 大数
5、据量的访问优势明显。7、可扩展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可扩展性是和 Hadoop 的可扩展性是一致的(Oracle 在理论上的扩展能力也只有 100 台左右。8、数据规模。由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据 7 7Hive 是什么Hive 基本操作 怎么用HiveHive的调优及发展8 8Hive基本操作 DDL Create/Drop/Alter Database Create/Drop/Alter Table Alter Table/Partition/Column Create
6、/Drop/Alter View Create/Drop Index Create/Drop Function Show Describe9 9Hive基本操作 托管表和外部表Hive 默认创建Managed Table,由Hive来管理数据,意味着Hive会将数据移动到数据仓库目录。另外一种选择是创建External Table,这时Hive会到仓库目录以外的位置访问数据。如何选择?如果所有处理都由Hive完成,应该使用Managed Table。如果要用Hive和其它工具来处理同一个数据集,应该使用External Tables。托管表托管表外部表外部表CREATE/LOAD把数据已到仓库
7、目录创建表时指明外部数据的位置DROP元数据和数据会被一起删除只删除元数据1010Hive基本操作 DATABASE在Hive中创建数据库及托管表(内部表)1、登录进入Hive sudo-u hdfs hive;2、查看数据库 show databases;3、创建数据库 create database if not exists abc_test;4、进入abc_test数据库 use abc_test;5、查看数据库下所有的表 show tables;6、创建托管表(内部表:删除表,数据同时被删除)drop table if exists abc_table_01;create table
8、 abc_table_01(id int comment 序列,name string comment 名称 )comment 创建托管表(内部表)row format delimited fields terminated by 001;7、查看表结构 desc formatted abc_table_01;1111Hive基本操作 Partition Hive外部表与分区表建立。1、创立外部表(删除外部表,数据不会被删除)drop table if exists abc_table_02;create external table abc_table_02 (id int comment
9、序列,name string comment 名称 )comment 创建外部表 row format delimited fields terminated by 001 location/test/fin_abc/fin_abc/fct/abc_table_02;2、创建立分区表 drop table if exists abc_table_03;create external table abc_table_03 (id int comment 序列,name string comment 名称 )comment 创建外部表 partitioned by(hq_month_code st
10、ring)row format delimited fields terminated by 001 location/test/fin_abc/fin_abc/bsl/abc_table_03;3、添加分区 alter table abc_table_03 add partition(hq_month_code=201501)location/test/fin_abc/fin_abc/bsl/abc_table_03/201501;1212Hive基本操作 TABLE OPERATINGHive数据库和表的DDL操作1、修改表名 alter table abc_table_01 rename
11、 to abc_table_01_new;2、添加字段(不能删除字段)alter table abc_table_01_new add columns(abc string);3、修改字段 alter table abc_table_01_new change abc new_abc string;4、删除分区 alter table abc_table_03 drop partition(hq_month_code=201501);5、查看分区 show partitions abc_table_03;6、删除表 drop table abc_table_01_new;7、删除数据库 dro
12、p database if exists abc_test cascade;1313Hive基本操作 TABLE OPERATINGHive表的DML操作1、插入数据 insert overwrite table abc_table_01 select count(*)as id,test1 from abc_table_01;insert into table abc_table_01 select 1 as id,test12 from abc_table_01;2、查询数据 select a.*from abc_table_01 a;select a.*from abc_table_01
13、 a limit 10;注意:1、Hive支持并行插入。2、Hive不支持不等值连接。3、Hive中没有控制语句如for、if else、while等。1414Hive基本操作 DML Loading files into tables Inserting data into Hive Tables from queries Writing data into the filesystem from queriesNote:Multiple Insert1515Hive基本操作 QueriesWHERE ClauseALL and DISTINCT ClausesPartition Based
14、 QueriesHAVING ClauseLIMIT ClauseREGEX Column Specificationhttps:/cwiki.apache.org/confluence/display/Hive/LanguageManual+Select1616Hive基本操作 Queries Join Inner joinHive只支持等值连接;JOIN 子句中表的顺序很重要,一般最好将最大的表在最后;Outer join外连接可以让你找到连接表中不能匹配的数据行;Semi join目前并不支持IN子查询,可以使用LEFT SEMI JOIN达到相同效果(右表最能在ON子句中出现);Map
15、 join该查询Job没有reducer;使用时充分利用Bucketed Table,需要设置hive.optimize.bucketmapjoin为true;慎重使用!1717Hive 是什么Hive 基本操作 怎么用HiveHive的调优及发展1818Hive 使用 以Mc为例数据准备定义数据仓库放置目录:HDFS目录 /user/cloudil/cdr/bssap/20120717/bssap -协议类型 20120717-年月日(开始时间)以bssap为例,自行管理仓库数据,按天查询创建分区;建表(支持按时间分区的外部表)加载数据LOAD DATA INPATH/user/cloudi
16、l/bssap-2012-08-05-09/INTO TABLE bssapPARTITION(date=20120805);数据应用查询与ET 1919Hive 是什么Hive 基本操作 怎么用HiveHive的调优及发展2020Hive 调优 数据存储模型数据库(数据库(database)表表(table)表表(table)倾斜数据倾斜数据正常正常数据数据分区分区分区分区桶桶桶桶桶桶桶桶2121Hive调优-存储格式?Built-in Formats:?Parquet?ORCFile?RCFile?Avro?Delimited Text?Regular Expression?S3 Logf
17、ile?Typed Bytes?3 rd-Party Addons:?JSON?XML2222Hive调优 参数以下常用设置set mapred.queue.name=fin_abc;-指定对列set mapred.job.queue.name=fin_abc;set hive.fetch.task.conversion=more;-对于简单的不需要聚合的类似SELECT不需要起MapReduce.set hive.cli.print.header=true;-打印列名set hive.exec.reducers.max=200;-最大reducers数set press.output=fal
18、se;-控制hive的查询结果输出是否进行压缩,默认不压缩false;set press.intermediate=true;-决定查询的中间 map/reduce 的输出是否为压缩set mapred.max.split.size=1000000000;-每个map的最大输入大小,该值约小,map数越多;set mapred.min.split.size.per.node=1000000000;-一个节点上split的至少的大小set mapred.min.split.size.per.rack=1000000000;-一个交换机下split至少的大小set hive.auto.conver
19、t.join=true;-输入小表时自动起动 Map Join,从而加快大表关联小表的 Join 速度。set hive.groupby.skewindata=true;-有数据倾斜的时候进行负载均衡job。默认是minimal当使用bucket数据时set hive.enforce.bucketing=true;set hive.enforce.sorting=true;set hive.optimize.bucketmapjoin=true;需要注意io.sort.mb更多 Check Your Settings!2323Hive调优 EXPLAIN EXPLAIN EXTENDED|DEPENDENCY在使用查询语句前,可以使用EXPLAIN关键字查看HIVE将为某个查询使用多个MapReduce作业。EXPLAIN的输出中有很多查询执行计划的详细信息,包括抽象语法树、Hive执行各阶段之间的依赖图以及每个阶段的信息。如果要查看更详细的信息,可以在查询时加上EXTENDED。DEPENDENCY 以json格式输出执行语句会读取的input table和input partition信息,这样debug语句会读取哪些表就很方便了。Thank You!2525