为什么有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其实就是在hadoop的基础上封装了一个壳,Hive的存储是基于hdfs的,hive的计算是基于MapReduce的
三种模式,hive会自动检查运行环境,如果检测到本机上安装了Hadoop环境,则必须先启动Hadoop
元数据的初始化时,会在当前目录下会生成一个db目录,在启动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’);
使用mysql替换derby进行元数据的存储,hive的相关进程都是在同一台机器上,即本地模式。mysql因为是独立的进程,所以mysql可以和hive在同一机器上,也可以在其他机器上。
通常使用关系型数据库来进行元数据存储(mysql、oracle等执行带jdbc驱动的数据库)
优点:支持多session
缺点:需要配置、还需要安装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
(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-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 &; #信息送入黑洞。
两个服务都要起来
客户端连接: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
执行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;
(3)insert 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
) --表结构和数据时分开的,修改的只是表结构,数据不会发生变化