Hive详解以及CentOS下部署Hive和Mysql

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Hive详解以及CentOS下部署Hive和Mysql

前言


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


一、什么是Hive?


20201111101122726.png


根据我们整体的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的架构

2020111110410047.png


20201111104554171.png


> 用户接口: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编译过程

20201111110944947.png

Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree

遍历AST Tree,抽象出查询的基本组成单元QueryBlock

遍历QueryBlock,翻译为执行操作树OperatorTree

逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量

遍历OperatorTree,翻译为MapReduce任务

物理层优化器进行MapReduce任务的变换,生成最终的执行计划

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


Hive SQL的编译过程


五、部署Hive以及Mysql


1.查看版本兼容性


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


20201111112422925.png

我的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.templat


修改

# 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}/<username> 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。


20201111194407987.png


配置完之后测试一下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;


配置完成!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
14天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
78 26
|
22天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
40 5
|
1月前
|
Oracle 关系型数据库 MySQL
Centos7下图形化部署单点KFS同步工具并将Oracle增量同步到KES
Centos7下图形化部署单点KFS同步工具并将Oracle增量同步到KES
Centos7下图形化部署单点KFS同步工具并将Oracle增量同步到KES
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比。通过具体案例,读者可以了解如何准备环境、下载源码、编译安装、配置服务及登录 MySQL。编译源码安装虽然复杂,但提供了更高的定制性和灵活性,适用于需要高度定制的场景。
102 3
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比。
本文介绍了在 CentOS 7 中通过编译源码安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比。内容涵盖准备工作、下载源码、编译安装、配置服务、登录设置及实践心得,帮助读者根据需求选择最适合的安装方法。
91 2
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
144 2
|
2月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置服务等,并与使用 RPM 包安装进行了对比,帮助读者根据需求选择合适的方法。编译源码安装虽然复杂,但提供了更高的定制性和灵活性。
287 2
|
2月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤
【10月更文挑战第7天】本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据自身需求选择合适的方法。
65 3
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
105 0
|
14天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
93 15