[TOC]
# hive架构图
![](https://box.kancloud.cn/79a9999a934979efb10989111c30a3a8_364x473.png)
## 基本组成
* 用户接口:包括 CLI、JDBC/ODBC、WebGUI。
* 元数据存储:通常是存储在关系数据库如 mysql , derby中。
* 解释器、编译器、优化器、执行器。
## 各组件的基本功能
* 用户接口主要由三个:CLI、JDBC/ODBC和WebGUI。其中,CLI为shell命令行;JDBC/ODBC是Hive的JAVA实现,与传统数据库JDBC类似;WebGUI是通过浏览器访问Hive。
* 元数据存储:Hive 将元数据存储在数据库中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
* 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。
## Hive与Hadoop的关系
Hive利用HDFS存储数据,利用MapReduce查询分析数据
![](https://box.kancloud.cn/2c4b73f04643d1bcbccced7a117c1797_669x271.png)
## Hive与传统数据库对比
hive用于海量数据的离线数据分析
![](https://box.kancloud.cn/fefcc393e5acbd03628d7b8990ff3cd1_515x350.png)
总结:hive具有关系型数据库的查询分析功能,但应用场景完全不同,hive只适合用来做批量数据统计分析,数据量大、对应的延迟较高!
## Hive的数据存储
1. Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)
SequenceFile是hadoop中的一种文件格式:
文件内容是以序列化的kv对象来组织的
2. 只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据
3. Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。
* db:在hdfs中表现为`${hive.metastore.warehouse.dir}`目录下一个文件夹
* table:在hdfs中表现所属db目录下一个文件夹
* external table:与table类似,不过其数据存放位置可以在任意指定路径
* partition:在hdfs中表现为table目录下的子目录
* bucket:在hdfs中表现为同一个表目录下根据hash散列之后的多个文件
# 安装
## derby版:
1. 解压hive
2. 解决一下版本不兼容问题:替换 `hadoop/share/hadoop/yarn/lib`中的老版本jline 为hive的lib中的jline-2.12.jar
![](https://box.kancloud.cn/531d52fd91d46e284c36593a79c8b4b9_1910x450.png)
使用方式
Hive交互shell
~~~
bin/hive
~~~
一些交互命令
~~~
hive> create database db1;
OK
Time taken: 0.258 seconds
hive> create database db2;
OK
Time taken: 0.063 seconds
hive> show databases;
OK
db1
db2
default
Time taken: 0.008 seconds, Fetched: 3 row(s)
hive>
~~~
这边创建了一些库,这些库在哪里?
在你执行启动hive命令下面有个`metastore_db`这个文件夹
不同的用户在不同的目录下启动,都会在不同的目录下创建`metastore_db`这个文件夹
这就是把元数据放在derby中
这样就不便于我们的管理
缺点:多个地方安装hive后,每一个hive是拥有一套自己的元数据,大家的库、表就不统一;
## 元数据库mysql版:
1. 解压
2. 修改配置文件
3. 加载mysql数据驱动包
在hive的conf文件夹下
~~~
vim hive-site.xml
~~~
配置数据库信息
~~~
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.33.10:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
</configuration>
~~~
然后配置环境变量
~~~
mv hive-env.sh.template hive-env.sh
vim hive-env.sh
~~~
把里面的`HADOOP_HOME`配置为你自己的hadoop路径,然后把注释放开
然后把之前derby版的`metastore_db`这个文件夹,删除了
在lib目录下上传个mysql驱动的jar包
然后就可以操作了
试着插入些库,表还有数据
然后插入成功就看下网页版的
![](https://box.kancloud.cn/09826e1d6dc7f7559a1fd07cb7eeb7fe_2232x364.png)
这边会看到创建的库
## Hive JDBC服务
![](https://box.kancloud.cn/eacf697c37b4dc18aa93170368f74f5f_727x303.png)
hive也可以启动为一个服务器,来对外提供
启动方式,(假如是在h01上):
启动为前台(启动成功会占用100000端口):
~~~
bin/hiveserver2
~~~
启动为后台:
~~~
nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err &
~~~
启动成功后,可以在别的节点上用beeline去连接
* 方式(1)
hive/bin/beeline 回车,进入beeline的命令界面
输入命令连接hiveserver2
~~~
[root@master bin]# beeline
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://127.0.0.1:10000
Connecting to jdbc:hive2://127.0.0.1:10000
Enter username for jdbc:hive2://127.0.0.1:10000: root
Enter password for jdbc:hive2://127.0.0.1:10000:
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://127.0.0.1:10000>
~~~
用户名是root,密码直接回车
然后那边hiveserver2是显示ok
上面ip端口是127.0.0.1:10000
* 方式(2)
或者启动就连接:
~~~
bin/beeline -u jdbc:hive2://127.0.0.1:10000 -n root
~~~
接下来就可以做正常sql查询了
- linux
- 常用命令
- 高级文本命令
- 面试题
- redis
- String
- list
- hash
- set
- sortedSet
- 案例-推荐
- java高级特性
- 多线程
- 实现线程的三种方式
- 同步关键词
- 读写锁
- 锁的相关概念
- 多线程的join
- 有三个线程T1 T2 T3,保证顺序执行
- java五种线程池
- 守护线程与普通线程
- ThreadLocal
- BlockingQueue消息队列
- JMS
- 反射
- volatile
- jvm
- IO
- nio
- netty
- netty简介
- 案例一发送字符串
- 案例二发送对象
- 轻量级RPC开发
- 简介
- spring(IOC/AOP)
- spring初始化顺序
- 通过ApplicationContextAware加载Spring上下文
- InitializingBean的作用
- 结论
- 自定义注解
- zk在框架中的应用
- hadoop
- 简介
- hadoop集群搭建
- hadoop单机安装
- HDFS简介
- hdfs基本操作
- hdfs环境搭建
- 常见问题汇总
- hdfs客户端操作
- mapreduce工作机制
- 案列-单词统计
- 局部聚合Combiner
- 案列-流量统计(分区,排序,比较)
- 案列-倒排索引
- 案例-共同好友
- 案列-join算法实现
- 案例-求topN(分组)
- 自定义inputFormat
- 自定义outputFormat
- 框架运算全流程
- mapreduce的优化方案
- HA机制
- Hive
- 安装
- DDL操作
- 创建表
- 修改表
- DML操作
- Load
- insert
- select
- join操作
- 严格模式
- 数据类型
- shell参数
- 函数
- 内置运算符
- 内置函数
- 自定义函数
- Transform实现
- 特殊分割符处理
- 案例
- 级联求和accumulate
- flume
- 简介
- 安装
- 常用的组件
- 拦截器
- 案例
- 采集目录到HDFS
- 采集文件到HDFS
- 多个agent串联
- 日志采集和汇总
- 自定义拦截器
- 高可用配置
- 使用注意
- sqoop
- 安装
- 数据导入
- 导入数据到HDFS
- 导入关系表到HIVE
- 导入表数据子集
- 增量导入
- 数据导出
- 作业
- 原理
- azkaban
- 简介
- 安装
- 案例
- 简介
- command类型单一job
- command类型多job工作流flow
- HDFS操作任务
- mapreduce任务
- hive脚本任务
- hbase
- 简介
- 安装
- 命令行
- 基本CURD
- 过滤器查询
- 系统架构
- 物理存储
- 寻址机制
- 读写过程
- Region管理
- master工作机制
- 建表高级属性
- 与mapreduce结合
- 协处理器
- 点击流平台开发
- 简介
- storm
- 简介
- 安装
- 集群启动及任务过程分析
- 单词统计
- 并行度
- ACK容错机制
- ACK简介