Hive的基本架构工作原理及其安装简介
Posted 大数据技术官
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive的基本架构工作原理及其安装简介相关的知识,希望对你有一定的参考价值。
Hive 是基于 Hadoop 来构建一套数据仓库分析系统的工具,它突破了传统数据仓库的概念,提供了丰富的 SQL 查询方法来分析存储在 hadoop 分布式文件系统中的数据, 可以将结构化的数据文件映射为一张表,并提供完整的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务来运行,通过自己的SQL 去查询分析需要的内容,这套 SQL 简称Hive SQL或HiveQL。
一、理解Hive 架构
Hive 架构可以分为四部分。
图1 Hive整体架构图
用户接口
Hive 对外提供了三种服务模式,即 Hive 命令行模式(CLI),Hive 的 Web 模式(WUI),Hive 的远程服务(Client)。下面介绍这些服务的用法。
1、 Hive 命令行模式
Hive 命令行模式启动有两种方式。执行这条命令的前提是要配置 Hive 的环境变量。
1) 进入 /home/hadoop/app/hive 目录,执行如下命令。
./hive
2) 直接执行命令。
hive - -service cli
Hive 命令行模式用于 Linux 平台命令行查询,查询语句基本跟 mysql 查询语句类似,运行结果如下所示。
[hadoop@xiyunxinxi hive]$ hive
hive> show tables; OK
a
b
Time taken: 1.088 seconds, Fetched: 3 row(s)
hive> select * from a; OK
Time taken: 0.934 seconds
hive> exit;
[hadoop@sjc hive]$
2、Hive Web 模式
Hive Web 界面的启动命令如下。
hive - -service hwi
通过浏览器访问 Hive,默认端口为 9999。
异常:16/05/31 20:24:52 FATAL hwi.HWIServer: HWI WAR file not found at /home/hadoop/app/hive/home/hadoop/app/hive/lib/hive-hwi-0.12.0.war
解决办法:将hive-default.xml 文件中关于hwi的配置文件拷贝到hive-site.xml文件中 示例:
<property>
<name>hive.hwi.war.file</name>
<value>lib/hive-hwi-0.12.0-SNAPSHOT.war</value> <description>This sets the path to the HWI war file, relative to ${HIVE_HOME}. </description>
</property>
<property>
<name>hive.hwi.listen.host</name>
<value>0.0.0.0</value>
<description>This is the host address the Hive Web Interface will listen on</description>
</property>
<property>
<name>hive.hwi.listen.port</name>
<value>9999</value>
<description>This is the port the Hive Web Interface will listen on</description>
</property>
3、 Hive 的远程服务
远程服务(默认端口号 10000)启动方式命令如下,“nohup…&” 是 linux 命令,表示命令在后台运行。
nohup hive - -service hiveserver2 & //在Hive 0.11.0版本之后,提供了HiveServer2服务
Hive 远程服务通过 JDBC 等访问来连接 Hive ,这是程序员最需要的方式。
hive --service hiveserver2 & //默认端口10000hive --service hiveserver2 --hiveconf hive.server2.thrift.port 10002 & //可以通过命令行直接将端口号改为10002
hive的远程服务端口号也可以在hive-default.xml文件中配置,修改hive.server2.thrift.port对应的值即可。
< property>
< name>hive.server2.thrift.port< /name>
< value>10000< /value>
< description>Port number of HiveServer2 Thrift interface when hive.server2.transport.mode is 'binary'.< /description>
< /property>
元数据存储
Hive 将元数据存储在 RDBMS 中,一般常用 MySQL 和 Derby。默认情况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用, 为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持,配置一个独立的元数据库需要增加以下步骤。
1) 安装 mysql 数据库。
准备工作 ,需要根据你的linux 系统版本下载对应的MySQL rpm 包。
rpm -qa | grep mysql//查看当前系统是否已经安装了mysql rpm -e mysql-libs-5.1.66-2.el6_3.i686 --nodeps//如果已经安装则删除,否则滤过此步骤 rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rpm rpm -ivh MySQL-client-5.1.73-1.glibc23.i386.rpm
2) 启动 mysql 服务。
[root@xiyunxinxi app]# service mysqld startInitializing MySQL database: Installing MySQL system tables... OK Filling help tables... OKTo start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system
3) 设置 mysql 的 root 密码。
MySQL在刚刚被安装的时候,它的 root 用户是没有被设置密码的。首先来设置 MySQL 的 root 密码。
[root@xiyunxinxi app]# mysql -u root -p Enter password: //默认密码为空,输入后回车即可Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. mysql>set password for root@localhost=password('root'); 密码设置为root
4) 为 Hive 建立相应的 Mysql 账户,并赋予足够的权限。
mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
备注:查看host 和user 之间的关系——在mysql 库中的user 表
use mysql;//使用数据库select host,user from user;
如果 hive 账户无法登陆。为hive@ywendeng 设置密码。
[root@xiyunxinxi ~]#mysql -u root -p rootmysql>set password for hive@localhost=password('hive');
5) 建立 Hive 专用的元数据库,记得用刚才创建的 “hive” 账号登录,命令如下。
[root@xiyunxinxi ~]#mysql -u hive -p //用hive用户登录,密码hiveEnter password:
mysql> create database hive; //创建数据库的名称为hiveQuery OK, 1 row affected (0.00 sec)
6) 找到Hive安装目录 conf/下的 hive-site.xml文件,修改以下几个属性。
[hadoop@xiyunxinxi conf]$ vi hive-site.xml
< 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.ConnectionURL< /name>
< value>jdbc:mysql://localhost:3306/hive?characterEncoding=UTF-8< /value>
< description>JDBC connect string for a JDBC metastore< /description>< /property>< property>
< name>javax.jdo.option.ConnectionUserName< /name>
< value>hive< /value>
< description>Username to use against metastore database< /description>
< /property>< property>
< name>javax.jdo.option.ConnectionPassword< /name>
< value>hive< /value>
< description>password to use against metastore database< /description>
< /property>
如果conf/目录下没有 hive-site.xml文件,则需要拷贝一个名为hive-site.xml的文件。
[hadoop@xiyunxinxi conf]$ cp hive-default.xml.template hive-site.xml
7)将mysql-connector-Java-5.1.21.jar驱动包,拷贝到 $HIVE_HOME/lib 目录下。可点击下载 mysql驱动包
[hadoop@xiyunxinxi lib]#rz //回车,选择已经下载好的mysql驱动包即可[hadoop@xiyunxinxi lib]$ ls mysql-connector-java-5.1.21.jar
8) 启动 Hive Shell,测试运行。
[hadoop@xiyunxinxi hive]$ hive hive> show databases;
hive切换到mysql元数据库之后,hive启动时如果遇到以下错误:
Exception in thread "main"java.lang.RuntimeException: java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
解决方案:
在hive 安装目录下,创建一个临时的IO文件iotmp
[hadoop@xiyunxinxi hive]$ mkdir iotmp
[hadoop@xiyunxinxi hive]$ ls bin
然后将路径配置到hive-site.xml文件的参数中
保存,重启hive即可。
[hadoop@xiyunxinxi hive]$ hive
hive> show databases; OK default Time taken: 3.684 seconds, Fetched: 1 row(s)
hive>
解释器、编译器、优化器。
Driver 调用解释器(Compiler)处理 HiveQL 字串,这些字串可能是一条 DDL、DML或查询语句。编译器将字符串转化为策略(plan)。策略仅由元数据操作 和 HDFS 操作组成,元数据操作只包含 DDL 语句,HDFS 操作只包含 LOAD 语句。对插入和查询而言,策略由 MapReduce 任务中的具有方向的非循环图(directedacyclic graph,DAG)组成,具体流程如下。
1)解析器(parser):将查询字符串转化为解析树表达式。
2)语义分析器(semantic analyzer):将解析树表达式转换为基于块(block-based)的内部查询表达式,将输入表的模式(schema)信息从 metastore 中进行恢复。用这些信息验证列名, 展开 SELECT * 以及类型检查(固定类型转换也包含在此检查中)。
3)逻辑策略生成器(logical plan generator):将内部查询表达式转换为逻辑策略,这些策略由逻辑操作树组成。
4)优化器(optimizer):通过逻辑策略构造多途径并以不同方式重写。优化器的功能如下。
将多 multiple join 合并为一个 multi-way join;
对join、group-by 和自定义的 map-reduce 操作重新进行划分;
消减不必要的列;
在表扫描操作中推行使用断言(predicate);
对于已分区的表,消减不必要的分区;
在抽样(sampling)查询中,消减不必要的桶。
此外,优化器还能增加局部聚合操作用于处理大分组聚合(grouped aggregations)和 增加再分区操作用于处理不对称(skew)的分组聚合。
二、Hive 工作原理
Hive 工作原理如下图所示。
图2 Hive工作原理图
MapReduce 开发人员可以把自己写的 Mapper 和 Reducer 作为插件支持 Hive 做更复杂的数据分析。 它与关系型数据库的 SQL 略有不同,但支持了绝大多数的语句(如 DDL、DML)以及常见的聚合函数、连接查询、条件查询等操作。
Hive 不适合用于联机(online) 事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive 的特点是可 伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输入格式的松散耦合。Hive 的入口是DRIVER ,执行的 SQL 语句首先提交到 DRIVER 驱动,然后调用 COMPILER 解释驱动, 最终解释成 MapReduce 任务执行,最后将结果返回。
三、Hive安装步骤
Hive 安装依赖 Hadoop 的集群,它是运行在 Hadoop 的基础上。 所以在安装 Hive 之前,保证 Hadoop 集群能够成功运行。Hive的安装详细流程如下所示。
1、 下载Hive
2、把Hive安装包apache-hive-1.0.0-bin.tar.gz移动到/home/hadoop/app/目录下并解压,然后将文件名称改为 hive。
[hadoop@ywendeng app]$ tar -zxvf apache-hive-1.0.0-bin.tar.gz
[hadoop@ywendeng app]$ mv apache-hive-1.0.0-bin hive
3、 添加hive环境变量
在/etc/profile文件中增加如下内容:
[root@xiyunxinxi ~]$ vi /etc/profile HIVE_HOME=/home/hadoop/app/hivePATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HIVE_HOME/bin:$PATHexport HIVE_HOME
保存退出后,通过source命令使配置文件生效
[root@xiyunxinxi ~]$ source /etc/profile
4、 启动 Hive
此时切换用户至 hadoop 用户,在命令行输入“hive”命令进行测试。
[hadoop@ xiyunxinxi ]$ hive
hive>
在启动hive的过程中可能遇到的错误及解决办法:
[错误1] Caused by: java.net.ConnectException: Connection refused
异常原因: hadoop 没有启动
解决办法:在hadoop 安装目录下启动hadoop: 使用命令 sbin/start-all.sh
[错误2] [ERROR] Terminal initialization failed; falling back to unsupportedjava.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
异常解决办法: 将hive下的新版本jline的JAR包拷贝到hadoop下:cp /hive/apache-hive-1.2.1-bin/lib/jline-2.12.jar /cloud/hadoop-2.4.1/share/hadoop/yarn/lib
1) 测试 Hive 是否安装成功。
hive> show tables; OK
Time taken: 0.043 seconds
2) 创建表。
hive> create table test_table (id int ,name string,no int); OK
Time taken: 0.5 seconds
3) 查询表。
hive> select * from test_table; OK
Time taken: 0.953 seconds
如果创建表和查询表操作没有出错,就说明 Hive 安装成功。
----------------------------------------------------------------------------------------
以上是关于Hive的基本架构工作原理及其安装简介的主要内容,如果未能解决你的问题,请参考以下文章