hive数据仓库,
目录
- hive简单介绍
- hive架构
- DDL语句
- DML语句
- hive分区
- 动态分区
- 函数自定义
- 分桶
- hive运行方式
- 权限管理
- hive的GUI接口
- HIve优化
- hive数据仓库的搭建
hive简单介绍
- hive不是分布式的.
- hive基于hadoop的数据仓库, 将结构化的数据文件映射成为一张hive数据库表,并且提供简单的sql查询功能 , 可以将sql语句转换成MapReduce任务执行 , hive2.x版本后支持转换成spark任务,更快.
- 为什么要学hive? hive产生的目的是为了让非java编程者使用SQL对HDFS的数据进行mapreduce操作,使用sql来快速实现简单的MR统计任务 , 不必开发专门的MR应用,降低了学习的成本 , 非常适合数据仓库的统计分析 .
- 数据仓库,为企业所有级别的决策制定过程 ,提供所有类型数据支持的战略集合 . 出于分析性报告和决策支持目的而创建. 总之, 数据仓库是用来做查询分析的数据库 , 基本不用来做插入,修改.删除操作
- 数据库一般用作实时的交互和持久化 , 数据仓库一般用于数据分析 .
- 数据处理大致分两大类 : 联机事务处理OLTP和联机分析处理OLAP .
- OLTP是传统关系型数据库的主要应用 , 基本的日常的事务处理 , 像银行交易 . OLTP强调数据库内存效率 , 强调内存各种指标的命令率 , 绑定变量和并发操作 .
- OLAP是数据仓库的主要运用 , 支持复杂的分析操作 , 侧重决策支持 , 并且提供直观易懂的查询结果. 强调数据分析 , 强调SQL执行时常 , 强调磁盘I/O , 强调分区等 .
hive架构
- hive的与用户接口有三个:CLI , client 和WUI .
- 最常用的是CLI命令行 , CLI启动的时候, 同时启动一个hive副本,
- client是hive的客户端, 用户连接到HiveServer . 启动Client模式的时候, 需要指出HiveServer所在节点 , 在该接电启动HiveServer .
- wui是通过浏览器访问Hive
- Hive将元数据储存在Mysql等数据库中 , Hive中的元数据包括表名, 表的列和分区以及属性 , 是否为外表 , 表的数据所在路径等 .
- 解释器 , 编译器,优化器完成HQL查询语句从词法分析, 语法分析,编译优化以及查询计划的生成 . 生成的查询计划存储在HDFS中 , 随后有MR调用执行 .
- 编译器将hive sql转换成操作符, 曹组舒服是hive的最小处理单元 . 每个操作符代表HDFS的一个操作或者一道mapreduce作业 . 操作符有select操作符用于查询 ,TableScan操作符用于扫描数据表 , limit操作符用于限制输出, FileOutput操作符用于文件输出 .
- Hive数据存储在HDFS中 , 使用者写sql语句后任务被解析成MR任务来执行 . 但不是所有的sql语句都要被解析成MR任务来执行的 , 例如select * 这种查询所有数据的语句 , 我们只需要直接将hdfs上的数据文件读出来就可以了 .
- HIve的执行流程: 使用者提交一个sql , 客户端访问服务端 , 服务端和关系型数据库交互, 通过元数据信息判断数据库表是否存在, 如果存在就把sql进行Compiler编译成一个jar包或者java程序 , 提交给hadoop的mapreduce执行任务 , 之后返回数据给服务端 , 服务端返回数据到客户端 .
DDL语句
- 创建数据库
create database [库名];
- 查看库
show databases;
- 删除数据库
drop database [库名]
如果要删除非空的数据库drop database [库名] cascade;
- 使用数据库
use [库名]
- 操作表
数据类型:
- data_type
- primitive_type 原始数据类型
- array_type 数组
- map_type map
- struct_type
- union_type – (Note: Available in Hive 0.7.0 and later)
- primitive_type (基本类型)
: TINYINT
| SMALLINT
INT
BIGINT
| BOOLEAN
| FLOAT
DOUBLE
| DOUBLE PRECISION
STRING 基本可以搞定一切
| BINARY
| TIMESTAMP
| DECIMAL
| DECIMAL(precision, scale)
- DATE
| VARCHAR
| CHAR
- array_type
: ARRAY < data_type >
- map_type
: MAP < primitive_type, data_type >
- struct_type
: STRUCT < col_name : data_type [COMMENT col_comment], …>
- union_type
: UNIONTYPE < data_type, data_type, … >
(要插入的数据)
- 查看表结构
desc [表名];
- 查看详细的表结构
desc formatted [表名];
- 创建表
create table abc(
id int,
name string,
age int,
likes array<string>,
address map<string,string>
)
row format delimited fields terminated by ','
COLLECTION ITEMS TERMINATED by '-'
map keys terminated by ':'
lines terminated by '\n';
Select address[‘city’] from person where name=‘zs’;
- 创建外部表,表删除只删除元数据,不删除数据,再次创建数据自动恢复
create external table people(
id int,
name string,
age int,
likes array<string>,
address map<string,string>
)
row format delimited fields terminated by ','
COLLECTION ITEMS TERMINATED by '-'
map keys terminated by ':'
lines terminated by '\n';
- 删除表,更新表
drop table [表名]
- 修改表
- 更新数据
- 删除数据
DML语句
- 插入/导入数据
- HDFS:
LOAD DATA INPATH 'hdfs://[集群名称]/[文件]' OVERWRITE INTO TABLE [表名];
- 本地磁盘:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE [表名]
- 创建2表,然后表1中导入数据:
INSERT OVERWRITE TABLE [表2] SELECT id,name,age From [表名];
FROM [表1] t1 INSERT OVERWRITE TABLE [表1] SELECT t1.id , t1.name, t1.age;
hive分区
为了方便管理和查询海量数据,我们可以建立分区(可按日期 部门等具体业务分区)。分门别类的管理。
必须在表定义时创建partition !
分区分为:单分区和多分区
分区分为:静态分区和动态分区
- 查看分区
show partitions [表名];
- 创建分区
create table day_table(
id int,
content string
)
partitioned by (dt string)
row format delimited fields terminated by ',';
- 向分区的表导入数据
本地:
load data local inpath '[本地文件路径]' into table [表名] partition([分区字段名]='值');
例子:load data local inpath ‘/root/havedate’ into table day_table partition(dt=‘2019-01-12’);
hdfs:
查询数据select * from [表名] where [分区字段名]='值';
- 创建多分区表
create table day_table2(
id int,
content string
)
partitioned by (dt string,hour string)
row format delimited fields terminated by ',';
本地:
load data local inpath '[本地文件路径]' into table [表名] partition([分区字段名]='值',[分区字段名]='值');
- 修改分区
alter table [表名] add partition([分区字段名]='值')'
,例子: alter table day_table add partition(dt=‘2028-08-08’); 不能增减子目录结构,patition的类型在表创建的时候已经定义.相当于又添加了一个新的分区,大部分时候是为了方便insert插入数据. - 删除分区
alter table [表名] drop partition([字段名]='值')
- 重命名分区
alter table [表名] partition([字段名]='值') rename to partition([字段名]='新的值');
查询后的数据保存
- 保存到本地
insert overwrite local directory '[本地储存路径]' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select * from [查询数据的表] ;
- 保存到HDFS
insert overwrite directory 'hdfs://Credi/user/o_o/' select * from [查询数据的表]
- shell数据重定向
备份数据和还原数据
- 备份数据
export table [备份的表] to '[备份数据的路径]' ;
- 表删除后如何还原
import from '[数据备份所在路径]'
动态分区
静态分区一次操作只能讲数据分到同一个分区中 , 动态分区可以实现一次操作数据分配不同分区 .
(注意是外部分区,查询表的字段名和外部分区表的字段名不可一致 , 分区字段对应的查询表字段值放在查询的最后)
1.创建外部分区表(删除表不删除数据)
create external table t2(
name string
)
partitioned by(country string,state string);
2 开启动态分区,默认是关闭的
set hive.exec.dynamic,partition=true;
3. 模式,严格模式strict,至少指定一个分区为静态分区. 非严格模式honstrict,允许所有分区字段都可以收银动态,一般设置为nonstrict模式
set hive.exec.dynamic.partition.mode=nonstrict;
4. 在每个执行MaperReducer节点上,创建动态分区的最大上限,默认100个,例如元数据包含一年的数据,day字段有365个值,那么该参数应该设置成大于365,如果默认值是100,会报错
set hive.exec.max.dynamic.partitions.pernode=1000
5. 在所有执行MaperReducer的节点上,最大一共可以创建多少个动态分区.默认值是1000
set hive.exec.max.dynamic.partitions
6. 整个MR Job中,最大可以创建多少个HDFS文件。
一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。
hive.exec.max.created.files
7. 当有空分区生成时,是否抛出异常,默认false。
hive.error.on.empty.partition
8.插入数据
insert into table [表] partition([字段],[字段]) select [字段名],[分区名] from [查询表表名];
例子:把t1表查到的数据动态导入t2表,根据值自动分区:insert into table t2 partition(country,state) select name,cty,st from t1
;
- 注意表的分区字段和表的字段不能相同,动态导入无法识别
函数自定义
自定义函数包括三种 UDF、UDAF、UDTF
UDF:一进一出
UDAF:聚集函数,多进一出,例如:Count/max/min
UDTF:一进多出,例如:lateralview explore()
使用方式 :在HIVE会话中add自定义函数的jar 文件,然后创建 function 继而使用函数
- UDF:一进一出
UDF 函数可以直接应用于 select 语句,对查询结构做格式化处理后,再输出内容。
编写 UDF 函数的时候需要注意一下几点:
a)自定义 UDF 需要继承 org.apache.hadoop.hive.ql.UDF。
b)需要实现 evaluate 函数,evaluate 函数支持重载。
package com.tuomin;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class ToMin extends UDF{
private Text res = new Text();
public Text evaluate(String str){
if(str == null){
return null;
}
String first = str.substring(0,1);
String last = str.substring(str.length()-1,str.length());
res.set(first+"***"+last);
return res;
}
}
- 上传服务器
- hive客户端加载jar包:
add jar /root/tuomin.jar;
- hive创建临时函数:
create temporary function [自定义函数名称] as '[项目包名]';
create temporary function tm as ‘com.tuomin.TuoMin’; - 使用函数:
select tm(name) from qidu;
- 删除函数:
drop temporary function tm;
- hive删除jar包:
delete jar /root/tuoming.jar
- UDAF:聚集函数,多进一出,例如:Count/max/min
多行进一行出,如 sum()、min(),用在 group by 时
1.必须继承org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)
org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类 Eval uator 实现 UDAFEvaluator 接口)
2.Evaluator 需要实现 init、iterate、terminatePartial、merge、terminate 这几个函数
init():类似于构造函数,用于 UDAF 的初始化
iterate():接收传入的参数,并进行内部的轮转,返回 boolean
terminatePartial():无参数,其为 iterate 函数轮转结束后,返回轮转数据,类似于 hadoop 的 Combinermerge():接收 terminatePartial 的返回结果,进行数据 merge 操作,其返回类型为 boolean
terminate():返回最终的聚集函数结果
开发一个功能同:
Oracle 的 wm_concat()函数
Mysql 的 group_concat()
Hive UDF 的数据类型:
- UDTF:一进多出,例如:lateralview explore()
用的少
分桶
分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
对于hive中每一个表、分区都可以进一步进行分桶。
由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。值%桶数+1
适用场景:
数据抽样( sampling )、map-join
-
开启支持分桶:
set hive.enforce.bucketing=true;
默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用)
注意:一次作业产生的桶(文件数量)和reduce task个数一致。 -
创建普通表
CREATE TABLE mm( id INT, name STRING, age INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
- 将数据加载到普通表mm , 数据格式如下
1,tom,11
2,cat,22
3,dog,33
4,hive,44
5,hbase,55
6,mr,66
7,alice,77
8,scala,88
- 创建分桶表
create table fentong(
id int,
name string,
age int
)
clustered by(age) into 4 buckets
row format delimited fields terminated by ',';
(根据age的值分四个桶)
- 分桶表加载数据
insert into table fentong select id, name, age from mm;
- 对分桶的数据进行抽样查询
select id, name, age from fentong tablesample(bucket 2 out of 4 on age);
(分桶表4个桶的第2个桶的数据根据age的字段进行查询)
Hive Lateral View
count:统计, distinct:去重, myTable1,2:虚拟表, myCol1,2,3:别名
把qidu表的likes和address字段去重然后统计.
select count(distinct(myCol1)), count(distinct(myCol2)) from qidu
lateral view explode(likes) myTable1 as myCol1
lateral view explode(address) myTable2 as myCol2,myCol3;
select myCol1,myCol2,myCol3 from qidu
lateral view explode(likes) myTable1 as myCol1
lateral view explode(address) myTable2 as myCol2,myCol3;
hive运行方式
- Hive在Cli客户端模式中
- 与hdfs交互,执行dfs命令
dfs -ls /user/hive_local/warehouse/xx.db;
- 与Linux交互,
!pwd
- Hive脚本运行方式:
- 在Linux环境下查询表
hive -e "select * from xx.qidu"
- 在Linux环境下运行脚本:
hive -f [脚本文件]
- 只显示查询结果,不显示查询过程:
hive -S -e [sql]
- hive模式下,执行linux脚本
source /root/file
权限管理
- Default Hive Authorization (Legacy Mode) hive默认授权
- SQL Standards Based Authorization in HiveServer2基于SQL标准的Hive授权
- 完全兼容SQL的授权模型,推荐使用该模式。
- 除支持对于用户的授权认证,还支持角色role的授权认证
- role可理解为是一组权限的集合,通过role为用户授权
- 一个用户可以具有一个或多个角色
- 默认包含俩种角色:public、admin
- Storage Based Authorization in the Metastore Server基于存储的授权
- 可以对Metastore中的元数据进行保护,但是没有提供更加细粒度的访问控制(例如:列级别、行级别)。
- hive服务端 , hive-site.xml添加如下配置
<property>
<name>hive.security.authorization.enabled</name>
<!--是否开启用户权限认证-->
<value>true</value>
</property>
<property>
<!--默认语法规则,不重要-->
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
<property>
<name>hive.users.in.admin.role</name>
<!--超级管理员用户名-->
<value>root</value>
</property>
<property>
<!--Java实现类manager相关类,实现了认证规则-->
<name>hive.security.authorization.manager</name>
<!--基于sql规范级别--><value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
</property>
<property>
<!--Java实现类manager相关类,实现了认证规则-->
<name>hive.security.authenticator.manager</name>
<!--基于会话级别-->
<value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value>
</property>
- 服务端启动hiveserver2;
- 客户端通过beeline进行连接
角色的添加、删除、查看、设置:
CREATE ROLE role_name;
– 创建角色
DROP ROLE role_name;
– 删除角色
SET ROLE (role_name|ALL|NONE);
– 设置角色:set role admin;
SHOW CURRENT ROLES;
– 查看当前具有的角色
SHOW ROLES;
– 查看所有存在的角色
hive的GUI接口
- 下载apache-hive-1.2.1-src.tar.gz包
- 解压后,到hwi目录下web目录中,在window窗口地址栏用
jar -cvf hive-hwi.war *
将hwi/web/*里面所有的文件打成war包 - 将war包上传到hive客户端节点的服务器
- 将jdk/lib包下的tools.jar文件拷贝到hive/lib目录下
cp /usr/java/jdk1.7.0_67/lib/tools.jar /home/apache-hive-1.2.1-bin/lib/
- hive-site.xml文件中添加如下配置
<property>
<name>hive.hwi.listen.host</name>
<!--0.0.0.0代表本地-->
<value>0.0.0.0</value>
</property>
<property>
<name>hive.hwi.listen.port</name>
<!--监听端口9999-->
<value>9999</value>
</property>
<property>
<name>hive.hwi.war.file</name>
<!--GUIwar包的目录-->
<value>lib/hive-hwi.war</value>
</property>
hive --service hwi
命令启动, 浏览器[服务器节点]:9999/hwi/
访问
hive的常用函数
- select
- count
- sum
- where
- round
- rand
- < > =
- …
HIve优化
- 核心思想 : 把Hive SQL 当做Mapreduce程序去优化
- 以下SQL不会转为Mapreduce来执行
- select仅查询本表字段
- where仅对本表字段做条件过滤
- Explain 显示执行计划
EXPLAIN [EXTENDED] query
: explain select count(*) from people;
- 小表操作特别多的时候, 数据量小的时候, 设置成本地模式
开启本地模式 :set hive.exec.mode.local.auto=true;
- 只有加载文件的最大值如果大于默认值128M , 则自动以集群模式运行.
set hive.exec.mode.local.auto.inputbytes.max=128
- 开启并行计算
开启并行计算的前提是集群的资源够用的时候使用 , 否则会增高集群负载 .set hive.exec.parallel=true;
- 设置一次sql计算中允许并行执行的最大job个数
hive.exec.parallel.thread.number
- 严格模式
放置用户误操作
set hive.mapred.mode=strict;
(默认非严格模式)- 功能:
- 1.分区表必须添加where对分区字段进行条件过滤.
- 2.order by语句必须包含limit输出限制
- 3.限制执行笛卡尔积的查询
- 功能:
- hive排序
- Order By : 对于查询结果做全排序 , 只允许一个reduce处理(当数据量较大时慎用 , 严格模式下 ,必须要结合limit来限制输出,时间太长了,效率太低了)
- Sort BY : 对单个reduce的数据进行排序 , 数据量大用sortby, 数据量小用orderby
- Distribute By : 分区排序 , 多与Sort By结合使用,结合后效果等于全排.
- Cluster By : 相当于Sort By + Distribute By , 但是区别在于Cluster By 不能通过asc,desc的方式指定排序规则 , 所以不能倒叙 .
- Hive Join
- 将小表放在join的左边
- Map Join : 在Map端完成Join , 核心思想:能不经过shuffle就不经过shuffle,也就没有reduce
- 1 . sql方式 , 在SQL语句添加MapJoin标记(mapjoin hint)
SELECT /*+mapjoin(smallTable)*/ smllTalble.key , bigTable.value FROM smallTable JOIN bigTable ON smallTable.key = bigTable.key;
将小表的数据储存到内存中 , 当匹配到大表的数据再一起输出, 这样就在Map端完成了join操作 , 不再shuffle和reduce - 2 . 开启自动的MapJoin , 自动识别小表和大表
set hive.auto.convert.join=true
开启自动识别后 , hive自动对左边的表进行统计 , 如果是小表就加入内存 , 所以前提是将小表放在join的左边
hive.mapjoin.smalltable.filesize;
判断大表小表的阈值, 如果左边表小于该值就会被加载到内存中运行 .
hive.ignore.mapjoin.hint=true
: 开启后忽略自己在1.sql方式中手动添加的MapJoin标记
(不太重要)hive.auto.convert.join.noconditionaltask=true;
:将普通的join转化为普通的mapjoin是 , 将多个mapjoin合并为一个mapjoin;
(不太重要)hive.auto.convert.join.noconditionaltask.size=true
:多个mapjoin合并为一个mapjoin时,表的最大值 .
- 1 . sql方式 , 在SQL语句添加MapJoin标记(mapjoin hint)
- Map-Side聚合
set hive.map.aggr=true;
:通过配置开启在Map端的聚合hive.groupby.mapaggr.checkinterval=100000
: map端在group by执行聚合时处理的多少行数据(默认100000行)hive.map.aggr.hash.min.reduction
: 类似于combine , 进行聚合的最小比例(预先对100000条数据做聚合,聚合之后的数量/100000的值大于该配置值的0.5,则不会聚合) , 就是程序在map端先读10万行数据做一次测试 , 进行聚合,聚合后数据少了一半的话继续聚合,可以减少输出量 . 当然结果也有可能是不准确的.hive.map.aggr.hash.percentmemory
: map端聚合的时候能够使用的内存最大值 . -hive.map.aggr.hash.force.flush.memory.threshold
: map端聚合操作时hash表的最大可用内容 , 大于该值就会触发flush;hive.groupby.skewindata=true
(重要) : 对groupby产生的数据倾斜做优化 , 默认是false , 数据倾斜的原因是分区的规则不合理, 开启该配置后 , 会指定一个map将数据随机分发到不同的partiton分区 ,当数据趋于平衡之后, 其他map再按分区规则进行数据分发. 所以其实在开发中吧分区规则定义好是最省事儿的, 但是定义合理的分区规则就需要我们对数据足够的了解 .
- 控制hive中Map以及Reduce的数量
- Map数量的控制 , map的个数取决于split切片
mapred.max.spilit.size
: 一个spilit的最大值, 就是每个map处理文件的最大值 , 如果设置64M , 文件有67M , 就会被切成64和3两个切片 ,mapred.min.spilit.size.per.node
: 一个节点上spilit的最小值,就是每个map处理文件的最小值mapred.min.spilit.size.per.rack
: 一个机架上spilit的最小值
- Reduce数量的控制 ,reduce个数控制的时候要注意在分桶的时候 , reduce的个数必须和桶的个数要一致
mapred.reduce.tasks
: 强制指定reduce任务的数量hive.exec.reducers.bytes.per.reducer
: 每个reduce任务处理的数据量hive.exec.reducer.max
: 每个任务最大的reduce个数
- Map数量的控制 , map的个数取决于split切片
- Hive - JVM虚拟机的重用
- 适用的场景 : 小文件的个数过多 , task的个数过多
set mapred.job.reuse.jvm.num.tasks
: 设置task插槽(slot)个数 , 优点是我们在执行sql任务的时候,会需要资源的时候申请一个插槽 , 需要资源的时候 , 又申请一个插槽, 如果我们一开始就申请好足够的插槽的个数 , 就避免了一直申请的过程. 但是缺点是task插槽无论是否使用都会一直占用资源 , 只有到所有任务全部执行完成后 , 才会释放掉所有的task插槽资源 . 所以 , 要申请多少个task插槽很关键 , task插槽的个数取决于业务,数据量,job来判断和测试 .
Hive搭建
- 基于hadoop2.x集群和MapReducer环境和mysql关系型数据库的部署
- 根目录下
vim ~/.bash_profile
- 请根据自身的文件解压路径进行配置
- source命令生效
source ~/.bash_profile
- 替换和添加相关jar包
- 删除所有hadoop集群服务器节点hadoop文件夹
/hadoop-2.6.5/share/hadoop/yarn/lib/
目录下的jline-*.jar文件- 将hive解压文件夹下的
/apache-hive-1.2.1-bin/lib/
目录的jline-*jar文件拷贝到所有hadoop集群服务器节点hadoop文件夹/hadoop-2.6.5/share/hadoop/yarn/lib/
目录下
- 将hive连接mysql的jar包拷贝到hive解压目录的bin目录下
/apache-hive-1.2.1-bin/lib
- 启动mysql数据库
- 启动hadoop2.x服务器集群
- 修改配置文件 (选择以下三种模式中的一种)
- 本地用户模式(hive和mysql安装于同一服务器节点,多用于本地开发测试)
/apache-hive-1.2.1-bin/conf
目录下修改hive-site.xml
文件,如果没有就创建一个.
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<!--设置真实的数据文件储存在HDFS的路径-->
<value>/user/hive_local/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<!--是否本地模式,true/false-->
<value>true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<!--连接的数据库ip地址别名,我的mysql部署在node01上|hive_remote:数据库的名称|上述文件存放路径不存在则自动创建-->
<value>jdbc:mysql://node01/hive_remotelocal?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<!--jdbc驱动类-->
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<!--数据库用户名-->
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<!--数据库用户密码-->
<value>123456</value>
</property>
</configuration>
- 关闭防火墙,启动mysql,启动hadoop集群,使用命令
hive
启动Hive
- 远程模式(hive和mysql安装于不同不服务器节点)
1. remote一体(mysql服务端和客户端安装于不同的服务器节点)
- 此时mysql数据库部署在node01,我们将配置好的hive文件夹移动到node02或者node03都是远程模式中的一体模式
- 将环境变量配置文件
~/.bash_profile
文件也相应发送到node02或node03,然后source命令生效/apache-hive-1.2.1-bin/conf
目录下修改hive-site.xml
文件,如果没有就创建一个.
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<!--设置真实的数据文件储存在HDFS的路径-->
<value>/user/hive_local/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<!--连接的数据库ip地址别名,我的mysql部署在node01上|hive_remote:数据库的名称|上述文件存放路径不存在则自动创建-->
<value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<!--jdbc驱动类-->
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<!--数据库用户名-->
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<!--数据库用户密码-->
<value>123456</value>
</property>
<property>
<name>hive.metastore.local</name>
<!--是否本地模式,true/false-->
<value>false</value>
</property>
</configuration>
- 如果是hadooop2.5版本,还需加入如下配置(2.6加了反而出错):
<property>
<name>hive.metastore.uris</name>
<!--指定数据去哪里获取,服务器端-->
<value>thrift://node01:9083</value>
</property>
2. remote分开模式(公司企业常用,hive和mysql服务端以及客户端均安装于不同服务器节点)
- node01:mysql
- node02:hive 服务端
- node03:客户端
- node02
- 将hive配置文件夹,环境变量发送给node02,source命令生效
- (服务端配置)
/apache-hive-1.2.1-bin/conf
目录下修改hive-site.xml
文件,如果没有就创建一个.
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<!--设置真实的数据文件储存在HDFS的路径-->
<value>/user/hive_local/warehouse2</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<!--连接的数据库ip地址别名,我的mysql部署在node01上|hive_remote:数据库的名称|上述文件存放路径不存在则自动创建-->
<value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<!--jdbc驱动类-->
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<!--数据库用户名-->
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<!--数据库用户密码-->
<value>123456</value>
</property>
</configuration>
- node03
- 将hive配置文件夹,环境变量发送给node03,source命令生效
- (客户端配置)
/apache-hive-1.2.1-bin/conf
目录下修改hive-site.xml
文件,如果没有就创建一个.
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<!--设置真实的数据文件储存在HDFS的路径,客户端需要和服务器端保持一致-->
<value>/user/hive/warehouse2</value>
</property>
<property>
<name>hive.metastore.local</name>
<!--是否本地模式,true/false-->
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<!--指定服务器端-->
<value>thrift://node02:9083</value>
</property>
</configuration>
-
启动即可
3. 内嵌Derby单用户模式
这种安装模式的元数据是内嵌在Derby数据库中的,只能允许一个会话连接,数据会存放到HDFS上。
这种方式是最简单的存储方式,只需要hive-site.xml
做如下配置便可(注:使用 derby 存储方式时,运行 hive 会在当前目录生成一个 derby 文件和一个 metastore_db)
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value> </property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
hadoop2.x搭建hive后的集群启动
启动集群
- 关闭所有防火墙
service iptables stop
- 启动所有的zookeeper服务器(ZK)
zkServer.sh start
, - 全面启动
start-all.sh
- 规划作为RM服务器的节点启动ResourceManeger:
yarn-daemon.sh start resourcemanager
- 启动mysql
service mysqld start
- 启动hive数据仓库:
- 本地模式:
hive
- 分开模式:服务端启动
hive --service metastore
,客户端启动hive
关闭集群
- 退出hive
- 关闭hadoop
stop-all.sh
- 关闭所有的zookeeper服务器(ZK)
zkServer.sh stop
, - 规划作为RM服务器的节点关闭ResourceManeger:
yarn-daemon.sh stop resourcemanager
- 关闭数据库