转载

Hadoop入门进阶课程8--Hive介绍和安装部署

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan   。该系列课程是应邀实验楼整理编写的,这里需要赞一下实验楼提供了学习的新方式,可以边看博客边上机实验,课程地址为 https://www.shiyanlou.com/courses/237

【注】该系列所使用到安装包、测试数据和代码均可在百度网盘下载,具体地址为 http://pan.baidu.com/s/10PnDs ,下载该 PDF 文件

1 搭建环境

部署节点操作系统为 CentOS ,防火墙和 SElinux 禁用,创建了一个 shiyanlou 用户并在系统根目录下创建 /app 目录,用于存放 Hadoop 等组件运行包。因为该目录用于安装 hadoop 等组件程序,用户对 shiyanlou 必须赋予 rwx 权限(一般做法是 root 用户在根目录下创建 /app 目录,并修改该目录拥有者为 shiyanlou(chownR shiyanlou:shiyanlou /app )。

Hadoop 搭建环境:

l   虚拟机操作系统: CentOS6.6   64 位,单核, 1G 内存

l   JDK1.7.0_55 64

l   Hadoop1.1.2

2 Hive 介绍

Hive Facebook 开发的构建于 Hadoop 集群之上的数据仓库应用,它提供了类似于 SQL 语法的 HQL 语句作为数据访问接口,这使得普通分析人员的应用 Hadoop 的学习曲线变小, Hive 有如下特性:

l Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并使用 sql 语句转换为 MapReduce 任务进行运行。其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用,十分适合数据仓库的统计分析;

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

2.1   Hive 与关系数据库的区别

使用 Hive 的命令行接口很像操作关系数据库,但是 Hive 和关系数据库还是有很大的不同, Hive 与关系数据库的区别具体如下:

1.   Hive 和关系数据库存储文件的系统不同, Hive 使用的是 HadoopHDFSHadoop 的分布式文件系统),关系数据库则是服务器本地的文件系统;

2.   Hive 使用的计算模型是 Mapreduce ,而关系数据库则是自身的计算模型;

3. 关系数据库都是为实时查询的业务进行设计的,而 Hive 则是为海量数据做数据挖掘设计的,实时性很差;实时性的区别导致 Hive 的应用场景和关系数据库有很大的不同;

4.   Hive 很容易扩展自己的存储能力和计算能力,这个是继承 Hadoop 的,而关系数据库在这个方面要比数据库差很多。

2.2   Hive 架构

Hadoop入门进阶课程8--Hive介绍和安装部署

由上图可知, HadoopmapreduceHive 架构的根基。 Hive 架构包括如下组件: CLIcommand line interface )、 JDBC/ODBCThrift ServerWEB GUImetastoreDriver(ComplierOptimizerExecutor) ,这些组件分为两大类:服务端组件和客户端组件。

服务端组件:

l Driver 组件:该组件包括 ComplierOptimizerExecutor ,它的作用是将 HiveQL (类 SQL )语句进行解析、编译优化,生成执行计划,然后调用底层的 mapreduce 计算框架;

l Metastore 组件:元数据服务组件,这个组件存储 Hive 的元数据, Hive 的元数据存储在关系数据库里, Hive 支持的关系数据库有 derbymysql 。元数据对于 Hive 十分重要,因此 Hive 支持把 metastore 服务独立出来,安装到远程的服务器集群里,从而解耦 Hive 服务和 metastore 服务,保证 Hive 运行的健壮性;

l Thrift 服务: thriftfacebook 开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发, Hive 集成了该服务,能让不同的编程语言调用 hive 的接口。

客户端组件:

l CLI command line interface ,命令行接口。

l Thrift 客户端:上面的架构图里没有写上 Thrift 客户端,但是 Hive 架构的许多客户端接口是建立在 thrift 客户端之上,包括 JDBCODBC 接口。

l WEBGUI Hive 客户端提供了一种通过网页的方式访问 hive 所提供的服务。这个接口对应 Hivehwi 组件( hive web interface ),使用前要启动 hwi 服务。

3 搭建 Hive 环境

3.1   安装 MySql 数据库

3.1.1  下载 mysql 安装文件

下载地址: http://dev.mysql.com/downloads/mysql/#downloads ,使用系统为 CentOS 选择 Red Hat Enterprise Linux/Oracle 系列,也可以在 /home/shiyanlou/install-pack 目录中找到这些安装包:

Hadoop入门进阶课程8--Hive介绍和安装部署

操作系统为 64 位,选择对应安装包进行下载:

Hadoop入门进阶课程8--Hive介绍和安装部署

Hadoop入门进阶课程8--Hive介绍和安装部署

Hadoop入门进阶课程8--Hive介绍和安装部署

下载在本地目录如下图:

Hadoop入门进阶课程8--Hive介绍和安装部署

3.1.2  安装 mysql

使用命令查看是否已经安装过 mysql

sudo rpm -qa | grep -i mysql

可以看到如下图的所示:

Hadoop入门进阶课程8--Hive介绍和安装部署

说明之前安装了 mysql ,可以参考 4.1 进行卸载旧的 mysql 。如果以前没有安装 mysql 则进入安装文件的目录,安装 mysql 服务端

cd /home/shiyanlou/install-pack

sudo rpm -ivh MySQL-server-5.6.21-1.el6.x86_64.rpm

Hadoop入门进阶课程8--Hive介绍和安装部署

出现异常,通过分析缺少 libaio 依赖包,使用如下命令进行安装:

sudo yum install libaio

Hadoop入门进阶课程8--Hive介绍和安装部署

再次安装 mysql ,并安装 mysql 客户端、 mysql-devel

sudo rpm -ivh MySQL-server-5.6.21-1.el6.x86_64.rpm

sudo rpm -ivh MySQL-client-5.6.21-1.el6.x86_64.rpm

sudo rpm -ivh MySQL-devel-5.6.21-1.el6.x86_64.rpm

Hadoop入门进阶课程8--Hive介绍和安装部署

3.1.3  启动 mysql 服务

通过下面查看 mysql 服务状态:

sudo service mysql status

如果 mysql 没有启动,通过如下命令进行启动:

sudo service mysql start

Hadoop入门进阶课程8--Hive介绍和安装部署

3.1.4  设置 root 密码

CentOS6.5 操作系统使用如下命令给 mysql 设置 root 密码时,出现如下错误:

/usr/bin/mysqladmin -u root password 'root';

Hadoop入门进阶课程8--Hive介绍和安装部署

/usr/bin/mysqladmin: connect to server at 'localhost' failed

error: 'Access denied for user 'root'@'localhost' (using password: NO)'

可以进入安全模式进行设置 root 密码

(1)   停止 mysql 服务

使用如下命令停止 mysql 服务:

sudo service mysql stop

sudo service mysql status

(2)   跳过验证启动 mysql

使用如下命令验证启动 mysql ,由于 & 结尾是后台运行进程,运行该命令可以再打开命令窗口或者 Ctr+C 继续进行下步操作:

sudo mysqld_safe --skip-grant-tables &

sudo service mysql status

Hadoop入门进阶课程8--Hive介绍和安装部署

(3)   跳过验证启动 MySQL

验证 mysql 服务已经在后台运行后,执行如下语句,其中后面三条命令是在 mysql 语句:

mysql -u root

mysql>use mysql;

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

mysql>flush privileges;

Hadoop入门进阶课程8--Hive介绍和安装部署

(4)   跳过验证启动 MySQL

重启 mysql 服务并查看状态

sudo service mysql restart

sudo service mysql status

Hadoop入门进阶课程8--Hive介绍和安装部署

3.1.5  设置 Hive 用户

进入 mysql 命令行,创建 hive 用户并赋予所有权限:

mysql -uroot -proot

mysql>set password=password('root');

mysql>create user 'hive' identified by 'hive';

mysql>grant all on *.* TO 'hive'@'%' identified by 'hive' with grant option;

mysql>grant all on *.* TO 'hive'@'localhost' identified by 'hive' with grant option;

mysql>flush privileges;

Hadoop入门进阶课程8--Hive介绍和安装部署

(注意:如果是 root 第一次登录数据库,需要重新设置一下密码,所报异常信息如下: ERROR 1820 (HY000): You must SET PASSWORD before executing this statement

3.1.6  创建 hive 数据库

使用 hive 用户登录,创建 hive 数据库:

mysql -uhive -phive -h hadoop

mysql>create database hive;

mysql>show databases;

Hadoop入门进阶课程8--Hive介绍和安装部署

3.2   安装 Hive

3.2.1  解压并移动 Hive 安装包

可以到 Apache 基金 hive 官网 http://hive.apache.org/downloads.html ,选择镜像下载地址: http://mirrors.cnnic.cn/apache/hive/ 下载一个稳定版本,如下图所示:

Hadoop入门进阶课程8--Hive介绍和安装部署

也可以在 /home/shiyanlou/install-pack 目录中找到该安装包,解压该安装包并把该安装包复制到 /app 目录中

cd /home/shiyanlou/install-pack

tar -xzf hive-0.12.0-bin.tar.gz

mv hive-0.12.0-bin /app/hive-0.12.0

Hadoop入门进阶课程8--Hive介绍和安装部署

3.2.2  解压并移动 MySql 驱动包

mysql 官网进入下载页面: http://dev.mysql.com/downloads/connector/j/ ,选择所需要的版本进行下载,这里下载的 zip 格式的文件

Hadoop入门进阶课程8--Hive介绍和安装部署

也可以在 /home/shiyanlou/install-pack 目录中找到该安装包,解压该安装包并把该安装包复制到 /app/lib 目录中

cd /home/shiyanlou/install-pack

cp mysql-connector-java-5.1.22-bin.jar /app/hive-0.12.0/lib

Hadoop入门进阶课程8--Hive介绍和安装部署

3.2.3  配置 /etc/profile 环境变量

使用如下命令打开 /etc/profile 文件:

sudo vi /etc/profile

设置如下参数:

export HIVE_HOME=/app/hive-0.12.0

export PATH=$PATH:$HIVE_HOME/bin

export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin

Hadoop入门进阶课程8--Hive介绍和安装部署

使配置文件生效:

source /etc/profile

echo $PATH

3.2.4  设置 hive-env.sh 配置文件

进入 hive-0.12.0/conf 目录,复制 hive-env.sh.templaetehive-env.sh

cd /app/hive-0.12.0/conf

cp hive-env.sh.template hive-env.sh

sudo vi hive-env.sh

Hadoop入门进阶课程8--Hive介绍和安装部署

分别设置 HADOOP_HOMEHIVE_CONF_DIR 两个值:

# Set HADOOP_HOME to point to a specific hadoop install directory

export HADOOP_HOME=/app/hadoop-1.1.2

# Hive Configuration Directory can be controlled by:

export HIVE_CONF_DIR=/app/hive-0.12.0/conf

Hadoop入门进阶课程8--Hive介绍和安装部署

3.2.5  设置 hive-site.xml 配置文件

复制 hive-default.xml.templaetehive-site.xml

cd /app/hive-0.12.0/conf

cp hive-default.xml.template hive-site.xml

sudo vi hive-site.xml

Hadoop入门进阶课程8--Hive介绍和安装部署

(1)   加入配置项

默认 metastore 在本地,添加配置改为非本地

<property>

<name>hive.metastore.local</name>

<value>false</value>

</property>

Hadoop入门进阶课程8--Hive介绍和安装部署

(2)   修改配置项

hive 默认为 derby 数据库,需要把相关信息调整为 mysql 数据库

<property>

<name>hive.metastore.uris</name>

  <value> thrift://hadoop:9083 </value>

<description>Thrift URI for the remote metastore. ...</description>

</property>

<property>

<name>javax.jdo.option.ConnectionURL</name>

  <value> jdbc:mysql://hadoop:3306/hive?=createDatabaseIfNotExist=true </value>

<description>JDBC connect string for a JDBC metastore</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> 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>

Hadoop入门进阶课程8--Hive介绍和安装部署

Hadoop入门进阶课程8--Hive介绍和安装部署

(3)   订正错误项

在配置文件 2000 行左右配置项 hive.server2.thrift.sasl.qop 原来为 <value>auth</auth> ,按照如下进行修改:

<property>

<name>hive.server2.thrift.sasl.qop</name>

    <value>auth</value>

<des.....

</property>

Hadoop入门进阶课程8--Hive介绍和安装部署

并把 hive.metastore.schema.verification 配置项值修改为 false

<property>

<name>hive.metastore.schema.verification</name>

  <value> false </value>

<desc....>

</property>

Hadoop入门进阶课程8--Hive介绍和安装部署

3.3   验证部署

3.3.1  启动 metastorehiveserver

在使用 hive 之前需要启动 metastorehiveserver 服务,通过如下命令启用:

hive --service metastore &

hive --service hiveserver &

Hadoop入门进阶课程8--Hive介绍和安装部署

启动用通过 jps 命令可以看到两个进行运行在后台

Hadoop入门进阶课程8--Hive介绍和安装部署

3.3.2  hive 中操作

登录 hive ,在 hive 创建表并查看该表,命令如下:

hive

hive>create table test(a string, b int);

hive>show tables;

hive>desc test;

Hadoop入门进阶课程8--Hive介绍和安装部署

登录 mysql ,在 TBLS 表中查看新增 test 表:

mysql -uhive -phive

mysql>use hive;

mysql>select TBL_ID, CREATE_TIME, DB_ID, OWNER, TBL_NAME,TBL_TYPE from TBLS;

Hadoop入门进阶课程8--Hive介绍和安装部署

4 问题解决

4.1   卸载旧的 mysql

(1)   查找以前是否安装有 mysql

使用命令查看是否已经安装过 mysql

sudo rpm -qa | grep -i mysql

可以看到如下图的所示:

Hadoop入门进阶课程8--Hive介绍和安装部署

说明之前安装了:

MySQL-client-5.6.21-1.el6.x86_64

MySQL-server-5.6.21-1.el6.x86_64

MySQL-devel-5.6.21-1.el6.x86_64

如果没有结果,可以进行跳到 3.1.3 步骤的 mysql 数据库安装

(2)   停止 mysql 服务、删除之前安装的 mysql

停止 mysql 服务、删除之前安装的 mysql 删除命令: rpm -evnodeps 包名

sudo rpm -ev MySQL-server-5.6.21-1.el6.x86_64

sudo rpm -ev MySQL-devel-5.6.21-1.el6.x86_64

sudo rpm -ev MySQL-client-5.6.21-1.el6.x86_64

Hadoop入门进阶课程8--Hive介绍和安装部署

如果存在 CentOS 自带 mysql-libs-5.6.21-1.el6.x86_64 使用下面的命令卸载即可

sudo rpm -ev --nodeps mysql-libs-5.6.21-1.el6.x86_64

(3)   查找之前老版本 mysql 的目录并且删除老版本 mysql 的文件和库

sudo find / -name mysql

Hadoop入门进阶课程8--Hive介绍和安装部署

删除对应的 mysql 目录

sudo rm -rf /usr/lib64/mysql

sudo rm -rf /var/lib/mysql

Hadoop入门进阶课程8--Hive介绍和安装部署

(4)   再次查找机器是否安装 mysql

sudo rpm -qa | grep -i mysql

无结果,说明已经卸载彻底、接下来直接安装 mysql 即可

Hadoop入门进阶课程8--Hive介绍和安装部署

4.2   Hive 启动,报 CommandNeedRetryException 异常

启动 hive 时,出现 CommandNeedRetryException 异常,具体信息如下:

Hadoop入门进阶课程8--Hive介绍和安装部署

Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/hadoop/hive/ql/CommandNeedRetryException

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Class.java:270)

at org.apache.hadoop.util.RunJar.main(RunJar.java:149)

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.ql.CommandNeedRetryException

at java.net.URLClassLoader$1.run(URLClassLoader.java:366)

at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:354)

at java.lang.ClassLoader.loadClass(ClassLoader.java:425)

at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

由于以前使用 hadoop 时,修改 hadoop-env.shHADOOP_CLASSPATH 配置项,由以前的:

export HADOOP_CLASSPATH=/app/hadoop-1.1.2/myclass

修改为:

export HADOOP_CLASSPATH= $HADOOP_CLASSPATH: /app/hadoop-1.1.2/myclass

Hadoop入门进阶课程8--Hive介绍和安装部署

Hadoop入门进阶课程8--Hive介绍和安装部署

4.3   Hive 中使用操作语言

启动 hive 后,使用 Hql 出现异常,需要启动 metastorehiveserver

Hadoop入门进阶课程8--Hive介绍和安装部署

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient

在使用 hive 之前需要启动 metastorehiveserver 服务,通过如下命令启用:

hive --service metastore &

hive --service hiveserver &

Hadoop入门进阶课程8--Hive介绍和安装部署

启动用通过 jps 命令可以看到两个进行运行在后台

Hadoop入门进阶课程8--Hive介绍和安装部署

正文到此结束
Loading...