目录

前言

一、什么是Hive?

二、为什么要使用Hive

三、Hive的架构

四、Hive sql编译过程

五、部署Hive以及Mysql

1.查看版本兼容性

2.安装Hive

3.安装MYSQL

4.Hive和mysql连接

 

总结



前言

本人大三大数据专业,配置的虚拟机为Centos6.7系统,hadoop版本为2.6.0版本,先前已经完成搭建CentOS部署HbaseCentOS6.7搭建Zookeeper编写MapReduce前置插件Hadoop-Eclipse-Plugin 安装。在此基础上进行Hive下的部署以及mysql的一个连接,完成Hive的应用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是Hive?

根据我们整体的Hadoop的架构来看,Hive是建立在hadoop整体运行机制上作为数据仓库的存在。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。

二、为什么要使用Hive

如果直接越过Hive操作hadoop的话有以下不便之处

  • 人员学习成本太高
  • 项目周期要求太短
  • MapReduce实现复杂查询逻辑开发难度太大

而当我们直接使用Hive的话有以下方便之处

  • 操作接口采用类SQL语法,提供快速开发的能力。
  • 避免了去写MapReduce,减少开发人员的学习成本。
  • 支持了绝大多数的语句如DDL、DML以及常见的聚合函数、连接查询、条件查询。
  • 为数据操作提供了良好的伸缩性和可扩展性。
  • 统一的元数据管理,可与impala/spark等共享元数据。

但是Hive的话也有以下缺点

  • Hive不适合用于联机(online)事务处理,也不提供实时查询功能。(它最适合应用在基于大量不可变数据的批处理作业。)
  • Hive 并不能够在大规模数据集上实现低延迟快速的查询。(例如,hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。)
  • Hive 并不适合那些需要高实时性的应用。(例如,联机事务处理(OLTP)。)

Hive的特点是:

1.可扩展

Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。

2.延展性

Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

3.容错

良好的容错性,节点出现问题SQL仍可完成执行。

4.输入格式的松散耦合。

三、Hive的架构

> 用户接口:Client

 CLI(hive shell)、JDBC/ODBC(java访问hive),WEBUI(web访问hive)

> Hive服务器

Hive应用可以以JDBC、ODBC和Thirft(基于socket通讯)接口访问指定地址和端口的Hive服务器。

> 元数据:Metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的 derby数据库中,推荐使用采用MySQL存储Metastore;

>Hadoop

使用HDFS进行存储,使用MapReduce进行计算。

> 驱动器: Driver

  • 负责处理Hive语句,完成编译、 优化和执行的工作。
  •  生成相应的MapReduce任务与 HDFS节点进行数据交互。

包含:解析器、编译器、优化器、执行器;

解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第二方工具库完成,比如antlr;对AST进行方法分析,比如表是否存在、字段是否存在、SQL语义是否有误(比如select中被判定为聚合的字段在group by 中是否有出现);

编译器:将AST编译成逻辑执行计划;

优化器:对逻辑执行计划进行优化;

执行器:把逻辑执行计划转换成可以运行的物理计划。对Hive来说,就是MR/TEZ/Spark;

四、Hive sql编译过程

 

  1. Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
  2. 遍历AST Tree,抽象出查询的基本组成单元QueryBlock
  3. 遍历QueryBlock,翻译为执行操作树OperatorTree
  4. 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
  5. 遍历OperatorTree,翻译为MapReduce任务
  6. 物理层优化器进行MapReduce任务的变换,生成最终的执行计划

这里推荐美团技术博客,里面写的相当详细了:

Hive SQL的编译过程

五、部署Hive以及Mysql

1.查看版本兼容性

先查看一下自己的Hadoop版本能否兼容其他版本的Hive:

我的hadoop版本为2.6.0版本,我选择Hive的版本是2.3.7的版本:

2.安装Hive

1.获取安装包

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-2.3.7/apache-hive-2.3.7-bin.tar.gz

2.解压缩

tar zxvf apache-hive-2.3.7-bin.tar.gz

mv apache-hive-2.3.7-bin hive-2.3.7

mv hive-2.3.7 /usr/local/

3.添加运行路径

vi /etc/profile.d/hive.sh

export HIVE_HOME=/usr/local/hive-2.3.7
export PATH=$PATH:$HIVE_HOME/bin

hive.sh需要自己创建

执行生效:

source /etc/profile.d/hive.sh

4.查看hive是否能启动

hive

Logging initialized using configuration in jar:file:/usr/local/hive-2.3.7/lib/hive-common-2.3.7.jar!/hive-log4j.properties
hive> quit;

3.安装MYSQL

查看一下本机MYsql版本:

rpm -qa |grep mysql

mysql-libs-5.1.73-5.el6_6.x86_64

 yum list |grep mysql

mysql.x86_64                           5.1.73-8.el6_8              @base        
mysql-libs.x86_64                      5.1.73-8.el6_8              @base        
mysql-server.x86_64                    5.1.73-8.el6_8              @base        
mysql57-community-release.noarch       el7-8                       installed    
apr-util-mysql.x86_64                  1.3.9-3.el6_0.1             base         
bacula-director-mysql.x86_64           5.0.0-13.el6                base         
bacula-storage-mysql.x86_64            5.0.0-13.el6                base         
dovecot-mysql.x86_64                   1:2.0.9-22.el6_10.1         updates      
freeradius-mysql.x86_64                2.2.6-7.el6_9               base         
libdbi-dbd-mysql.x86_64                0.8.3-5.1.el6               base         
mod_auth_mysql.x86_64                  1:3.0.0-11.el6_0.1          base         
mysql-bench.x86_64                     5.1.73-8.el6_8              base         
mysql-community-release.noarch         el7-5                       mysql-connectors-community
mysql-connector-c++.x86_64             8.0.22-1.el7                mysql-connectors-community
mysql-connector-c++-debuginfo.x86_64   8.0.22-1.el7                mysql-connectors-community
mysql-connector-c++-devel.x86_64       8.0.22-1.el7                mysql-connectors-community
mysql-connector-c++-jdbc.x86_64        8.0.22-1.el7                mysql-connectors-community
mysql-connector-java.noarch            1:8.0.22-1.el7              mysql-connectors-community
mysql-connector-odbc.x86_64            8.0.22-1.el7                mysql-connectors-community
mysql-connector-odbc-debuginfo.x86_64  8.0.22-1.el7                mysql-connectors-community
mysql-connector-odbc-setup.x86_64      8.0.22-1.el7                mysql-connectors-community
mysql-connector-python.noarch          2.0.4-1.el7                 mysql-connectors-community
mysql-connector-python.x86_64          8.0.22-1.el7                mysql-connectors-community
mysql-connector-python-cext.x86_64     8.0.21-1.el7                mysql-connectors-community
mysql-connector-python-debuginfo.x86_64
                                       2.1.7-1.el7                 mysql-connectors-community
mysql-connector-python3.x86_64         8.0.22-1.el7                mysql-connectors-community
mysql-connector-python3-cext.x86_64    8.0.21-1.el7                mysql-connectors-community
mysql-devel.i686                       5.1.73-8.el6_8              base         
mysql-devel.x86_64                     5.1.73-8.el6_8              base         
mysql-embedded.i686                    5.1.73-8.el6_8              base         
mysql-embedded.x86_64                  5.1.73-8.el6_8              base         
mysql-embedded-devel.i686              5.1.73-8.el6_8              base         
mysql-embedded-devel.x86_64            5.1.73-8.el6_8              base         
mysql-libs.i686                        5.1.73-8.el6_8              base         
mysql-router.x86_64                    8.0.12-1.el7                mysql-tools-community
mysql-router-community.x86_64          8.0.22-1.el7                mysql-tools-community
mysql-router-debuginfo.x86_64          8.0.12-1.el7                mysql-tools-community
mysql-shell.x86_64                     8.0.22-1.el7                mysql-tools-community
mysql-shell-debuginfo.x86_64           8.0.22-1.el7                mysql-tools-community
mysql-test.x86_64                      5.1.73-8.el6_8              base         
mysql-utilities.noarch                 1.6.5-1.el7                 mysql-tools-community
mysql-utilities-extra.noarch           1.5.6-1.el7                 mysql-tools-community
mysql-workbench-community.x86_64       8.0.22-1.el7                mysql-tools-community
mysql-workbench-community-debuginfo.x86_64
                                       8.0.22-1.el7                mysql-tools-community
pcp-pmda-mysql.x86_64                  3.10.9-9.el6                base         
php-mysql.x86_64                       5.3.3-50.el6_10             updates      
qt-mysql.i686                          1:4.6.2-28.el6_5            base         
qt-mysql.x86_64                        1:4.6.2-28.el6_5            base         
rsyslog-mysql.x86_64                   5.8.10-12.el6               base         
rsyslog7-mysql.x86_64                  7.4.10-7.el6                base    

yum install mysql-server.x86_64

rpm -qa |grep -i mysql

mysql-5.1.73-7.el6.x86_64
mysql-libs-5.1.73-7.el6.x86_64
mysql-server-5.1.73-7.el6.x86_64
perl-DBD-MySQL-4.013-3.el6.x86_64

这里直接使用hadoop自带的mysql就好了,一般测试够用了。

4.Hive和mysql连接

将MySQL的JDBC驱动文件mysql-connector-java-5.1.40-bin.jar复制到Hive的依赖库中,也可自行下载。

 wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.40.tar.gz

解压:

tar zxvf mysql-connector-java-5.1.40.tar.gz

cp mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /usr/local/hive-2.3.7/lib/

设置Mysql:

先启动mysql:

/etc/init.d/mysqld start

以root的身份进入mysql,不需要密码直接enter进入:

mysql -u root -p

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.73 Source distribution

创建一个hiveDB的账户:

mysql> create database hiveDB;

修改root密码,将root的密码也设置为root,当然你也可以自己设定一个密码格式为update user set password=password('密码') where user='用户名';:

mysql> use mysql;
mysql> update user set password=password('root') where user='root';

刷新系统权限表

mysql> FLUSH PRIVILEGES;
mysql> quit;

重新登录mysql

mysql -u root –p

root用户下授权root用户于hivedb数据库于登陆身份为root主机:

mysql> grant all privileges on hiveDB.* to 'root'@'%' identified by 'root';
mysql> flush privileges;
mysql> quit;

配置Hive:

vi /usr/local/hive-2.3.7/conf/hive-env.sh.template

修改

# HADOOP_HOME=${bin}/../../hadoop

HADOOP_HOME=/usr/lib/hadoop

mv /usr/local/hive-2.3.7/conf/hive-env.sh.template /usr/local/hive-2.3.7/conf/hive-env.sh

hdfs dfs -ls /

查看hdfs目录下是否存在hive存储的目录,没有的话创建

hdfs dfs -mkdir /tmp/hive

hdfs dfs -mkdir /user/hive

hdfs dfs -mkdir /user/hive/warehouse

文件hive-site.xml内保存Hive运行时所需要的相关配置信息,没有就建一个。

vi /usr/local/hive-2.3.7/conf/hive-site.xml

在里面添加

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration>
  <!-- Hive Execution Parameters -->
  <property>
    <name>hive.exec.scratchdir</name>
    <value>/tmp/hive</value>
    <description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/&lt;username&gt; is created, with ${hive.scratch.dir.permission}.</description>
  </property>
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>hdfs://hadoop1:9000/hive/warehouse</value>
    <description>location of default database for the warehouse</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>
  <property>
    <name>javax.jdo.option.Multithreaded</name>
    <value>true</value>
    <description>Set this to true if multiple threads access metastore through JDO concurrently.</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop1:3306/hiveDB?createDatabaseIfNotExist=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>
</configuration>

  • 属性hive.exec.scratchdir:执行Hive操作访问HDFS时用于存储临时数据的目录,默认为/tmp/目录,通常设置为/tmp/hive/。
  • 属性hive.metastore.warehouse.dir:执行Hive数据仓库操作的数据存储目录,设置为HDFS存储路径hdfs://master_hostname:port/hive/warehouse,这里设为hdfs://hadoop1:9000/hive/warehouse。
  • 属性javax.jdo.option.ConnectionDriverName:设置Hive连接MySQL的驱动名称,属性值为com.mysql.jdbc.Driver。
  • 属性javax.jdo.option.ConnectionUserName:Hive连接存储metastore内容的数据库的用户名。
  • 属性javax.jdo.option.ConnectionPassword:Hive连接存储metastore内容的数据库的密码。
  • 属性javax.jdo.option.Multithreaded:是否允许Hive与MySQL之间存在多条连接,设置为true,表示允许。
  • 属性javax.jdo.option.ConnectionURL:设置Hive通过JDBC模式连接MySQL数据库存储metastore内容,属性值为jdbc:mysql://host/database_name?createDatabaseIfNotExist=true,这里设为jdbc:mysql://hadoop1:3306/hiveDB?createDatabaseIfNotExist=true。

 配置完之后测试一下hive是否可用:

hive

Logging initialized using configuration in jar:file:/usr/local/hive-2.3.7/lib/hive-common-2.3.7.jar!/hive-log4j.properties
hive> SHOW TABLES;

hive> SHOW TABLES;
OK
Time taken: 1.637 seconds
hive> quit;

配置完成!

 


总结

配置hive出现问题解决方法我将会在下一篇博客记录~祝君安装顺利。

参阅:

https://blog.csdn.net/tototuzuoquan/article/details/73003730

http://www.mamicode.com/info-detail-2443908.html

https://baike.baidu.com/item/hive/67986?fr=aladdin#reference-[3]-10164173-wrap

https://www.cnblogs.com/atomicbomb/p/9904829.html

https://tech.meituan.com/2014/02/12/hive-sql-to-mapreduce.html

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐