spark

Hive的入门知识

2017-12-05  本文已影响0人  日出卡尔

Hive是什么?

Hive是一种基于Hadoop的数据库技术
并提供完整的sql查询功能, .

HIVE能做什么?

  1. 可以将结构化的数据文件映射为一张数据库表
  2. 可以为生成的数据库表提供完整的sql查询功能(提供了一系列工具)
  3. 可以将sql语句转换为MR job进行运行(内部实现, 当使用mapreduce作为engine的时候就转为MR Job. 也可以用Tez, spark等引擎)

HIVE结构是什么样的?

使用HiveQL作为查询接口, 使用关系型数据库存储元数据(MetaData), 使用mapreduce作为执行层, 使用HDFS作为存储底层.

通过用户接口传入数据, 把元数据放到关系型数据库中去, 把读写的数据放入HDFS中去, 通过Driver, 把query转换为MR Job并且完成相应的任务, 最后把结果反馈给用户.

(1)用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive。
(2)MetaData: Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
(3)Driver:解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
(4)Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)。

image

结构的每一部分是做什么的?

关于用户接口

CLI:command line interface.
Client:Client 和 Web UI, CLI是开发过程中常用的接口
WUI:Client 和 Web UI, CLI是开发过程中常用的接口

关于元数据的存储

元数据其中包括,数据库和表的hdfs位置、名称、列的属性等信息。为什么会把元数据的存储设置为单独的,而不是存储在HIVE里面?是为了把元数据分离出来,提高了数据的安全性和方便管理。

关于Parser, Optimizer, Execution

Parser、Optimizer、Execution分别用来作HQL的解析器、编译优化、生成执行计划,然后由MapReduce调用执行。但是不是所有的HQL命令都会生成mapreduce任务,例如select * from table_name就不会生成。

知识体系

image

Hive的数据模型

Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。

Hive中所有的数据都存储在HDFS中,存储结构主要包括数据库、文件、表和视图。主要包含的子项有: Table内部表, External Table外部表, Partition分区, Bucket桶. Hive可以直接加载文本文件, 还支持sequence file, RCFile.

内部表

Hive的内部表与数据库中的Table在概念上是类似。每一个Table在Hive中都有一个相应的目录存储数据。例如一个表pvs,它在HDFS中的路径为/wh/pvs,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的Table数据(不包括External Table)都保存在这个目录中。删除表时,元数据与数据都会被删除。

例子:

创建数据文件:test_inner_table.txt
创建表:create table test_inner_table (key string)
加载数据:LOAD DATA LOCAL INPATH 'filepath' INTO TABLE test_inner_table
查看数据:select * from test_inner_table;  select count(*) from test_inner_table
删除表:drop table test_inner_table

外部表

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

创建数据文件:test_external_table.txt
创建表:create external table test_external_table (key string)
加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_inner_table
查看数据:select * from test_external_table;  
select count(*) from test_external_table
删除表:drop table test_external_table

分区Partition

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。

创建数据文件:test_partition_table.txt
创建表:create table test_partition_table (key string) partitioned by (dt string)
加载数据:LOAD DATA INPATH 'filepath' INTO TABLE test_partition_table partition (dt='2006')
查看数据:select * from test_partition_table;  select count(*) from test_partition_table
删除表:drop table test_partition_table

Buckets是将表的列通过Hash算法进一步分解成不同的文件存储。它对指定列计算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。如果想应用很多的Map任务这样是不错的选择。
例子:

创建数据文件:test_bucket_table.txt
创建表:create table test_bucket_table (key string) clustered by (key) into 20 buckets
加载数据:LOAD DATA INPATH 'filepath' INTO TABLE test_bucket_table
查看数据:select * from test_bucket_table;  
set hive.enforce.bucketing = true;

视图

视图与传统数据库的视图类似。视图是只读的,它基于的基本表,如果改变,数据增加不会影响视图的呈现;如果删除,会出现问题。

如果不指定视图的列,会根据select语句后的生成。
示例:

create view test_view as select * from test

操作

保存程序在一个名为HiveCreateDb.java文件。下面的命令用于编译和执行这个程序。

$ javac HiveCreateDb.java
$ java HiveCreateDb

输出:

Database userdb created successfully.

DROP DATABASE是删除所有的表并删除数据库的语句

    hive> DROP DATABASE IF EXISTS userdb;

一般来说,在SQL创建表后,我们就可以使用INSERT语句插入数据。但在Hive中,可以使用LOAD DATA语句插入数据。同时将数据插入到Hive,最好是使用LOAD DATA来存储大量记录。
有两种方法用来加载数据:一种是从本地文件系统,第二种是从Hadoop文件系统。

语法:

    LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename 

[PARTITION (partcol1=val1, partcol2=val2 ...)]
LOCAL是标识符指定本地路径。它是可选的。
OVERWRITE 是可选的,覆盖表中的数据。
PARTITION 这是可选的

例子:

    hive> LOAD DATA LOCAL INPATH '/home/user/sample.txt'
    > OVERWRITE INTO TABLE employee;

用Alter Table语句俩修改表. 修改表的属性,如,修改表名,修改列名,添加列,并删除或替换列

语法:

    ALTER TABLE name RENAME TO new_name
    ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
    ALTER TABLE name DROP [COLUMN] column_name
    ALTER TABLE name CHANGE column_name new_name new_type
    ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])

例子:

    hive> ALTER TABLE employee RENAME TO emp;

使用DROP语句来删除表

以下查询删除一个名为 employee 的表:

    hive> DROP TABLE IF EXISTS employee;

Hive支持以下内置聚合函数。这些函数的用法类似于SQL聚合函数。

返回类型 签名 描述
BIGINT count(), count(expr), count() - 返回检索行的总数。
DOUBLE sum(col), sum(DISTINCT col) 返回该组或该组中的列的不同值的分组和所有元素的总和。
DOUBLE avg(col), avg(DISTINCT col) 返回上述组或该组中的列的不同值的元素的平均值。
DOUBLE min(col) 返回该组中的列的最小值。
DOUBLE max(col) 返回该组中的列的最大值。

SELECT语句用来从表中检索的数据。 WHERE子句中的工作原理类似于一个条件。它使用这个条件过滤数据,并返回给出一个有限的结果。

语法:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[LIMIT number];

例子:

    hive> SELECT Id, Name, Dept FROM employee ORDER BY DEPT;
    
    hive> SELECT Dept,count(*) FROM employee GROUP BY DEPT;

JOIN是子句用于通过使用共同值组合来自两个表特定字段。它是用来从数据库中的两个或更多的表组合的记录。它或多或少类似于SQL JOIN。

JOIN是子句用于通过使用共同值组合来自两个表特定字段。它是用来从数据库中的两个或更多的表组合的记录。它或多或少类似于SQL JOIN。

语法

join_table:

table_reference JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference
join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition
| table_reference CROSS JOIN table_reference [join_condition]
示例
我们在本章中将使用下面的两个表。考虑下面的表CUSTOMERS..

+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
考虑另一个表命令如下:

+-----+---------------------+-------------+--------+
|OID | DATE | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 | 3 | 3000 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060 |
+-----+---------------------+-------------+--------+
有不同类型的联接给出如下:

JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
JOIN
JOIN子句用于合并和检索来自多个表中的记录。 JOIN和SQLOUTER JOIN 类似。连接条件是使用主键和表的外键。

下面的查询执行JOIN的CUSTOMER和ORDER表,并检索记录:

hive> SELECT c.ID, c.NAME, c.AGE, o.AMOUNT

FROM CUSTOMERS c JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
成功执行查询后,能看到以下回应:

+----+----------+-----+--------+
| ID | NAME | AGE | AMOUNT |
+----+----------+-----+--------+
| 3 | kaushik | 23 | 3000 |
| 3 | kaushik | 23 | 1500 |
| 2 | Khilan | 25 | 1560 |
| 4 | Chaitali | 25 | 2060 |
+----+----------+-----+--------+
LEFT OUTER JOIN
HiveQL LEFT OUTER JOIN返回所有行左表,即使是在正确的表中没有匹配。这意味着,如果ON子句匹配的右表0(零)记录,JOIN还是返回结果行,但在右表中的每一列为NULL。

LEFT JOIN返回左表中的所有的值,加上右表,或JOIN子句没有匹配的情况下返回NULL。

下面的查询演示了CUSTOMER 和ORDER 表之间的LEFT OUTER JOIN用法:

hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE

FROM CUSTOMERS c
LEFT OUTER JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
成功执行查询后,能看到以下回应:

ID NAME AMOUNT DATE
1 Ramesh NULL NULL
2 Khilan 1560 2009-11-20 00:00:00
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

RIGHT OUTER JOIN
HiveQL RIGHT OUTER JOIN返回右边表的所有行,即使有在左表中没有匹配。如果ON子句的左表匹配0(零)的记录,JOIN结果返回一行,但在左表中的每一列为NULL。

RIGHT JOIN返回右表中的所有值,加上左表,或者没有匹配的情况下返回NULL。

下面的查询演示了在CUSTOMER和ORDER表之间使用RIGHT OUTER JOIN。

hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE

FROM CUSTOMERS c
RIGHT OUTER JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
成功执行查询后,能看到以下回应:

ID NAME AMOUNT DATE
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
2 Khilan 1560 2009-11-20 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00

FULL OUTER JOIN
HiveQL FULL OUTER JOIN结合了左边,并且满足JOIN条件合适外部表的记录。连接表包含两个表的所有记录,或两侧缺少匹配结果那么使用NULL值填补

下面的查询演示了CUSTOMER 和ORDER 表之间使用的FULL OUTER JOIN:

hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE

FROM CUSTOMERS c
FULL OUTER JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
成功执行查询后,能看到以下回应:

ID NAME AMOUNT DATE
1 Ramesh NULL NULL
2 Khilan 1560 2009-11-20 00:00:00
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
2 Khilan 1560 2009-11-20 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00

Hive的操作

一:Hive的几种内置服务

         执行bin/hive --service help  显示如下:
[html] view plain copy
[master@master1 hive]$ bin/hive --service help  
ls: 无法访问/opt/spark/lib/spark-assembly-*.jar: 没有那个文件或目录  
Usage ./hive <parameters> --service serviceName <service parameters>  
Service List: beeline cli help hiveburninclient hiveserver2 hiveserver hwi jar lineage metastore metatool orcfiledump rcfilecat schemaTool version   
Parameters parsed:  
  --auxpath : Auxillary jars   
  --config : Hive configuration directory  
  --service : Starts specific service/component. cli is default  
Parameters used:  
  HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory  
  HIVE_OPT : Hive options  
For help on a particular service:  
  ./hive --service serviceName --help  
Debug help:  ./hive --debug --help  

我们可以看到上边输出项Server List,里边显示出Hive支持的服务列表,beeline cli help hiveserver2 hiveserver hwi jar lineage metastore metatool orcfiledump rcfilecat,下面介绍最有用的一些服务

二:Hive的三种启动方式

2, hive web界面的启动方式
bin/hive –service hwi (& 表示后台运行)
用于通过浏览器来访问hive,感觉没多大用途,浏览器访问地址是:127.0.0.1:9999/hwi

三:hiveServer/HiveServer2

[html] view plain copy
[hadoop@hadoop~]$ hive --service hiveserver --help  
Starting Hive Thrift Server  
usage:hiveserver  
-h,--help                        Print help information  
    --hiveconf <propertyproperty=value>   Use value for given property  
    --maxWorkerThreads <arg>      maximum number of worker threads,  
                                 default:2147483647  
    --minWorkerThreads <arg>      minimum number of worker threads,  
                                  default:100  
-p <port>                        Hive Server portnumber, default:10000  
-v,--verbose                     Verbose mode  

启动hiveserver服务,可以得知默认hiveserver运行在端口10000,最小100工作线程,最大2147483647工作线程。

[html] view plain copy
[hadoop@hadoop~]$ hive --service hiveserver -v  
Starting Hive Thrift Server  
14/08/01 11:07:09WARN conf.HiveConf: DEPRECATED: hive.metastore.ds.retry.* no longer has anyeffect.  Use hive.hmshandler.retry.*instead  
Starting hive serveron port 10000 with 100 min worker threads and 2147483647 maxworker threads  

以上的hiveserver在hive1.2.1中并不会出现,官网的说法是:
HiveServer is scheduled to be removed from Hive releases starting Hive 0.15. See HIVE-6977. Please switch over to HiveServer2.

Hiveserver2
Hiveserver2允许在配置文件hive-site.xml中进行配置管理,具体的参数为:

    [html] view plain copy
    hive.server2.thrift.min.worker.threads– 最小工作线程数,默认为5。  
    hive.server2.thrift.max.worker.threads – 最小工作线程数,默认为500。  
    hive.server2.thrift.port– TCP 的监听端口,默认为10000。  
    hive.server2.thrift.bind.host– TCP绑定的主机,默认为localhost  
           也可以设置环境变量HIVE_SERVER2_THRIFT_BIND_HOST和HIVE_SERVER2_THRIFT_PORT覆盖hive-site.xml设置的主机和端口号。从Hive-0.13.0开始,HiveServer2支持通过HTTP传输消息,该特性当客户端和服务器之间存在代理中介时特别有用。与HTTP传输相关的参数如下:
    [html] view plain copy
    hive.server2.transport.mode – 默认值为binary(TCP),可选值HTTP。  
    hive.server2.thrift.http.port– HTTP的监听端口,默认值为10001。  
    hive.server2.thrift.http.path – 服务的端点名称,默认为 cliservice。  
    hive.server2.thrift.http.min.worker.threads– 服务池中的最小工作线程,默认为5。  
    hive.server2.thrift.http.max.worker.threads– 服务池中的最小工作线程,默认为500。  

启动Hiveserver2有两种方式,一种是上面已经介绍过的hive --service hiveserver2,另一种更为简洁,为hiveserver2。使用hive--service hiveserver2 –H或hive--service hiveserver2 –help查看帮助信息:

[html] view plain copy
Starting HiveServer2  
Unrecognizedoption: -h  
usage:hiveserver2  
-H,--help                        Print help information  
    --hiveconf <propertyproperty=value>   Use value for given property  

默认情况下,HiveServer2以提交查询的用户执行查询(true),如果hive.server2.enable.doAs设置为false,查询将以运行hiveserver2进程的用户运行。为了防止非加密模式下的内存泄露,可以通过设置下面的参数为true禁用文件系统的缓存:
[html] view plain copy
fs.hdfs.impl.disable.cache – 禁用HDFS文件系统缓存,默认值为false。
fs.file.impl.disable.cache – 禁用本地文件系统缓存,默认值为false。

3):hiveserver2节点配置
Hiveserver2已经不再需要hive.metastore.local这个配置项了(hive.metastore.uris为空,则表示是metastore在本地,否则
就是远程)远程的话直接配置hive.metastore.uris即可

    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://xxx.xxx.xxx.xxx:9083</value>
        <description>Thrift URI for the remote metastore. Used by metastore client to con
    nect to remote metastore.</description>
      </property>

4):zookeeper配置

    [html] view plain copy 
    <property>  
      <name>hive.support.concurrency</name>  
      <description>Enable Hive's Table Lock Manager Service</description>  
      <value>true</value>  
    </property>  
    <property>  
      <name>hive.zookeeper.quorum</name>  
      <description>Zookeeper quorum used by Hive's Table Lock Manager</description>  
      <value>master1:2181,slave1:2181,slave2:2181</value>  
    </property>   

注意:没有配置hive.zookeeper.quorum会导致无法并发执行hive ql请求和导致数据异常

5):hiveserver2的Web UI配置
Hive 2.0 以后才支持Web UI的,在以前的版本中并不支持

    [html] view plain copy
    <property>  
        <name>hive.server2.webui.host</name>  
        <value>192.168.48.130</value>  
        <description>The host address the HiveServer2 WebUI will listen on</description>  
      </property>  
      <property>  
        <name>hive.server2.webui.port</name>  
        <value>10002</value>  
        <description>The port the HiveServer2 WebUI will listen on. This can beset to 0 o  
    r a negative integer to disable the web UI</description>  
      </property>  


   启动服务:
   1):启动metastore
   bin/hive --service metastore &
   默认端口为9083
   2):启动hiveserver2
   bin/hive --service hiveserver2 &
   3):测试
   Web UI:http://192.168.48.130:10002/

Hive内置服务文章出处:@http://blog.csdn.net/gamer_gyt

上一篇下一篇

猜你喜欢

热点阅读