Hive编程指南 PDF 中文高清版

内容简介

Hive是什么?

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

  《Hive编程指南》是一本ApacheHive的编程指南,旨在介绍如何使用Hive的SQL方法——HiveQL来汇总、查询和分析存储在Hadoop分布式文件系统上的大数据集合。《Hive编程指南》通过大量的实例,首先介绍如何在用户环境下安装和配置Hive,并对Hadoop和MapReduce进行详尽阐述,最终演示Hive如何在Hadoop生态系统进行工作。

HIVE能做什么?

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

  《Hive编程指南》适合对大数据感兴趣的爱好者以及正在使用Hadoop系统的数据库管理员阅读使用。

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任务)。

图片 1

image

图片 2

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

作者简介

关于用户接口

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

Edward
Capriolo:Media6degrees公司系统管理员,他是Apache软件基金会成员,还是Hadoop-Hive项目成员。
Dean Wampler:Think Big
Analytics公司总顾问,对大数据问题以及Hadoop和机器学习有专门的研究。
Jason Rutherglen:Think Big
Analytics公司软件架构师,对大数据、Hadoop、搜索和安全有专门的研究。

关于元数据的存储

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

目录

关于Parser, Optimizer, Execution

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

第1章 基础知识
1.1 Hadoop和MapReduce综述
1.2 Hadoop生态系统中的Hive
1.2.1 Pig
1.2.2 HBase
1.2.3 Cascading、Crunch及其他
1.3 Java和Hive:词频统计算法
1.4 后续事情

知识体系

图片 3

image

第2章 基础操作
2.1 安装预先配置好的虚拟机
2.2 安装详细步骤
2.2.1 装Java
2.2.2 安装Hadoop
2.2.3 本地模式、伪分布式模式和分布式模式
2.2.4 测试Hadoop
2.2.5 安装Hive
2.3 Hive内部是什么
2.4 启动Hive
2.5 配置Hadoop环境
2.5.1 本地模式配置
2.5.2 分布式模式和伪分布式模式配置
2.5.3 使用JDBC连接元数据
2.6 Hive命令
2.7 命令行界面
2.7.1 CLI 选项
2.7.2 变量和属性
2.7.3 Hive中“一次使用”命令
2.7.4 从文件中执行Hive查询
2.7.5 hiverc文件
2.7.6 使用Hive CLI的更多介绍
2.7.7 查看操作命令历史
2.7.8 执行shell命令
2.7.9 在Hive内使用Hadoop的dfs命令
2.7.10 Hive脚本中如何进行注释
2.7.11 显示字段名称

Hive的数据模型

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

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

第3章 数据类型和文件格式
3.1 基本数据类型
3.2 集合数据类型
3.3 文本文件数据编码
3.4 读时模式

内部表

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

第4章 HiveQL:数据定义
4.1 Hive中的数据库
4.2 修改数据库
4.3 创建表
4.3.1 管理表
4.3.2 外部表
4.4 分区表、管理表
4.4.1 外部分区表
4.4.2 自定义表的存储格式
4.5 删除表
4.6 修改表
4.6.1 表重命名
4.6.2 增加、修改和删除表分区
4.6.3 修改列信息
4.6.4 增加列
4.6.5 删除或者替换列
4.6.6 修改表属性
4.6.7 修改存储属性
4.6.8 众多的修改表语句

外部表

外部表指向已经在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

第5章 HiveQL:数据操作
5.1 向管理表中装载数据
5.2 通过查询语句向表中插入数据
5.3 单个查询语句中创建表并加载数据
5.4 导出数据

分区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

第6章 HiveQL:查询
6.1 SELECT…FROM语句
6.1.1 使用正则表达式来指定列
6.1.2 使用列值进行计算
6.1.3 算术运算符
6.1.4 使用函数
6.1.5 LIMIT语句
6.1.6 列别名
6.1.7 嵌套SELECT语句
6.1.8 CASE…WHEN…THEN 句式
6.1.9 什么情况下Hive可以避免进行MapReduce
6.2 WHERE语句
6.2.1 谓词操作符
6.2.2 关于浮点数比较
6.2.3 LIKE和RLIKE
6.3 GROUP BY 语句
6.4 JOIN语句
6.4.1 INNER JOIN
6.4.2 JOIN优化
6.4.3 LEFT OUTER JOIN
6.4.4 OUTER JOIN
6.4.5 RIGHT OUTER JOIN
6.4.6 FULL OUTER JOIN
6.4.7 LEFT SEMI-JOIN
6.4.8 笛卡尔积JOIN
6.4.9 map-side JOIN
6.5 ORDER BY和SORT BY
6.6 含有SORT BY 的DISTRIBUTE BY
6.7 CLUSTER BY
6.8 类型转换
6.9 抽样查询
6.9.1 数据块抽样
6.9.2 分桶表的输入裁剪
6.10 UNION ALL

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;

第7章 HiveQL:视图
7.1 使用视图来降低查询复杂度
7.2 使用视图来限制基于条件过滤的数据
7.3 动态分区中的视图和map类型
7.4 视图零零碎碎相关的事情

视图

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

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

create view test_view as select * from test

第8章 HiveQL:索引
8.1 创建索引
8.2 重建索引
8.3 显示索引
8.4 删除索引
8.5 实现一个定制化的索引处理器

操作

  • 创建数据库

     CREATE DATABASE [IF NOT EXISTS] userdb; //userdb是数据库的名字
  • 验证数据库列表:

     hive> SHOW DATABASES; default userdb
  • JDBC程序:

     import java.sql.SQLException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.sql.DriverManager; public class HiveCreateDb { private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; public static void main(String[] args) throws SQLException { // Register driver and create driver instance Class.forName(driverName); // get connection Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", ""); Statement stmt = con.createStatement(); stmt.executeQuery("CREATE DATABASE userdb"); System.out.println(“Database userdb created successfully.”); con.close(); } }

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

$ javac HiveCreateDb.java$ java HiveCreateDb

输出:

Database userdb created successfully.
  • 删除数据库

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

 hive> DROP DATABASE IF EXISTS userdb;
  • 创建表

     hive> CREATE TABLE IF NOT EXISTS employee ( eid int, name String, > salary String, destination String) > COMMENT ‘Employee details’ > ROW FORMAT DELIMITED > FIELDS TERMINATED BY ‘t’ > LINES TERMINATED BY ‘n’ > STORED AS TEXTFILE;
  • 载入数据

一般来说,在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聚合函数。

返回类型签名描述
BIGINTcount(), count(expr), count() -返回检索行的总数。
DOUBLEsum(col), sum(DISTINCT col)返回该组或该组中的列的不同值的分组和所有元素的总和。
DOUBLEavg(col), avg(DISTINCT col)返回上述组或该组中的列的不同值的元素的平均值。
DOUBLEmin(col)返回该组中的列的最小值。
DOUBLEmax(col)返回该组中的列的最大值。
  • 视图和索引

  • Select Where

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

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);
成功执行查询后,能看到以下回应:

IDNAMEAMOUNTDATE
1RameshNULLNULL
2Khilan15602009-11-20 00:00:00
3kaushik30002009-10-08 00:00:00
3kaushik15002009-10-08 00:00:00
4Chaitali20602008-05-20 00:00:00
5HardikNULLNULL
6KomalNULLNULL
7MuffyNULLNULL

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);
成功执行查询后,能看到以下回应:

IDNAMEAMOUNTDATE
3kaushik30002009-10-08 00:00:00
3kaushik15002009-10-08 00:00:00
2Khilan15602009-11-20 00:00:00
4Chaitali20602008-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);
成功执行查询后,能看到以下回应:

IDNAMEAMOUNTDATE
1RameshNULLNULL
2Khilan15602009-11-20 00:00:00
3kaushik30002009-10-08 00:00:00
3kaushik15002009-10-08 00:00:00
4Chaitali20602008-05-20 00:00:00
5HardikNULLNULL
6KomalNULLNULL
7MuffyNULLNULL
3kaushik30002009-10-08 00:00:00
3kaushik15002009-10-08 00:00:00
2Khilan15602009-11-20 00:00:00
4Chaitali20602008-05-20 00:00:00

第9章 模式设计
9.1 按天划分的表
9.2 关于分区
9.3 唯一键和标准化
9.4 同一份数据多种处理
9.5 对于每个表的分区
9.6 分桶表数据存储
9.7 为表增加列
9.8 使用列存储表
9.8.1 重复数据
9.8.2 多列
9.9 (几乎)总是使用压缩

Hive的操作

第10章 调优
10.1 使用EXPLAIN
10.2 EXPLAIN EXTENDED
10.3 限制调整
10.4 JOIN优化
10.5 本地模式
10.6 并行执行
10.7 严格模式
10.8 调整mapper和reducer个数
10.9 JVM重用
10.10 索引
10.11 动态分区调整
10.12 推测执行
10.13 单个MapReduce中多个GROUP BY
10.14 虚拟列

一: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,下面介绍最有用的一些服务

  • 1、cli:是Command Line Interface
    的缩写,是Hive的命令行界面,用的比较多,是默认服务,直接可以在命令行里使用

  • 2、hiveserver:这个可以让Hive以提供Thrift服务的服务器形式来运行,可以允许许多个不同语言编写的客户端进行通信,使用需要启动HiveServer服务以和客户端联系,我们可以通过设置HIVE_PORT环境变量来设置服务器所监听的端口,在默认情况下,端口号为10000,这个可以通过以下方式来启动Hiverserver:
    bin/hive --service hiveserver -p 10002
    其中-p参数也是用来指定监听端口的

  • 3、hwi:其实就是hive web interface的缩写它是hive的web借口,是hive
    cli的一个web替代方案

  • 4、jar:与hadoop jar等价的Hive接口,这是运行类路径中同时包含Hadoop
    和Hive类的Java应用程序的简便方式

  • 5、metastore:在默认的情况下,metastore和hive服务运行在同一个进程中,使用这个服务,可以让metastore作为一个单独的进程运行,我们可以通过METASTOE——PORT来指定监听的端口号

第11章 其他文件格式和压缩方法
11.1 确定安装编解码器
11.2 选择一种压缩编/解码器
11.3 开启中间压缩
11.4 最终输出结果压缩
11.5 sequence file存储格式
11.6 使用压缩实践
11.7 存档分区
11.8 压缩:包扎

二:Hive的三种启动方式

  • 1, hive 命令行模式
    进入hive安装目录,输入bin/hive的执行程序,或者输入 hive –service
    cli
    用于linux平台命令行查询,查询语句基本跟mysql查询语句类似

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

  • 3, hive 远程服务 (端口号10000) 启动方式
    bin/hive –service hiveserver2 &(&表示后台运行)
    用java,python等程序实现通过jdbc等驱动的访问hive就用这种起动方式了,这个是程序员最需要的方式了

第12章 开发
12.1 修改Log4J属性
12.2 连接Java调试器到Hive
12.3 从源码编译Hive
12.3.1 执行Hive测试用例
12.3.2 执行hook
12.4 配置Hive和Eclipse
12.5 Maven工程中使用Hive
12.6 Hive中使用hive_test进行单元测试
12.7 新增的插件开发工具箱(PDK)

三:hiveServer/HiveServer2

  • 1:简单介绍
    两者都允许远程客户端使用多种编程语言,通过HiveServer或者HiveServer2,客户端可以在不启动CLI的情况下对Hive中的数据进行操作,连这个和都允许远程客户端使用多种编程语言如java,python等向hive提交请求,取回结果(从hive0.15起就不再支持hiveserver了),但是在这里我们还是要说一下hiveserver
    HiveServer或者HiveServer2都是基于Thrift的,但HiveSever有时被称为Thrift
    server,而HiveServer2却不会。既然已经存在HiveServer,为什么还需要HiveServer2呢?这是因为HiveServer不能处理多于一个客户端的并发请求,这是由于HiveServer使用的Thrift接口所导致的限制,不能通过修改HiveServer的代码修正。因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供更好的支持。

  • 2:两者的区别
    Hiveserver1 和hiveserver2的JDBC区别:
    HiveServer version Connection URL Driver Class

     HiveServer2 jdbc:hive2://: org.apache.hive.jdbc.HiveDriver HiveServer1 jdbc:hive://: org.apache.hadoop.hive.jdbc.HiveDriver
  • 3:学习HiveServer和HiveServer2
    HiveServer:
    在命令行输入hive --service hiveserver
    –help查看hiveserver的帮助信息:

[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 copyStarting 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。

  • 4:配置使用hiveserver2(Hive 2.0为例)

     sudo vim hive-site.xml 1):配置监听端口和路径 <property> <name>hive.server2.thrift.port</name> <value>10000</value> </property> <property> <name>hive.server2.thrift.bind.host</name> <value>192.168.48.130</value> </property> 2):设置impersonation这样hive server会以提交用户的身份去执行语句,如果设置为false,则会以起hive server daemon的admin user来执行语句 <property> <name>hive.server2.enable.doAs</name> <value>true</value> </property>

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

第13章 函数
13.1 发现和描述函数
13.2 调用函数
13.3 标准函数
13.4 聚合函数
13.5 表生成函数
13.6 一个通过日期计算其星座的UDF
13.7 UDF与GenericUDF
13.8 不变函数
13.9 用户自定义聚合函数
13.10 用户自定义表生成函数
13.10.1 可以产生多行数据的UDTF
13.10.2 可以产生具有多个字段的单行数据的UDTF
13.10.3 可以模拟复杂数据类型的UDTF
13.11 在 UDF中访问分布式缓存
13.12 以函数的方式使用注解
13.12.1 定数性(deterministic)标注
13.12.2 状态性(stateful)标注
13.12.3 唯一性
13.13 宏命令

第14章 Streaming
14.1 恒等变换
14.2 改变类型
14.3 投影变换
14.4 操作转换
14.5 使用分布式内存
14.6 由一行产生多行
14.7 使用streaming进行聚合计算
14.8 CLUSTER BY、DISTRIBUTE BY、SORT BY
14.9 GenericMR Tools for Streaming to Java
14.10 计算cogroup

相关文章

Comment ()
评论是一种美德,说点什么吧,否则我会恨你的。。。