免费视频教程 https://www.51doit.com/ 或者联系博主微信 17710299606
本节内容
- 什么是hive
- hive的基本执行原理
- hive安装启动
- hive连接方式
1 什么是hive
简介
hive是基于Hadoop的一个数据仓库工具,并不是一个数据库,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。hive是十分适合数据仓库的统计分析和Windows注册表文件。
hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,hive 并不能够在大规模数据集上实现低延迟快速的查询,例如,hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。
因此,hive 并不适合那些需要高实性的应用,例如,联机事务处理(OLTP)。hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,hive 将用户的hiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。hive 并非为联机事务处理而设计,hive 并不提供实时的查询和基于行级的数据更新操作。hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
特点
优点
- 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
- 避免了去写MapReduce,减少开发人员的学习成本。
- Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。(历史数据)
- Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
- Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
缺点
1.Hive的HQL表达能力有限
(1)迭代式算法无法表达 递归算法
(2)数据挖掘方面不擅长(数据挖掘和算法 机器学习 硕士以上)
2.Hive的效率比较低
(1)Hive自动生成的MapReduce作业,通常情况下不够智能化
(2)Hive调优比较困难,粒度较粗(快)
应用场景
对时效性要求不高的数据分析 , 报表分析等
2 hive的基本执行原理
可以在hive中建表
表:有表名, 表字段 ,字段数据类型, 表管理的数据的位置(HDFS上的结构化数据)
元数据: 记录表结构的数据 存储在mysql中
表的映射数据: 表的映射数据存储在HDFS中
执行SELECT * FROM TB_NAME 的大致流程是
1 加载元数据信息 ,获取表结构
2 元数据中获取表映射数据在HDFS中的位置
3 将SQL语句交给SQL解析引擎
4 Hive 将 HQL 转换成一组操作符(Operator),比如 GroupByOperator, JoinOperator 等
5 操作符 Operator 是 Hive 的最小处理单元
6 每个操作符代表一个 HDFS 操作或者 MapReduce 作业
7 Hive 通过 ExecMapper 和 ExecReducer 执行 MapReduce 程序,执行模式有本地模式和分 布式两种模式
8 编译器进行编译
(1)Parser:将 HQL 语句转换成抽象语法树(AST:Abstract Syntax Tree)
(2)Semantic Analyzer:将抽象语法树转换成查询块
(3)Logic Plan Generator:将查询块转换成逻辑查询计划
(4)Logic Optimizer:重写逻辑查询计划,优化逻辑执行计划
(5)Physical Plan Gernerator:将逻辑计划转化成物理计划(MapReduce Jobs)
(6)Physical Optimizer:选择最佳的 Join 策略,优化物理执行计划
9 优化器进行优化HQL语句
10 执行
简单一句话 , 将HQL语句转换成MR程序分布式调度执行
3 hive安装启动
3.1 准备工作
- hive默认存储元数据的数据库是Derby,我们将元数据存储在mysql中所以要有mysql的服务
- hive处理的海量数据存储在HDFS 中所以需要HDF环境
- hive底层转换成MR程序分布式运行所以有YARN环境
3.1.1 MYSQL
1.安装mysql
2 查看mysql是否运行
netstat -nltp | grep 3306tcp 0 0 0.0.0.0:3306
3 service mysqld start 启动mysql服务
4 可以配置mysql的开机自启服务 chkconfig mysqld on
5 开启远程连接权限
mysql > grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
mysql > flush privileges;
授权完成后,测试一下是否成功:在windows上用Navicat连接一下看是否能成功!
3.1.2 HADOOP
start-dfs.sh , start-yarn.sh或者是start-all.sh 启动HDFS和Yarn
[root@linux01 ~]# jps
45792 DataNode
46050 ResourceManager
53012 HMaster
54724 Jps
45654 NameNode
46153 NodeManager
53145 HRegionServer
5834 QuorumPeerMain
3.2 上传安装包解压
- 将hive安装包上传到linux操作系统
- tar - zxf 压缩包 -C 指定解压位置
- mv apache-hive-2.3.1-bin hive-2.3.1 改个名字
3.3 配置
- 进入到hive的conf文件夹中
[root@linux01 conf]# pwd
/opt/apps/hive-2.3.1/conf
1) cp hive-env.sh.template hive-env.sh
注意路径
vi hive-env.sh
export HADOOP_HOME=/opt/apps/hadoop-2.8.5/
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/opt/apps/hive-2.3.1/conf/
2) vi hive-site.xml
<configuration>
<!-- 记录HIve中的元数据信息 记录在mysql中 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://linux01:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- mysql的用户名和密码 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property><property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property><property>
<name>hive.exec.scratchdir</name>
<value>/user/hive/tmp</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/user/hive/log</value>
</property>
<!-- 客户端远程连接的端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>hive.server2.webui.host</name>
<value>0.0.0.0</value>
</property>
<!-- hive服务的页面的端口 -->
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>
<property>
<name>hive.server2.long.polling.timeout</name>
<value>5000</value>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>false</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>true</value>
</property><property>
<name>hive.execution.engine</name>
<value>mr</value>
</property>
</configuration>
3) vi /opt/apps/hadoop-2.8.5/etc/hadoop/core-site.xml
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property><property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property><property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
可以配置客户端连接用户名和密码
3.4 上传mysql驱动包
上传一个mysql的驱动包到hive 的lib包下
3.5 初始化
${HIVE_HOME}/bin/schematool -initSchema -dbType mysql
1) 在mysql中多一个hive数据库 记录元数据信息
2) 启动以后在HDFS中的目录中 /user/hive目录
3.6 启动
[root@linux01 hive-2.3.1]# bin/hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apps/hive-2.3.1/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apps/hadoop-2.8.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]Logging initialized using configuration in jar:file:/opt/apps/hive-2.3.1/lib/hive-common-2.3.1.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive>
可以愉快的编写HQL了
show databsaes ;
create database doit15 ;
create table a (id int , name string) ;
show tables ;
3.7 配置环境变量
4 hive连接方式
4.1 本地客户端连接
本地测试默认用于学习和测试使用, 实际生产中一般远程连接方式
[root@linux01 hive-2.3.1]# bin/hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apps/hive-2.3.1/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apps/hadoop-2.8.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]Logging initialized using configuration in jar:file:/opt/apps/hive-2.3.1/lib/hive-common-2.3.1.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive>
4.2 远程连接hiveserver2
前台启动 bin/hiveserver2
[root@linux01 hive-2.3.1]# bin/hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apps/hive-2.3.1/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apps/hadoop-2.8.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]Logging initialized using configuration in jar:file:/opt/apps/hive-2.3.1/lib/hive-common-2.3.1.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive>
后台启动 bin/hiveserver2 &
查看10000 端口是否使用
[root@linux01 ~]# netstat -nltp | grep 10000
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 55020/java
4.2.1 beeline
[root@linux01 ~]# beeline
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apps/hive-2.3.1/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apps/hadoop-2.8.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 2.3.1 by Apache Hive
beeline> !connect jdbc:hive2://linux01:10000
Connecting to jdbc:hive2://linux01:10000
Enter username for jdbc:hive2://linux01:10000: root
Enter password for jdbc:hive2://linux01:10000: 回车
Connected to: Apache Hive (version 2.3.1)
Driver: Hive JDBC (version 2.3.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://linux01:10000>
0: jdbc:hive2://linux01:10000> show databases ;
+----------------+
| database_name |
+----------------+
| db_doit15 |
| db_doit17 |
| default |
+----------------+
可以配置远程连接用户名和密码
<property><name>hive.server2.thrift.client.user</name><value>lenmom</value><description>Username to use against thrift client</description>
</property>
<property><name>hive.server2.thrift.client.password</name><value>123456</value><description>Password to use against thrift client</description></property>
4.2.2 Java
- 创建maven项目
<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.8.5</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.8.5</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc数据库的驱动 连接的是何种数据库--><dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>1.2.1</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hive/hive-metastore --><dependency><groupId>org.apache.hive</groupId><artifactId>hive-metastore</artifactId><version>1.2.1</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hive/hive-metastore --><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.2.1</version></dependency></dependencies>hive开启hiveserver2 服务 ; 开启hive的远程连接的服务
service mysqld start
- JAVA-API
public class App {private static String driverName = "org.apache.hive.jdbc.HiveDriver";public static void main(String[] args) throws SQLException {try {
// 注册驱动Class.forName(driverName);} catch (ClassNotFoundException e) {e.printStackTrace();System.exit(1);}
// 获取连接Connection con = DriverManager.getConnection("jdbc:hive2://doit01:10000/demo", "root", "");
// 获取指定SQL的对象Statement stmt = con.createStatement();String sql = "select * from tb_case";
// 执行sqlResultSet res = stmt.executeQuery(sql);
// 处理结果if (res.next()) {System.out.println(res.getString(1));}}
}