hive的架构
-
用户接口层:命令行客户端最常用的方式
-
元数据库:保存元数据一般情况下会选择关系型数据库
-
thift:用来提供一个跨语言的服务,hive数据仓库。
-
驱动层:
1.驱动器:驱动器驱动整个sql的运行,sql语句解析为mr程序,最终将mr程序提交给hadoop 2.编译器:将sql语句通过hive自带map reduce模板编译成mr程序,首先生成一个逻辑执行计划 3.优化器:在编译过程中肯定会有很多重复的操作在这里进行优化
hive的数据组织格式:
-
数据库database
-
表:
1.内部表管理表 2.外部表 不可能有一个表即使内部表又是外部表 区别:删除表的时候是否删除数据,外部表在删除表的时候不会删除数据,删除的时候只会删除元数据 一般存放公共数据的为外部表 3.分区表:不同于hadoop的分区海量数据查询的时候一定要注意全表扫描 为了提升查询性能这个时候就出现了分区表按照用户的业务存储的不同的目录。人为划分的 4.分桶表:类似于hadoop的分区默认根据hash算法将余数不同的输出到不同的文件中。程序决定的只能指定桶的个数===分区的个数 作用(1)提升join性能(2)提升数据样本的抽取效率
-
视图:view相当于一个sql语句的快捷方式或者别名hive只有逻辑视图不存在物理视图。
物理视图是将sql语句执行的结果存储在视图中 -
数据存储:hive中原始数据存在hdfs上元数据存在关系型数据库中。
#hive安装
version:2.3.5
derby安装简单
./schematool -dbType derby -initSchema初始化数据库
使用derby数据库
启动hive ./hive
优点:搭建简单便于使用
缺点:derby是单用户的模式,切换目录的时候需要重新初始化元数据录,重新初始化会生成两个日志文件。
在当前目录启动会加载当前的目录的元数据,切换不到目录会导致元数据不能共享,如果想要保证元数据一直必须手动copy
在多用户的模式下不适用。
mysql作为元数据的安装
-
yum安装
1.wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm 2.这个rpm还不是mysql的安装文件,只是两个yum源文件,执行后,在/etc/yum.repos.d/ 这个目录下多出 mysql-community-source.repo和mysql-community.reporpm -ivh mysql-community-release-el6-5.noarch.rpm 3.这个时候,可以用yum repolist mysql这个命令查看一下是否已经有mysql可安装文件yum repolist all | grep mysql 4.开始安装mysql:yum install mysql-community-server 5.启动mysql service mysqld start 6.查看状态:service mysqld status 7.进入mysql: mysql -u root 初始化状态下不需要输密码直接回车 8.设置新的密码 use mysql 更新密码:update user set password=PASSWORD("这里输入root用户密码") where User='root'; 9.更新mysql:flush privileges; 10.exit登出重新进去看是否更改了密码
hive的以mysql作为元数据的安装
-
hive下的conf配置 hive-site.xml没有这个文件则直接创建
<property> <name>javax.jdo.option.ConnectionUserName</name>用户名(这4是新添加的,记住删除配置文件原有的哦!) <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name>密码 <value>123456</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name>mysql <value>jdbc:mysql://mysql的ip或者主机名:3306/想要保存hive的元数据的名字?createDatabaseIfNotExist=true(myhive)</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name>mysql驱动程序 <value>com.mysql.jdbc.Driver</value> </property>
-
将mysql的驱动jar包导入到hive下的lib中
-
初始化hive 1.0不需要初始化 hive schema -dbType mysql -initSchema
-
启动hive bin目录下的./hive
-
hive不建议插入数据
-
hive配置自定义目录
<property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> <description>配置自定义目录</description> </property>
-
配置环境变量
vim /etc/profile 末尾配置 以下内容 export HADOOP_HOME=/usr/hadoop/hadoop-2.7.6 export JAVA_HOME=/usr/jdk1.8.0_191 export HIVE_HOME=/usr/hadoop/hive/apache-hive-2.3.5-bin export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin 配置完成之后 source /etc/profile
-
hive体验
建库 create database stu; use stu; 建表: create table student(id int,name string,gender string,age int,deparment string) row format delimited fields terminated by ' ' lines terminated by '\n' ; 查看表信息 desc student 加载数据 load data local inpath '/home/hadoop/student' into table student; 相当于把本地的数据存到hdfs上
元数据信息保存在mysql中
- myhive下的 DBS表 数据库在hdfs上的保存位置
- TBLS 表的描述信息每当在hive上创建一个表就会有一条信息表的类型表的名称和表的创建是时间
- COLUMNS_V2:描述列信息的 在修改元数据的列名hive中的信息系会被更改,在元数据库中改变字段的顺序int到string可以自动转,
string到int类型显示为null;虽然可以修改元数据,但是一定不要修改。
#连接的方式三种
-
client
1.1 必须在hive安装的节点上 ./hive实在启动服务的同时进入客户端1.2hiveserver2的方式:将hive的启动作为一个后台进程,客户机就可以进行连接了,类似于在这里启动了一个hive的服务端。
/bin目录下的hiveserver2启动客户端工具beeline hive客户端的连接工具。
!connect jdbc:hive2://hadoop:10000 hive的连接方式 jdbc:hive2://hadoop:100001.3修改配置文件hadoop的配置文件
hdfs-site.xml 表示启用 webhdfs开启远程连接的服务 <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> core-site.xml 允许所有组的连接和主机 <property> <name>hadoop.proxyuser.hadoop.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hadoop.groups</name> <value>*</value> </property>
nohup 后台启动 后台的日志需要保存下来
- hive的sql语句
- DDL
- 关于库的操作
- create database if not exists 库名;
- drop database if exists 库名; 这两种可以避免报错 只能删除空库
- drop database 库名 cascade;可以删除有表的数据库
- drop database 库名 restrict;默认情况下带有retrict参数
- 查看库的信息:desc database 库名;
- 查找以开头的数据库:show databases like ‘s*’;
- 查看正在用的库 select current_database();
- 修改库:基本不用
-
关于表的操作
Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path] 1).EXTERNAL关键字是否创建外部表不加创建的是内部表 2).IF NOT EXISTS 建表的时候 3).COMMENT table_comment 表的描述信息 4).PARTITIONED BY 指定分区字段 分区字段一定不是建表字段中的某一个是一个全新的字段。 5).CLUSTERED BY 指定分桶字段 SORTED BY 排序字段 分桶字段一定是建表语句中的某一个 字段或多个字段 排序指定的是在同一个分桶内的排序 INTO num_buckets BUCKETS 指定分桶个数 6).ROW FORMAT row_format 指定分隔符 列delimited fields terminated by'';指定列分割符 指定行分隔符 lines terminated by'';指定行分隔符 7).STORED AS file_format指定最终表的存储格式,默认为textfile ,rcfile 行列合并 ,parquet 压缩格式 8).LOCATION hdfs_path 指定hive表的存储路径 hdfs 如果不指定会存在配置的路径下。
- 建表
- 内部表:create table if not exists manage_table(id int,age int) row format delimited fields terminated by’,’;
- 外部表:create external table if not exists external_table(id int,age int,name string) row format delimited fields terminated by’,’;
- 分区表:create table if not exists ptn_table(id int,age int)partitioned by(city string) row format delimited fields terminated by’,’; 不同的目录分区表在添加数据之前先添加分区
alter table ptn_table add partition(city=‘beijing’);
alter table ptn_table add partition(city=‘wuhan’); - 分桶表:create table buk_table(id int,age int,name string) clustered by (id) sorted by (age desc) into 4 buckets row format delimited fields terminated by’,’;
类似hadoop的分区概念相当于指定map发出的key默认分区按照hash分区 - 复制表:like关键字 create table copy_table01 like external_table;复制表的信息是否为外部表与你创建时是否加external有关,复制只能复制表结构复制不了表的数据
- 查询表:
- 查询表信息:
- desc extended manage_table;显示表详细信息
- desc formatted manage_table;格式化显示表的详细信息
- 建表