【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43

一、hive的概念

  • 为什么有Hive
    Hive最初由FaceBook研发出来。由于每天产生的数据量大,使用MapReduce处理的效率比较低,而MapReduce的学习成本比较高,且类SQL的方法,工作效率比较高。Hive的入门简单。

  • Hive是什么
    Hive是一个基于hadoop的数据仓库。可以通过类SQL的方式来对数据进行读、写等管理的功能。
    Hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张书就可以表,并提供类SQL的查询功能

  • Hive的主要用途
    用来做离线书籍分析,碧直接使用MapReduce开发效率更高

  • 为什么使用Hive

      (1)直接使用hadoop的问题
      hadoop的学习成本高,而项目周期要求太短。MapReduce实现复杂查询开发难度比较大
      (2)Hive的优势
      直接操作类似于SQL,提高开发的效率
      避免去学习MapReduce,增加开发人员的学习成本
      功能扩展比较方便
    
  • Hive的特点

  • Hive的优缺点
    (1)优点

      1.学习成本低
      2.可扩展性
      3.适合做离线数据分析处理OLAP
      4.延展性好
      5.良好的容错性
      6.统计管理
    

(2)缺点

	1.hive的hql表达能力有限
	2.hive的效率比较低

二、hive的架构

【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第1张图片
【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第2张图片

三、hive和hadoop的关系

Hive本身并没有多少功能,Hive其实就是在hadoop的基础上封装了一个壳,Hive的存储是基于hdfs的,hive的计算是基于MapReduce的

四、hive与关系型数据的区别

【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第3张图片

五、hive的安装

三种模式,hive会自动检查运行环境,如果检测到本机上安装了Hadoop环境,则必须先启动Hadoop

1. 内嵌模式

元数据的初始化时,会在当前目录下会生成一个db目录,在启动hive时,一定要进入到该目录,
因为hive启动时,需要加载元数据的信息

安装hive

1.解压
tar -zxvf apache-hive-2.1.1-bin.tar.gz -C /opt/apps/

2.改名
mv apache-hive-2.1.1 hive-2.1.1

3.vi /etc/profile
# hive enviroment
export HIVE_HOME=/opt/apps/hive-2.1.1
export PATH=$PATH:$HIVE_HOME/bin


4.修改hive环境
export HIVE_CONF_DIR=/opt/apps/hive-2.1.1/conf
export HIVE_AUX_JARS_PATH=/opt/apps/hive-2.1.1/lib

export JAVA_HOME=/usr/local/jdk/jdk1.8.0_60
export HADOOP_HOME=/usr/local/hadoop-2.7.6



5.修改配置文件
hive-site.xml


运行hive命令:hive
查看数据库:show databases;
查看表:show tables;
创建表:create table if not exists t1(id int,name string);
向表中插入信息:insert into table t1 values(1,‘gaoyuanyuan’);

【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第4张图片
【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第5张图片
【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第6张图片

【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第7张图片

2. 本地模式

使用mysql替换derby进行元数据的存储,hive的相关进程都是在同一台机器上,即本地模式。mysql因为是独立的进程,所以mysql可以和hive在同一机器上,也可以在其他机器上。
【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第8张图片

通常使用关系型数据库来进行元数据存储(mysql、oracle等执行带jdbc驱动的数据库)
优点:支持多session
缺点:需要配置、还需要安装mysql等关系型数据库

安装mysql:

(1)查看是否安装了mysql
rpm -qa | grep mysql

(2)检查是否有mariadb
rpm -qa | grep mariadb

(3)如果已经安装了mysql,需要卸载
rpm -e mariadb-lib-5.3.35-3.el7.x86_64 --nodeps

(4)解压mysql包
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

(5)不需要全部安装,只需要安装部分文件,如下图所示:
若安装server时报如下错误,则按照提示安装依赖

yum list | grep xxxx
yum install -y xxxx

安装命令:
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

(6)初始化mysql
mysqld --initialize --user=mysql

(7)mysql安装过程中会自动生成一个随机密码,下面查看密码
grep "temporary password" /var/log/mysqld.log

(8)启动mysql
systemctl start mysqld
设置开机自启
systemctl enable mysqld

(9)登录mysql
mysql -uroot -p密码

(10)修改本地用户密码
mysql>alter user 'root'@'localhost' identified by '123456';
这里修改密码的话,只能在本地连接mysql,无法建立远程连接

(11)建立远程连接用户
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

(12)刷新权限
flush privileges;

后面操作选做
(13)设置服务端的字符集
character-set-server=utf8
不建议修改这个字符集配置

(14)设置不用验证密码的方式
skip-grant-tables=1

(15)重启mysql服务器
systemctl restart mysqld

需要安装的内容,安装命令如下:
在这里插入图片描述
在这里插入图片描述

安装hive:

(1)配置环境
cp hive-env.sh.template hive-env.sh
vi hive-env.sh
可以配置jdk、hive的conf路径
和上面的一样写

(2)配置hive-site.xml
<!--配置mysql的连接字符串--> 
<property> 
	<name>javax.jdo.option.ConnectionURL</name> 
	<value>jdbc:mysql://host01:3306/hive?createDatabaseIfNotExist=true</value> 
	<description>JDBC connect string for a JDBC metastore</description>
</property>

<!--配置mysql的连接驱动--> 
<property>
 	 <name>javax.jdo.option.ConnectionDriverName</name> 
 	 <value>com.mysql.jdbc.Driver</value>
 	 <description>Driver class name for a JDBC metastore</description> 
 </property> 
 
<!--配置登录mysql的用户--> 
<property> 
	<name>javax.jdo.option.ConnectionUserName</name> 
	<value>root</value> 
	<description>username to use against metastore database</description>
</property> 

<!--配置登录mysql的密码--> 
<property> 
	<name>javax.jdo.option.ConnectionPassword</name> 
	<value>123456</value> 
	<description>password to use against metastore database</description> 
</property


(3)在mysql上创建hive库
hive的元数据在mysql库里创建的数据库hive编码必须使用latin1

(4)创建数据库
mysql>create database hive1 charset=latin1;
不做这一步会报以下错误:
java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient


(5)初始化元数据
做初始化前先将mysql的驱动包放到/root下
然后copy到$HIVE_HOME/lib下
再做初始化
schematool -initSchema -dbType mysql


【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第9张图片

3. 远程模式

需要在hive-site.xml文件配置uris
添加下面信息

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

/opt/apps/hive-2.1.1/bin下初始化数据库
schematool -initSchema -dbType mysql

需要配置下面的两种服务之一

hive的两种服务
第一种:hiveserver2
4. 该服务端口号默认是10000 
5. 可以单独启动此服务进程,供远程客户端连接;此服务内置metastore服务。 
6. 启动方式: 
方法1:直接调用hiveserver2。会进入监听状态不退出。 
方法2:hive --service hiveserver2 & 进入后台启动
方法3:hive --service hiveserver2 2>&1 >/dev/null &; #信息送入黑洞。

第二种:metastore
1. 此服务才是真正连接元数据库的服务进程 
2. 也可以让远程客户端连接 
3. 启动方式: 
4. 方法1:- hive --service metastore & 
5. 方法2:- hive --service metastore 2>&1 >/dev/null &; #信息送入黑洞。

两个服务都要起来

【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第10张图片

客户端连接:beeline
bin/beeline

命令:
帮助:!help
退出:!q

客户端连接hiveserver2服务
方式1:
step1. beeline 回车 
step2. !connect jdbc:hive2://ip:10000 回车 
step3. 输入用户名 回车 
step4. 输入密码 回车 

方法2(直连): 
beeline -u jdbc:hive2://ip:10000 -n 用户名 

解析:hive2,是hive的协议名称 
ip: hiveserver2服务所在的主机IP。 
10000,是hiveserver2的端口号


出现问题???
Enter username for jdbc:hive2://host01:10000: root
Enter password for jdbc:hive2://host01:10000: ******
20/08/25 14:18:31 [main]: WARN jdbc.HiveConnection: Failed to connect to host01:10000
Error: Could not open client transport with JDBC Uri: jdbc:hive2://host01:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: root is not allowed to impersonate root (state=08S01,code=0)


修改Hadoop的配置文件core-site.xml文件,增加如下配置
<property> 
	<name>hadoop.proxyuser.root.hosts</name> 
	<value>*</value> 
</property> 
<property> 
	<name>hadoop.proxyuser.root.groups</name> 
	<value>*</value> 
</property
分发到其他机器
scp core-site.xml root@host03:$PWD
scp core-site.xml root@host04:$PWD
重启服务start-all.sh

六、hive的基本操作


执行sql语句:ctrl+enter
----注释方式
	--
	//
	/**/
	
hive是不区分大小写的,mysql默认不区分,可以设置区分大小写,建议关键字使用大写
命名规则:
	1.名字里不能使用数字开头
	2.不能使用关键字
	3.尽量不要使用特殊符号	


hive李默认有一个数据库default,一般没有指定任何库信息的情况下,默认使用default

查看库:show databases;
查看表:show tables;
创建库:create database if not exists sz2002;
使用库:use sz2002;
	   use default;
创建表:create table if not exists t2(id int,name varchar(20));

在sz2002库中添加一张表t3:create table if not exists sz2002.t2(id int,name varchar(20));
查看指定哪个库的表:show tables in sz2002;		(查看表,可以通过in关键字指定查看的库)


----数据库操作
查看库的定义:desc database sz2002;
查看库的扩展:desc database extend sz2002;
查看库的定义:describe datebase sz2002;

建库的时候添加注解:create database if not exists mei comment 'hi'
建库的本质:在hdfs上的hive的根目录下创建一个以库.db为名称的目录。在mysql元数据库中也会增加一条记录

删除库:drop database if exists sz2002;		--不能删除,只能删除一个空库
强制删除:drop database if exists sz2002 cascade;	


----表的操作
数据类型:int、string(时间类型都是使用string)、varchar、
在数据库sz2002中创建表:create table if not exists sz2002.t1(id int,name string);

加载数据:hdfs dfs -put test.dat /usr/hive/warehose/sz2002.db/t1

hive的默认分隔符是\001  \u001 (ctrl+a   ctrl+v)
hive中默认使用^A(ctrl+A)作为列分割符,如果用户需要指定的话,等同于row format delimited fields terminated by '\001'。所以如果使用默认的分隔符,可以什么都不加,也可以按照上面的指定加‘\001’为列分隔符,效果一样。
hive默认使用的行分隔符是'\n'分隔符 ,也可以加一句:LINES TERMINATED BY '\n' ,加不加效果一样。但是区别是hive可以通过row format delimited fields terminated by '\t'这个语句来指定不同的分隔符。

如果想要指定t2使用其他分隔符:
create table if not exists sz2002.t2(id int,name string);
row format delimited 
fields terminated by '\t'  --每行以\t作为列分隔
lines terminated by '\n'    --每行以\t作为行分隔


hive是严格的读时模式,如果数据不满足要求,则以null值代替
hive中表的类型:
	内部表:表目录会创建在hdfs的根目录(/usr/hive/warehose/)下相应的库目录的对应目录中(表名)
	外部表:外部表会根据建表语句中location指定的路径来创建目录,如果没有指定location,则外置跟内部表创建的位置相同
	内部表和外部表的区别:主要就在两个关键字:extenda、location(内部表其实也能用location。。。)
	内部表:create table if not exists t_inner(id int)
	外部表:create extendal if not exists t_outer(id int,name string) location '/xxxx'; (注意:location后面一定要传入一个目录,这个目录不能是根目录,例如:/或者/user/ve/warehouse,且location不能指定为一个文件)

创建表
create external table if not exsits sz002.t3(id int,name string) 
location  '/t3'; 	--外部表,创建的表会在 / 目录下


----hive建表的时候所做的事情
主要有两件事:
1.在hdfs上创建了一个表目录
2.在mysql元数据库中创建相应的描述信息(元数据信息)


-----hive删除表时
drop table if exists sz2002.t2;		--内部表
drop table if exists sz2002.t3;		--外部表
删除时,mysql上的元数据都会被删除
删除时,内部表的表目录会被删除,但是外部表的表目录不会被删除


----外部表的使用场景
使用后的数据不想被删除的情况,就使用外部表(只删除表结构,但是对于该外部表的各种操作都会被保留下来)
所以,整个数据仓库的最底层的表一般使用外部表
ODS层:业务数据
DW层
DM层

----创建表的本质
在使用的库目录下创建一个目录,这个目录的命名就是表名


----加载数据的方式
方式一:hdfs dfs -put test.dat /表目录
方式二:
(1)数据在linux系统(批量加载数据)
load data [local] inpath '/指定具体的文件' into table  sz2002.t3;
eg:		
(2)数据在hdfs系统
load data inpath '/指定具体的文件' into table  sz2002.t3;3insert into 方式加载数据(或者称为灌入数据)
eg:将t3表中id>=3的数据加载到t1表
insert into table sz2002.t1
select id ,name
from sz2002.t3
where id>=3;


----加载数据的本质
1.如果数据在本地linux系统中,加载数据的本质就是复制,将本地文件copy一份到hdfs的表目录下
2.如果数据在hdfs上,加载数据的本质就是移动,将数据从原来的目录下移动到表目录下,原来的目录下没有了数据


----克隆表,不带数据
eg1:
create table if not exsits sz2002.t5
as
select *
from sz2002.t3
where 1=0; --只克隆表结构,不要表中数据

eg2:
create table if not exsits sz2002.t5
like sz2002.t3


----克隆表并带数据
eg1:
create table if not exsits sz2002.t7
like sz2002.t3 location '/t3';

eg2:
create table if not exsits sz2002.t5
as
select *
from sz2002.t3
where 1=1; --克隆表并带数据


----查看表结构
desc extended sz2002.t6;   --显示表中的字段数据类型(在hive上操作该语句更清晰)
show create table sz2002.t6; --会显示建表的所有语句


----修改表
----修改表名
alter table sz2002.t7 renaem to sz2002.t_user_info;  --修改t7为t_user_info;
show tables in sz2002;
----修改列名
alter table sz2002.t6 change column id uid int;  --修改id为uid,注意要指定数据类型,并且修改的数据类型应当相等或者更大,保证可以转换过去
desc sz2002.t6;
----修改表中字段的相对位置(注意:只能是相同数据类型的数据才能进行相对移动)
alter table sz2002.t6 change column uid int after name string;  --类型不匹配,失败
alter table sz2002.t8 change column id string after name string; --name 和 id的相对位置交换
----修改类型
alter table sz2002.t8 change column id id varchar(20); --将string型id转为 varchar(20),注意不能转成int型
----删除字段
alter table sz2002.t8 replace columns (
id string,
addr string,  --将addr替换name字段,应当保证都是string类型
sex int,	--可以同时增加字段
age int
)   --表结构和数据时分开的,修改的只是表结构,数据不会发生变化

数据类型
【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第11张图片
【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第12张图片
hive中表的数据存储在 /usr/hive/warehose/sz2002.db/t1中
【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第13张图片
【大数据开发】Hive——Hive的概念、架构、安装Hive三种模式、Hive的基本操作day43_第14张图片

你可能感兴趣的:(#,Hive,大数据,hadoop,hive)