======================================================================Hive=================================================================================================
1.数据库存储业务数据,而数据仓库存储的是历史数据!
数据仓库的设计是反范式的,保证数据的完整性,数据库是根据范式设计的;
数据仓库主要是面向数据分析,数据挖掘用的!而数据库是面向我们编程的业务的!
2.HIve运行时,元数据存储在关系型数据库里面(性能高),放在HDFS上就不是很合适了,HIve默认自带的一个In-Memory的Derby数据库!
3.HUE:图形化工具!
4.Hive这一块北风网讲解的不错!
5.Hive运行的三种方式:(根据:元数据存储位置和元数据管理来划分的)
1).local模式(本地模式):利用Hive自带的Derby数据库!--------自己开发测试的时候用!
2).单用户模式:通过网络连接到一个数据库中,但是这种模式:同一个时间只能允许同一个用户访问,即不能同时访问!------》测试的时候用!
3).远程服务器模式(多用户模式):利用MetaStoreServer(单独的一台服务器来跑,用来管理元数据信息,但是元数据信息是存储在mysql数据库中的)--------》项目上线的时候用!
单用户模式与远程服务服务器模式的区别:MetaStoreServer和Hive Client 客户端 都在同一台机器上!
注:远程服务器模式。用于非Java客户端访问元数据库,在服务器端启动MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer访问元数据库
Hive在工作中一般不会再专门找一台服务器去做,一般会在当前Hadoop集群的机器上(HDFS+YARN)工作!
要先启动Hadoop集群(尤其是HDFS集群),然后再启动Hive,因为Hive的数据是存在HDFS中,当HDFS还处于安全模式的时候,有可能启动Hive也会失败,所以最好先启动HDFS一会儿之后再启动Hive,当然也可以强行退出安全模式,最好不这样整(HDFS在安全模式下会对元数据整理)!
6.在单用户模式和远程服务器模式的时候:Hive运行时,元数据存储在关系型数据库里面
7.Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
8.Hive的架构
(1)用户接口主要有三个:CLI,Client 和WUI。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。WUI是通过浏览器访问Hive。
(2)Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
(3)解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
(4)Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)。
9.企业中很少对hive做高可用,因为它的数据是保存在HDFS上的,不会丢失,而元数据是保存在mysql数据库中的也不会丢失,如果hive挂了,再启动一个Hive就好或者再搭建一个HIve就好!
10.Hive的数据类型
1) primitive_type
–| array_type
–| map_type
–| struct_type
2) primitive_type
–|TINYINT
–| SMALLINT
–| INT
–| BIGINT
–| BOOLEAN
–| FLOAT
–| DOUBLE
–| STRING
11.hive sql分析结构化的文本文件数据的时候,就可以用row_format来指定分隔符!
具体由:fields terminated by来指定:通过拆分将文本文件对应到数据仓库中的表中!
collection items指定集合的每一项是怎么分割的;
Map keys terminated by指定map键值对之间是怎么分割的!
lines terminated by指定行与行之间的分割符,默认就是换行符!
file_format:对应文件在HDFS上存储的格式:stored as 默认是TextFile格式的!
当然可以压缩:减少数据占用的空间,但压缩和加压缩都需要时间,同时带来CPU上的消耗!
12.load data local(local用来表示你存储的数据是在本地还是HDFS上!)
13.可以用location指定数据存在HDFS上的位置!
14.external外部表与内部表的区别:内部表删除数据后,HDFS上的数据和内存中的元数据也丢失了,外部表数据删除之后,HDFS上的数据是不会丢失的,外部表只是删除了元数据!
15.创建表的几种方式:
1.create table db01(age int,name string)
2.create table db02... as select * from db03;(这种情况做了两件事:1.根据db03的字段创建db02; 2.将db03中的数据放入到db02中)--------》一般用在创建中间表的时候!
3.create table db02 like db03(这种方式:只是将db03的表结构给db02)!
11.在实际生产中用load命令向表中加载数据,而不是insert命令,执行效率太慢!
12.hive对类SQL进行了优化,有一部分数据是经过优化的,不需要转化为MapReduce,有一部分是需要转化为MapReduce的!
13.配置项: hive.metastore.warehouse 代表数据在HDFS上(不是本地哦,因为Hive中的数据是存储在HDFS上) 的数据存储目录!
14.在Hive中数据类型没有varchar,有String!
==================================Hive配置===================================================
第一种: 注:这里把 hive 的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开,
9.METADATA和客户端的管理在一起的时候的配置!
yum install mysql-server!不要写成mysql哦,这仅仅是客户端(node01上)!
service mysqld start!
输入mysql进入mysql命令行:
grant all privileges on *.* TO 'root'@'%' identified by '123' with grant option;
删除多余会对权限造成影响的数据delete from user where Host !=‘%’
flush privileges;(刷新权限)
select host ,user from user
将数据库表中的user中的数据其余数据都删掉(否则权限验证有冲突),有的需要验证,有的不需要验证!
10.hive安装到node02:
配置环境变量Hive的
source /etc/profile
hive的配置文件夹下:
改为:hive-site.xml
并设置里面的内容!
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.255.11/hive_remote?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<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>123</value>
</property>
导入mysql的jar包到hive的lib包下!
hadoop的驱动包在hadoop的安装目录的share/hadoop/目录下!
将hive的lib包中的jline包替换Hadoop的share/hadoop/yarn/lib目录下的jline包(jar包版本不一致!),删掉Hadoop下的share/hadoop/yarn/lib目录下jline的jar包!
=========================================第二种Hive安装================================================= ====================
第二种:多用户安装的时候(metaServer与hive客户端是分开的时候):
多用户安装:
node01安装mysql
安装hive
配置环境变量并source /etc/profile
node03:安装metaserver(服务端配置);将连接mysql的驱动包jar包加入到hive下的lib包下!
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.255.11:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<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>123</value>
</property>
</configuration>
node04:安装 hive客户端
配置node04的conf文件夹下的配置文件:
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.255.13:9083</value>
</property>
</configuration>
安装hive mv hive-default... hive-site.xml
配置环境变量 并 source /etc/profile
将hive的lib包中的jline包替换Hadoop的share/hadoop/yarn/lib目录下的jline包(jar包版本不一致!),删掉Hadoop下的share/hadoop/yarn/lib目录下jline的jar包!
在node03启动 hive 服务端程序
hive --service metastore(也可以在命令下加&字符,后台运行) ---metaServer默认启动的端口号是:9083
在node04客户端直接使用 hive 命令即可
启动的时候先启动metaServer,再启动hive,需要用hive客户端连接metaServer服务器!
客户端启动的时候要注意:
[ERROR] Terminal initialization failed; falling back to unsupported
java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
at jline.TerminalFactory.create(TerminalFactory.java:101)
错误的原因: Hadoop jline 版本和 hive 的 jline 不一致
==================================================HIVE中的HQL练习==============================================================