Hive产生背景
- MapReduce编程的不便性
- 传统RDBMS人员的需要
HDFS上的文件并没有Schema的概念
Hive是什么
由FaceBook开源,用于解决海量结构化日志的数据统计问题。
构建在Hadoop之上的数据仓库。
Hive提供的SQL查询语言:HQL
底层支持多种不同的执行引擎:MR/Tez/Spark
为什么要使用Hive
容易、简单上手
为超大数据集设计的计算/扩展能力
统一的元数据管理:Hive数据存放在HDFS中,元数据是记录数据的数据。
Hive架构
- Client提交SQL到hive中,表信息(元数据)存放在hive中自带引擎(Derby)。通常情况下我们存放在Mysql中。Derby只能进行但客户端操作,就是所谓的单session,即使在测试环境中,也不推荐使用Derby。我们往往使用Mysql存放元数据信息。而mysql一旦挂掉之后,丢掉元数据信息,虽然数据在HDFS中,但是没有schema信息,数据就无法使用了,因此需要做主备。
- Hive翻译SQL成MapReduce提交到集群中运行,也就是提交到RM中
- 在Hadoop集群中,有很多节点,但是Hive是一个客户端而已,并不涉及到集群的概念,也就是不需要Hive集群就可以。
Hive与RDBMS的区别
虽然HiveSQL 与SQL非常类似,但是他们有本质区别的。虽然他们长得非常相似,但是他们之间没有任何关系
Hive部署
- 下载
hive-1.1.0-cdh5.15.1
- 将
hive-1.1.0-cdh5.15.1
解压到~/app/
目录下 - 添加
$HIVE_HOME
到~/.bashrc
环境变量 - 修改配置
修改配置文件hive-env.sh
,内容如下:HADOOP_HOME=/home/iie4bu/app/hadoop-2.6.0-cdh5.15.1
修改配置文件hive-site.xml
,内容如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://swarm-manager:3306/hadoop_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>123456</value>
</property>
</configuration>
在jdbc:mysql://swarm-manager:3306/hadoop_hive?createDatabaseIfNotExist=true
表示会生成一个hadoop_hive
库
5. 将mysql-connector-java-5.1.35.jar
拷贝到hive-1.1.0-cdh5.15.1/lib
路径下。
6. 前提是要安装一个数据库。
7. 启动hive
:在hive-1.1.0-cdh5.15.1/bin
下执行hive
创建数据库
在hive中创建一个数据库,在mysql中查看数据库:
可以看到生成了一个新的mysql数据库hadoop_hive:
查看其中的DBS
表:
其中第一条数据是默认的一条数据,第二条是我们创建的一条。
查看HDFS中的内容:
创建数据表
hive> create table helloworld(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
导入数据
创建数据文件:
1 zhangsan
2 lisi
3 wangwu
查看导入的数据:
执行MapReduce
统计一下这个helloworld表的数据:
可以看到开始执行一个MapReduce,在YARN中查看,有一个正在运行的MR:
MapReduce运行成功之后:
因此可以直接通过SQL执行MAPREDUCE。