Hive超详细安装

一、Hive相关知识

    Hive是基于Hadoop的数据仓库工具,可以用来对HDFS中存储的数据进行查询和分析。Hive能够将HDFS上结构化的数据文件映射为数据库表,并提供SQL查询功能,将SQL语句转变成MapReduce任务来执行。Hive通过简单的SQL语句实现快速调用MapReduce机制进行数据统计分析,因此不必专门开发MapReduce应用程序即可实现大数据分析。

    Hive对存储在HDFS中的数据进行分析和管理,它可以将结构化的数据文件映射为一张数据库表,通过SQL查询分析需要的内容,查询Hive使用的SQL语句简称Hive SQL(HQL)。Hive的运行机制使不熟悉MapReduce的用户也能很方便地利用SQL语言对数据进行查询、汇总、分析。同时,Hive也允许熟悉MapReduce开发者们开发自定义的Mappers和Reducers来处理内建的Mappers和Reducers无法完成的复杂的分析工作。Hive还允许用户编写自己定义的函数UDF,用来在查询中使用。

二、Hive的优缺点

优点:

        1.简单容易上手 提供了类SQL的查询语言HQL。

        2.热扩容 不需要重启服务Hive即可自由的扩展集群计算节点的规模。

        3.延展性强  Hive支持用户自定义函数,用户可以根据自己的需求来编写功能函数,在Hive中实现调用,扩展Hive的计算能力。

        4.可扩展强 为超大数据集设计了计算/扩展能力(MR作为计算引擎,HDFS作为存储系统)。

        5.元数据管理 提供统一的元数据管理。

        6.容错行强  Hive具有良好的容错性,某个或某几个计算节点出现故障时,Hive仍可利用其它正常的计算节点完成计算任务执行。

缺点:

        1.Hive的HQL表达能力有限,更适用于完成基础的数据分析任务。

        2.Hive的效率比较低。

        3.Hive调优比较困难,可优化程度不高。

        4.Hive计算过程可控性差。

 三、Hive组件架构

  1.Hive与Hadoop的关系

        Hive构建在Hadoop之上,HQL中对查询语句的解释、优化、生成查询计划是由Hive完成的。Hive读取的所有数据都是存储在Hadoop文件系统中。Hive查询计划被转化为MapReduce任务,在Hadoop中执行。

2.Hive与数据库的异同

     由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。MapReduce开发人员可以把自己写的Mapper和Reducer作为插件支持Hive做更复杂的数据分析。它与关系型数据库的SQL略有不同,但支持了绝大多数的语句(如DDL、DML)以及常见的聚合函数、连接查询、条件查询等操作。

    Hive不适合用于联机(online)事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive的特点是可伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输入格式的松散耦合。Hive的入口是DRIVER,执行的SQL语句首先提交到DRIVER驱动,然后调用COMPILER解释驱动,最终解释成MapReduce任务执行,最后将结果返回。

四、Hive的安装

1.Hive的基础环境和安装准备

    Hive组件需要基于Hadoop系统进行安装。因此,在安装Hive组件前,需要确保Hadoop系统能够正常运行。本章节内容是基于之前已部署完毕的Hadoop全分布系统,在master节点上实现Hive组件安装。

    Hive组件的部署规划和软件包路径如下:

(1)当前环境中已安装Hadoop全分布系统。

(2)本地安装MySQL数据库(账号root,密码Password123$),

软件包在/opt/software/mysql-5.7.18路径下。

(3)MySQL端口号(3306)。

(4)MySQL的JDBC驱动包/opt/software/mysql-connector-java-5.1.47.jar,

在此基础上更新Hive元数据存储。

(5)Hive软件包/opt/software/apache-hive-2.0.0-bin.tar.gz。  

2.解压安装文件

(1)使用root用户,将Hive安装包

/opt/software/apache-hive-2.0.0-bin.tar.gz路解压到/usr/local/src路径下。

[root@master ~]# tar -zxvf /opt/software/apache-hive-2.0.0-bin.tar.gz -C /usr/local/src

(2)将解压后的apache-hive-2.0.0-bin文件夹更名为hive;

[root@master ~]# mv /usr/local/src/apache-hive-2.0.0-bin usr/local/src/hive

(3)修改hive目录归属用户和用户组为hadoop

[root@master ~]# chown -R hadoop:hadoop /usr/local/src/hive

3.安装MySQL数据库

(1)将Linux系统中/opt/sofeware/mysql-5.7.18.rar包移动到home目录下并下载到windows系统中 

[root@master ~]# mv /opt/sofeware/mysql-5.7.18.rar ~/

(2)解压Windows中的mysql-5.7.18.rar

(3)将这5个rpm文件上传到Linux系统中

(4)将文件移动到/opt/sofeware/mysql-5.7.18/目录下

[root@master ~]# mkdir /opt/sofeware/mysql-5.7.18/

[root@master ~]# mv ~/*.rpm /opt/software/mysql-5.7.18/

(5)按如下顺序依次按照MySQL数据库的mysql common、mysql libs、mysql client软件包。

[root@master ~]# cd /opt/software/mysql-5.7.18/  # MySQL软件包路径

[root@master ~]# rpm -ivh mysql-community-common-5.7.18-1.el7.x86_64.rpm

[root@master ~]# rpm -ivh mysql-community-libs-5.7.18-1.el7.x86_64.rpm

[root@master ~]# rpm -ivh mysql-community-client-5.7.18-1.el7.x86_64.rpm

(6)安装mysql server软件的两个依赖软件包。

[root@master ~]# yum install -y net-tools

[root@master ~]# yum install -y perl

(7)将以下配置信息添加到/etc/my.cnf文件symbolic-links=0配置信息的下方。

default-storage-engine=innodb

innodb_file_per_table

collation-server=utf8_general_ci

init-connect='SET NAMES utf8'

character-set-server=utf8

(8)启动MySQL数据库

[root@master ~]# systemctl start mysqld

(9)查询MySQL数据库状态。

mysqld进程状态为active (running),则表示MySQL数据库正常运行。

如果mysqld进程状态为failed,则表示MySQL数据库启动异常。此时需要排查/etc/my.cnf文件。

[root@master ~]# systemctl status mysqld

● mysqld.service - MySQL Server

   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)

   Active: active (running) since 一 2020-05-11 16:28:27 CST; 1h 26min ago

     Docs: man:mysqld(8)

           http://dev.mysql.com/doc/refman/en/using-systemd.html

  Process: 941 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)

  Process: 911 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)

 Main PID: 944 (mysqld)

   CGroup: /system.slice/mysqld.service

           └─944 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

(10)查询MySQL数据库默认密码。

MySQL数据库安装后的默认密码保存在/var/log/mysqld.log文件中,在该文件中以password关键字搜索默认密码。

[root@master ~]# cat /var/log/mysqld.log | grep password

2020-05-07T02:34:03.336724Z 1 [Note] A temporary password is generated for root@localhost: MPg5lhk4?>Ui  #默认密码为MPg5lhk4?>Ui

MySQL数据库是安装后随机生成的,所以每次安装后生成的默认密码不相同。

(11)MySQL数据库初始化。

执行mysql_secure_installation命令初始化MySQL数据库,初始化过程中需要设定数据库root用户登录密码,密码需符合安全规则,包括大小写字符、数字和特殊符号,可设定密码为Password123$。

在进行MySQL数据库初始化过程中会出现以下交互确认信息:

1)Change the password for root ? ((Press y|Y for Yes, any other key for No)表示是否更改root用户密码,在键盘输入y和回车。

2)Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No)表示是否使用设定的密码继续,在键盘输入y和回车。

3)Remove anonymous users? (Press y|Y for Yes, any other key for No)表示是否删除匿名用户,在键盘输入y和回车。

4)Disallow root login remotely? (Press y|Y for Yes, any other key for No)表示是否拒绝root用户远程登录,在键盘输入n和回车,表示允许root用户远程登录。

5)Remove test database and access to it? (Press y|Y for Yes, any other key for No)表示是否删除测试数据库,在键盘输入y和回车。

6)Reload privilege tables now? (Press y|Y for Yes, any other key for No) 表示是否重新加载授权表,在键盘输入y和回车。

(12) 添加root用户从本地和远程访问MySQL数据库表单的授权。

mysql> grant all privileges on *.* to root@'localhost' identified by 'Password123$';  # 添加root用户本地访问授权

Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> grant all privileges on *.* to root@'%' identified by 'Password123$';  # 添加root用户远程访问授权

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;  # 刷新授权

Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user where user='root';  # 查询root用户授权情况

+------+-----------+

| user | host      |

+------+-----------+

| root | %         |

| root | localhost |

+------+-----------+

2 rows in set (0.00 sec)

mysql> exit;  # 退出MySQL数据库

Bye

4.配置Hive组件

(1)设置Hive环境变量并使其生效。

[root@master ~]# vi /etc/profile  # 在文件末尾追加以下配置内容

# set hive environment

export HIVE_HOME=/usr/local/src/hive

export PATH=$PATH:$HIVE_HOME/bin

source /etc/profile  # 使环境变量配置生效

(2)修改Hive组件配置文件。

切换到hadoop用户执行以下对Hive组件的配置操作。

将/usr/local/src/hive文件夹下hive-default.xml.template文件,更名为hive-site.xml。

[root@master ~]# su - hadoop

[hadoop@master ~]$ cp /usr/local/src/hive/conf/hive-default.xml.template /usr/local/src/hive/conf/hive-site.xml

(3)通过vi编辑器修改hive-site.xml文件实现Hive连接MySQL数据库,并设定Hive临时文件存储路径。

[hadoop@master ~]$ vi /usr/local/src/hive/conf/hive-site.xml

1)设置MySQL数据库连接。

javax.jdo.option.ConnectionURL

jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false

JDBC connect string for a JDBC metastore

2)配置MySQL数据库root的密码。

javax.jdo.option.ConnectionPassword

Password123$

password to use against metastore database

3)验证元数据存储版本一致性。若默认false,则不用修改。

hive.metastore.schema.verification

false

  Enforce metastore schema version consistency.

True: Verify that version information stored in is compatible with one from Hive jars.  Also disable automatic

  False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.

4)配置数据库驱动。

javax.jdo.option.ConnectionDriverName

com.mysql.jdbc.Driver

Driver class name for a JDBC metastore

5)配置数据库用户名javax.jdo.option.ConnectionUserName为root。

javax.jdo.option.ConnectionUserName

root

Username to use against metastore database

5.初始化Hive元数据

(1)将MySQL数据库驱动文件/opt/software/mysql-connector-java-5.1.47.jar

拷贝到Hive安装目录的/usr/local/src/hive/lib目录下。

[hadoop@master ~]$ exit  # 返回到root用户登录状态

[root@master ~]# cp ~/mysql-connector-java-5.1.47.jar /usr/local/src/hive/lib

[root@master ~]# chown -R hadoop:hadoop /usr/local/src/hive/lib/mysql-connector-java-5.1.47.jar

[root@master ~]# su - hadoop  # 再次切换到hadoop用户

(2)删除/usr/local/src/hadoop/share/hadoop/yarn/lib/jline-0.9.94.jar

文件,若未删除该文件会导致Hive元数据初始化失败。

[hadoop@master ~]$ rm -f /usr/local/src/hadoop/share/hadoop/yarn/lib/jline-0.9.94.jar

(3)启动Hadoop相关进程。

[hadoop@master ~]$ start-all.sh

(4)分布在master、slave1、slave2三个节点执行JPS命令检查Hadoop进程运行是否正常。需要关注进程ID号每次启动会发生变化。

master:

[hadoop@master ~]$ jps  # master节点

1152 NameNode

1472 ResourceManager

1330 SecondaryNameNode

2025 Jps

slave1:

[root@slave1 ~]# su - hadoop  # slave1节点

[hadoop@slave1 ~]$ jps

1173 NodeManager

1322 Jps

1069 DataNode

slave2:

[root@slave2 ~]# su - hadoop  # slave2节点

[hadoop@slave2 ~]$ jps

1076 DataNode

1317 Jps

1180 NodeManager

(4)初始化Hive元数据。

使用schematool升级元数据,将Hive的元数据重新写入MySQL数据库中。

[hadoop@master ~]$ schematool -initSchema -dbType mysql

Metastore connection URL:        jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false

Metastore Connection Driver :    com.mysql.jdbc.Driver

Metastore connection User:       root

Starting metastore schema initialization to 2.0.0

Initialization script hive-schema-2.0.0.mysql.sql

Initialization script completed

schemaTool completed

以上命令结果显示schemaTool completed,则表示Hive元数据写入MySQL数据库成功

若执行schematool -initSchema -dbType mysql显示schemaTool failed报错,很可能是

[hadoop@master ~]$ schematool -initSchema -dbType mysql

Metastore connection URL:        jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false

Metastore Connection Driver :    com.mysql.jdbc.Driver

Metastore connection User:       root

Starting metastore schema initialization to 2.0.0

Initialization script hive-schema-2.0.0.mysql.sql

Error: Duplicate key name 'PCS_STATS_IDX' (state=42000,code=1061)

org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !!

*** schemaTool failed ***

解决方法:可以删除MySQL中的hive数据库后,重新执行schematool -initSchema -dbType mysql处理。

6.启动Hive

(1)在系统的任意目录下,执行hive命令即可启动Hive组件。

[hadoop@master ~]$ hive

Logging initialized using configuration in jar:file:/usr/local/src/hive/lib/hive-common-2.0.0.jar!/hive-log4j.properties

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/usr/local/src/hive/lib/hive-jdbc-2.0.0-standalone.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.slf4j.impl.Log4jLoggerFactory]

hive>

(2)执行exit命令退出Hive命令行状态。

hive> exit;

[hadoop@master ~]$