欢迎投稿

今日深度:

hive数据仓库,

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 [库名]
  1. 操作表

数据类型:

  • 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 [分区字段名]='值';

  1. 创建多分区表
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;
	}
}

  1. 上传服务器
  2. hive客户端加载jar包:add jar /root/tuomin.jar;
  3. hive创建临时函数:create temporary function [自定义函数名称] as '[项目包名]';create temporary function tm as ‘com.tuomin.TuoMin’;
  4. 使用函数: select tm(name) from qidu;
  5. 删除函数:drop temporary function tm;
  6. 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时,表的最大值 .
  • 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个数

  • 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
  1. 替换和添加相关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/目录下
  1. 将hive连接mysql的jar包拷贝到hive解压目录的bin目录下/apache-hive-1.2.1-bin/lib
  2. 启动mysql数据库
  3. 启动hadoop2.x服务器集群
  4. 修改配置文件 (选择以下三种模式中的一种)
  • 本地用户模式(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
  • 启动mysqlservice mysqld start
  • 启动hive数据仓库:
  • 本地模式:hive
  • 分开模式:服务端启动hive --service metastore,客户端启动hive

关闭集群

  • 退出hive
  • 关闭hadoopstop-all.sh
  • 关闭所有的zookeeper服务器(ZK)zkServer.sh stop,
  • 规划作为RM服务器的节点关闭ResourceManeger:yarn-daemon.sh stop resourcemanager
  • 关闭数据库

www.htsjk.Com true http://www.htsjk.com/hive/37467.html NewsArticle hive数据仓库, 目录 hive简单介绍 hive架构 DDL语句 DML语句 hive分区 动态分区 函数自定义 分桶 hive运行方式 权限管理 hive的GUI接口 HIve优化 hive数据仓库的搭建 hive简单介绍 hive不是分布式...
相关文章
    暂无相关文章
评论暂时关闭