1、认识Hive
1.1hive认识
Hive是建立在Hadoop上的数据仓库工具,可以借助提取、转化、加载技术存储、查询和分析查询在Hadoop中的大规模数据。使得开发人员使用相对简单的SQL语句,就可以操作Hadoop 处理海量数据。
对外提供HQL,在查询时HQL语句转换为MapReduce任务,在Hadoop层执行。
1.1.1 优点
- 提供了易于操作的类SQL查询语言HQL,不用再去写复杂的MapReduce程序,减少开发成本,上手快。
- 利用MapRecuce计算引擎,HDFS作为存储系统,可以操作大数据集。
- 支持用户的自定义函数,具有良好的容错性。
1.1.1 缺点
- 延迟性比较高,因为启动MapReduce本身需要消耗很多资源
- HQL语言表达能力有限,基于模板实现的,不够智能,处理复杂的业务能力有限,如迭代计算无法是实现
- 不提供实时查询,处理大数据量擅长,处理小数据量没有优势
1.2hive架构
1.3 为什么用Hive而不用关系型数据库?
对比项 | Hive | RDBMS |
---|---|---|
查询语言 | HQL | SQL |
数据存储 | HDFS | 块设备或本地文件系统 |
执行 | MapReduce | Executor |
执行延迟 | 较高 | 较低 |
处理数据规模 | 较高 | 较低 |
可扩展性 | 较高 | 较低 |
数据更新 | 读多写少,不建议改写 | 经常修改 |
2、hive安装
实验环境:
三台机器,/etc/hosts文件中的机器名分别配置为
hadoop102,hadoop103,hadoop104(集群都是通过机器名来配置的, 只要网络没问题, IP不重要)。上面已经安装了hadoop集群和spark集群。另外,在hadoop102上安装了mysql数据库。
2.1安装及配置环境
1) 从官网下载hive安装包,上传到linux目录下
$ tar -zxvf /opt/software/apache-hive-3.1.2-bin.tar.gz -C /opt/module/
2) 修改/etc/profile.d/my_env.sh,添加环境变量
$ sudo vim /etc/profile.d/my_env.sh
3) 添加内容
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
使环境变量生效
$ source /etc/profile
4)解决日志 Jar 包冲突,有多个log4j的日志jar包冲突,可以选择删除(可选操作)
$ mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak
5)初始化元数据库
$ bin/schematool -dbType derby -initSchema
2.2hive启动并使用
启动Hive之前一定要注意Hadoop的hdfs和yarn,必须是启动的
1) 启动
[xuyuan@hadoop102 hive]$ bin/hive
2)使用,对数据库的基本操作
hive> show databases;
hive> show tables;
hive> create table test(id int);
hive> insert into test values(1);
hive> select * from test;
hive使用的derby作为元数据库,开启hive之后就会占用元数据库,并且不能与其他客户端共享
2.2.1使用mysql作为hive的元数据
实验环境已经在hadoop102机器上安装好了mysql
首先需要获取mysql的jdbc驱动包mysql-connector-java-8.0.23.jar(与mysql版
本对应),放到hive的lib目录下。 hive默认是不带jdbc驱动包的。
1 )进入$HIVE_HOME/conf目录,新建一个配置文件hive-site.xml。添加以下内容:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- jdbc 连接的 URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop102:3306/metastoreuseSSL=false</value>
</property>
<!-- jdbc 连接的 Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-