大数据系列Hive入门与实战_第1页
大数据系列Hive入门与实战_第2页
大数据系列Hive入门与实战_第3页
大数据系列Hive入门与实战_第4页
大数据系列Hive入门与实战_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、大数据系列Hive入门与实战一、 Hive简介二、 Hive体系结构三、 Hive工作机制四、 Hive应用场景五、 Hive安装部署六、 Hive开发使用七、 SparkSQL简介Hive简介-Hive是什么?Hive是构建在Hadoop之上的数据仓库平台Hive是一个SQL解析引擎,它将SQL语句转译成MapReduce作业并在Hadoop上执行。Hive表是HDFS的一个文件目录,一个表名对应一个目录名,如果有分区表的话,则分区值对应子目录名。Hive简介-Hive的历史由来Hive是Facebook开发的,构建于Hadoop集群之上的数据仓库应用。2008年Facebook将Hive项

2、目贡献给Apache,成为开源项目。目前最新版本hive-2.0.0Hive简介-Hive的历史由来Hadoop和Hive组建成为Facebook数据仓库的发展史随着数据量增加某些查询需要几个小时甚至几天才能完成。当数据达到1T时,MySql进程跨掉。可以支撑几个T的数据,但每天收集用户点击流数据(每天约400G)时,Oracle开始撑不住。有效解决了大规模数据的存储与统计分析的问题,但是MapReduce程序对于普通分析人员的使用过于复杂和繁琐。对外提供了类似于SQL语法的HQL语句数据接口,自动将HQL语句编译转化为MR作业后在Hadoop上执行。降低了分析人员使用Hadoop进行数据分析

3、的难度。一、 Hive简介二、 Hive体系结构三、 Hive工作机制四、 Hive应用场景五、 Hive安装部署六、 Hive开发使用七、 SparkSQL简介Hive体系结构-Hive在Hadoop中的位置Avro(序列化)Zookeeper(协调服务)Pig(数据流)SqoopHive(SQL)MapReduce(分布式计算框架)Hbase(列存储)HCatalog(元数据)HDFS(Hadoop分布式文件系统)程序语言计算表存储对象存储Hive体系结构-Hive设计特征 Hive 做为Hadoop 的数据仓库处理工具,它所有的数据都存储在Hadoop 兼容的文件系统中。Hive 在加载

4、数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS 中Hive 设定的目录下,因此,Hive 不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。Hive 的设计特点如下。支持索引,加快数据查询。不同的存储类型,例如,纯文本文件、HBase 中的文件。将元数据保存在关系数据库中,减少了在查询中执行语义检查时间。可以直接使用存储在Hadoop 文件系统中的数据。内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。编码

5、跟Hadoop同样使用UTF-8字符集。Hive体系结构用户接口CLI:Cli 启动的时候,会同时启动一个 Hive 副本。JDBC客户端:封装了Thrift,java应用程序,可以通过指定的主机和端口连接到在另一个进程中运行的hive服务器ODBC客户端:ODBC驱动允许支持ODBC协议的应用程序连接到Hive。WUI 接口:是通过浏览器访问 HiveThrift服务器基于socket通讯,支持跨语言。Hive Thrift服务简化了在多编程语言中运行Hive的命令。绑定支持C+,Java,PHP,Python和Ruby语言。HiveHadoopThrift服务器解析器编译器优化器执行器元数

6、据库MapReduceHDFS数据仓库用户接口CLI接口JDBC/ODBC客户端WEB接口Hive体系结构解析器编译器:完成 HQL 语句从词法分析、语法分析、编译、优化以及执行计划的生成。优化器是一个演化组件,当前它的规则是:列修剪,谓词下压。执行器会顺序执行所有的Job。如果Task链不存在依赖关系,可以采用并发执行的方式执行Job。元数据库Hive的数据由两部分组成:数据文件和元数据。元数据用于存放Hive库的基础信息,它存储在关系数据库中,如 mysql、derby。元数据包括:数据库信息、表的名字,表的列和分区及其属性,表的属性,表的数据所在目录等。HadoopHive 的数据文件存

7、储在 HDFS 中,大部分的查询由 MapReduce 完成。(对于包含 * 的查询,比如 select * from tbl 不会生成 MapRedcue 作业)HiveHadoopThrift服务器解析器编译器优化器执行器元数据库MapReduceHDFS数据仓库用户接口CLI接口JDBC/ODBC客户端WEB接口一、 Hive简介二、 Hive体系结构三、 Hive工作机制四、 Hive应用场景五、 Hive安装部署六、 Hive开发使用七、 SparkSQL简介HadoopHive的运行机制hive用户通过用户接口连接Hive,发布Hive SQLHive解析查询并制定查询计划Hive

8、将查询转换成MapReduce作业Hive在Hadoop上执行MapReduce作业sqlMap/Reduce hdfstable1table2table3.用户用户接口Hive编译器的运行机制(Hive的核心)语义解析器将查询字符串转换成解析树表达式。 语法解析器将解析树转换成基于语句块的内部查询表达式。逻辑计划 生成器将内部查询表达式转换为逻辑计划,这些计划由逻辑操作树组成,操作符是Hive的最小处理单元,每个操作符处理代表一道HDFS操作或者是MR作业。查询计划 生成器将逻辑计划转化成物理计划(MR Job)。一、 Hive简介二、 Hive体系结构三、 Hive工作机制四、 Hive应

9、用场景五、 Hive安装部署六、 Hive开发使用七、 SparkSQL简介Hive的应用场景-Hive的优势解决了传统关系数据库在大数据处理上的瓶颈。适合大数据的批量处理。充分利用集群的CPU计算资源、存储资源,实现并行计算。Hive支持标准SQL语法,免去了编写MR程序的过程,减少了开发成本。具有良好的扩展性,拓展功能方便。Hive的优势-上百行MR程序与一条HQL的对比Hive的应用场景-Hive的缺点Hive的HQL表达能力有限:有些复杂运算用HQL不易表达。Hive效率低:Hive自动生成MR作业,通常不够智能;HQL调优困难,粒度较粗;可控性差。针对Hive运行效率低下的问题,促使

10、人们去寻找一种更快,更具交互性的分析框架。 SparkSQL 的出现则有效的提高了Sql在Hadoop 上的分析运行效率。Hive的应用场景适用场景海量数据的存储处理数据挖掘海量数据的离线分析不适用场景复杂的机器学习算法复杂的科学计算联机交互式实时查询一、 Hive简介二、 Hive体系结构三、 Hive工作机制四、 Hive应用场景五、 Hive安装部署六、 Hive开发使用七、 SparkSQL简介一、 Hive简介二、 Hive体系结构三、 Hive工作机制四、 Hive应用场景五、 Hive安装部署六、 Hive开发使用七、 SparkSQL简介Hive开发使用-Hive的连接Hive

11、Server2目前Hive的Thrift服务端通常使用HiveServer2,它是HiveServer改进版本,它提供了新的ThriftAPI来处理JDBC或者ODBC客户端,可以进行Kerberos身份验证,支持多个客户端并发。BeeLineHiveServer2还提供了新的CLI:BeeLine,它是Hive 0.11引入的新的交互式CLI,基于SQLLine,可以作为Hive JDBC Client 端访问HievServer2。通过BeeLine连接hivehive安装目录/bin/./beeline -u jdbc:hive2:/hiveServer2所在ip:端口号 -n 用户名例

12、如: ./beeline -u jdbc:hive2:/127.0.0.1:10000 -n rootHive开发使用-Hive的基本数据类型Hive开发使用-Hive的复杂数据类型Hive开发使用-Hive元数据库表简介Hive开发使用-Hive的数据模型Hive数据库 类似传统数据库的DataBase,在元数据库里实际是一张表。对应于HDFS上的数据仓库目录下是一个文件夹。数据仓库目录路径,由hive-site.xml中$hive.metastore.warehouse.dir 参数指定。创建数据库示例: create database 数据库名; 元数据库中查询数据库列表: select

13、 * from dbs; 如下图:Hive开发使用-Hive的数据模型Hive数据库 hive-site.xml中的数据仓库目录设置,如下图:HDFS下对应存储目录,数据库名后缀为.db的数据库列表,如下图,Hive开发使用-Hive的数据模型内部表 内部表与关系数据库中的Table在概念上类似。每一个Table在Hive中都有一个相应的目录存储数据。所有的Table数据(不包括External Table)都保存在这个目录中。删除表时,元数据与数据都会被删除。 元数据库中查询数据表列表: HDFS下对应存储目录:Hive开发使用-Hive的数据模型 外部表 外部表指向已经在HDFS中存在的数

14、据,可以创建Partition。它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。内部表的创建过程和数据加载过程这两个过程可以分别独立完成,也可以在同一个语句中完成,在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。而外部表只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE LOCATION),实际数据是存储在LOCATION后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个External Table时,仅删除该链接。Hive开发使用

15、-Hive的数据模型如何选择使用内部表或外部表?如果所有处理都由hive来完成,则使用内部表如果需要用hive和外部其他工具处理同一组数据集,则使用外部表。Hive开发使用-Hive的数据模型 分区 Partition对应于关系数据库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的很不相同。在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。例如pvs表中包含ds和city两个Partition,则对应于ds = 20090801, city= jinan 的HDFS子目录为:/wh/pv

16、s/ds=20090801/city=jinan ;对应于 ds = 20090801, city= qingdao 的HDFS子目录为:/wh/pvs/ds=20090801/city=qingdao 。 Hive开发使用-Hive的数据模型 桶 Buckets是将表的列通过Hash算法进一步分解成不同的文件存储。它对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucket对应一个文件。分区是粗粒度的划分,桶是细粒度的划分,这样做为了可以让查询发生在小范围的数据上以提高效率。适合进行表连接查询、适合用于采样分析。例如将user列分散至32个bucket,首先对user列

17、的值计算hash,则对应hash值为0的HDFS目录为:/wh/pvs/ds=20090801/ctry=US/part-00000;对应hash值为20的HDFS目录为:/wh/pvs/ds=20090801/ctry=US/part-00020。如果想应用很多的Map任务这样是不错的选择。 Hive开发使用-Hive的数据模型 Hive的视图 视图与传统数据库的视图类似。视图是只读的,它基于的基本表,如果改变,数据增加不会影响视图的呈现;如果删除,会出现问题。如果不指定视图的列,会根据select语句后的生成。 视图的简单示例: 创建表:create view test_view as s

18、elect * from test; 查看数据:select * from test_view;Hive开发使用-Hive的数据存储模型数据库(database)表(table)表(table)常规数据(data)(Buckets)桶(Buckets)桶分区(Partition)分区(Partition)(Buckets)桶(Buckets)桶Hive开发使用-Hive创建数据表命令CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常。EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个

19、指向实际数据的路径(LOCATION),有分区的表可以在创建的时候使用 PARTITIONED BY 语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。表和分区都可以对某个列进行 CLUSTERED BY 操作,将若干个列放入一个桶(bucket)中。可以利用SORT BY 对数据进行排序。这样可以为特定应用提高性能。默认的字段分隔符为ascii码的控制符001(A) tab分隔符为 t。只支持单个字符的分隔符。如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。CREATE EXTERNAL

20、TABLE IF NOT EXISTS table_name (col_name data_type COMMENT col_comment, .) COMMENT table_comment PARTITIONED BY (col_name data_type COMMENT col_comment, .) CLUSTERED BY (col_name, col_name, .) SORTED BY (col_name ASC|DESC, .) INTO num_buckets BUCKETS ROW FORMAT row_format STORED AS file_format LOCAT

21、ION hdfs_pathHive开发使用-Hive加载数据命令Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。如果表中存在分区,则必须指定分区名。加载本地数据,指定LOCAL关键字,即本地,可以同时给定分区信息 。load 命令会去查找本地文件系统中的 filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也可以为本地文件指定一个完整的 URI,比如:file:/user/hive/project/data1.例如:加载本地数据,同时给定分区信息:hive LOAD DATA LOCAL INPATH file:/example

22、s/files/kv2.txt OVERWRITE INTO TABLE invites PARTITION (ds=2008-08-15);加载DFS数据 ,同时给定分区信息:如果 filepath 可以是相对路径 URI路径,对于相对路径,Hive 会使用在 hadoop 配置文件中定义的 fs.defaultFS 指定的Namenode 的 URI来自动拼接完整路径。例如:加载数据到hdfs中,同时给定分区信息 hive LOAD DATA INPATH /user/myname/kv2.txt OVERWRITE INTO TABLE invites PARTITION (ds=200

23、8-08-15);OVERWRITE指定 OVERWRITE ,目标表(或者分区)中的内容(如果有)会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。LOAD DATA LOCAL INPATH filepath OVERWRITE INTO TABLE tablename PARTITION (partcol1=val1, partcol2=val2 .)Hive开发使用-Hive创建数据表命令示例内部表 例如: 创建人员信息表person_insi

24、de,列以逗号,分隔。 建表示例:create table person_inside (id string,name string,sex string,age int) row format delimited fields terminated by , stored as textfile;加载数据: 本地数据位置: /tmp/person.txtload data local inpath file:/tmp/person.txt into table person_inside;Hive开发使用-Hive创建数据表命令示例外部表 例如: 创建人员信息表person_ex,列以逗号,

25、分隔。 外部表对应路径:hdfs:/mycluster/hivedb/person.txt 建表示例:create external table person_ext(id string,name string,sex string,age int) row format delimited fields terminated by , stored as textfilelocation /hivedb; (注意:location后面跟的是目录,不是文件,hive将依据默认配置的hdfs路径,自动将整个目录下的文件都加载到表中)Hive开发使用-Hive创建数据表命令示例外部表 hive 默

26、认数据仓库路径下,不会生成外部表的文件目录,如下图:查看表信息: desc formatted person_ext; 查看location指向。如下图:Hive开发使用-Hive创建数据表命令示例外部表 查询数据:select * from person_ext;删除表:drop table person_ext; 只删除逻辑表,不删除数据文件,数据文件依然存在。如下图:Hive开发使用-Hive创建数据表命令示例分区表 例如: 创建人员信息表person_part,列以逗号,分隔。建立city为分区。建表示例:create table person_part(id string,name

27、string,sex string,age int) partitioned by (city string)row format delimited fields terminated by , stored as textfile;加载数据:本地数据位置: /tmp/person.txtload data local inpath file:/tmp/person.txt into table person_part partition(city=jinan);Hive开发使用-Hive创建数据表命令示例分区表 数据存储在以分区 city=jinan为目录的路径下,如下图:根据分区查询数据

28、:hive 会自动判断where语句中是否包含分区的字段。而且可以使用大于小于等运算符select * from person_part where city=jinan; 如下图:Hive开发使用-Hive创建数据表命令示例分桶表 例如: 创建人员信息表person_bucket,列以逗号,分隔,在年龄age字段上建5个桶。建表示例:create table person_bucket (id string,name string,sex string,age int) partitioned by (city string) clustered by (age) sorted by(nam

29、e) into 5 buckets row format delimited fields terminated by , stored as textfile;打开桶参数: set hive.enforce.bucketing = true; 加载数据:insert into table person_bucket partition (city=jinan) select * from person_inside; Hive开发使用-Hive创建数据表命令示例分桶表 数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。如下图: 抽样查询:查询5个桶中的第2个

30、桶,即000001_0 文件 select * from person_bucket tablesample(bucket 2 out of 5 on age);Hive开发使用-Hive创建数据表命令示例分桶表:注意:要生成桶的数据,只能是由其他表通过insert into 或是insert overwrite导入数据,如果使用LOAD DATA 加载数据,则不能生成桶数据。定义桶可以使用整型字段或是string类型字段。若表没有定义桶也可以进行随机抽样,但是要全表扫描,速度慢。必须先set hive.enforce.bucketing = true,才可以将数据正常写入桶中。Hive开发使

31、用-数据导出命令导出到本地文件系统 insert overwrite local directory /tmp/exportest/ select * from person_inside;注意:导出路径为文件夹路径,不必指定文件名。执行语句后,会在本地目录的/tmp/hivedb/下 生成一个000000_0结果集数据文件。如下图:导出的数据列之间的分隔符默认是A(ascii码是001)。如下图:Hive开发使用-数据导出命令导出到HDFS中insert overwrite directory /hivedb select * from person_inside;注意:导出路径为文件夹路径

32、,不必指定文件名。执行语句后,会在HDFS目录的/hivedb下 生成一个000000_0结果集数据文件。如下图:Hive开发使用-数据导出命令导出到Hive的另一个表中insert into table person_part partition (city=jinan) select * from person_inside;Hive开发使用-数据查询命令基于Partition的查询 例如:分区为 citySELECT * FROM person_part WHERE city=jinan;限制条数查询 LIMIT Limit可以限制查询的记录数。查询的结果是随机选择的。下面的查询语句从t

33、1表中随机查询5条记录:SELECT * FROM person_inside LIMIT 5;Top N查询下面的查询语句查询年龄最大的5个人。set mapred.reduce.tasks= 2; 设置mapReduce任务数为2 个select * from person_inside sort by age desc limit 5;Hive开发使用-数据表连接命令Hive只支持等值连接,即ON子句中使用等号连接,不支持非等值连接。如果连接语句中有WHERE子句,会先执行JOIN子句,再执行WHERE子句。可以 join 多个表。示例: 表employee数据如下:表job数据如下:H

34、ive开发使用-数据表连接命令创建employee表创建表create table employee(employee_id string,name string) row format delimited fields terminated by , stored as textfile;加载数据: 本地数据位置: /tmp/employee.txtload data local inpath file:/tmp/employee.txt into table employee;创建job表创建表 create table job (job_id string,job string,empl

35、oyee_id string) row format delimited fields terminated by , stored as textfile;加载数据: 本地数据位置: /tmp/job.txtload data local inpath file:/tmp/job.txt into table job ;Hive开发使用-数据表连接命令内连接内连接指的是把符合两边连接条件的数据查询出来。查询语句select * from employee join job on employee.employee_id=job.employee_id;结果如下:Hive开发使用-数据表连接命

36、令左外连接如果 左边有数据,右边没有数据,则左边有数据的记录的对应列返回为空。查询语句 select * from employee left outer join job on employee.employee_id=job.employee_id;注意:不能使用left join,只能使用left outer join。结果如下:Hive开发使用-数据表连接命令右外连接如果 左边没有数据,右边有数据,则右边有数据的记录对应列返回为空。查询语句select * from employee right outer join job on employee.employee_id=job.em

37、ployee_id;注意:不能使用right join,只能使用right outer join。结果如下:Hive开发使用-数据表连接命令全外连接显示内连接,左外连接,右外连接的合集。查询语句select * from employee full outer join job on employee.employee_id=job.employee_id;结果如下:Hive开发使用-数据表连接命令左半连接左半连接与in操作或者exists操作,效果一样。查询语句select * from employee left semi join job on employee.employee_id=

38、job.employee_id;结果如下:上面语句相当于如下语句:select * from employee where employee_id in (select employee_id from job);Hive开发使用-数据表连接命令hive 0.9.0版本开始支持 in、not in 、like、not likein 左边的表在右边表的范围内。与left semi join 效果一样。 select * from employee where employee_id in (select employee_id from job); 结果如下:左边的表不在右边表的范围内。sele

39、ct * from employee where employee_id not in (select employee_id from job);结果如下:not in not likeHive开发使用-数据表连接命令like查询左右模糊匹配的所有结果。select * from employee where name like 张%;结果如下:查询左右模糊匹配以外的所有结果。select * from employee where name not like 张%;结果如下:Hive开发使用-常用显示命令查询数据库:show databases;模糊搜索表:show tables like

40、 *name*;删除数据库:drop database dbname;删除数据表:drop table tablename;查看表结构信息:desc table_name;查看详细表结构信息: desc formatted table_name;查看分区信息: show partitions table_name;查看hdfs文件列表信息:hadoop fs -ls /user/hive/warehouse/查看hdfs文件内容:hadoop fs -cat /user/hive/warehouse/file.txtHive开发使用-java客户端hive需要引用的客户端jar包列表: jav

41、a端连接hive,需要预先引入hive相关的客户端jar包, jar包可以直接从hive安装包的lib目录下拷贝。jar包列表如下:Hive客户端java代码,如下: Hive开发使用-java客户端一、 Hive简介二、 Hive体系结构三、 Hive工作机制四、 Hive应用场景五、 Hive安装部署六、 Hive开发使用七、 SparkSQL简介什么是SparkSQLSparkSQL做为Spark生态里的成员。它是一个基于Spark引擎,运行在Hadoop上的SQL工具。它兼容Hive、RDD、parquet(列式存储)文件、JSON文件等数据源。在Hadoop上运行sql,具备较高的运行效率 。Apache SparkSparkSQLSpark流式

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论