本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan 。该系列课程是应邀实验楼整理编写的,这里需要赞一下实验楼提供了学习的新方式,可以边看博客边上机实验,课程地址为 https://www.shiyanlou.com/courses/237
【注】该系列所使用到安装包、测试数据和代码均可在百度网盘下载,具体地址为 http://pan.baidu.com/s/10PnDs ,下载该 PDF 文件
部署节点操作系统为 CentOS ,防火墙和 SElinux 禁用,创建了一个 shiyanlou 用户并在系统根目录下创建 /app 目录,用于存放 Hadoop 等组件运行包。因为该目录用于安装 hadoop 等组件程序,用户对 shiyanlou 必须赋予 rwx 权限(一般做法是 root 用户在根目录下创建 /app 目录,并修改该目录拥有者为 shiyanlou(chown – R shiyanlou:shiyanlou /app )。
Hadoop 搭建环境:
l 虚拟机操作系统: CentOS6.6 64 位,单核, 1G 内存
l JDK : 1.7.0_55 64 位
l Hadoop : 1.1.2
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 开发者的开发自定义的 Mapper 和 Reducer 来处理内建的 Mapper 和 Reducer 无法完成的复杂的分析工作。
使用 Hive 的命令行接口很像操作关系数据库,但是 Hive 和关系数据库还是有很大的不同, Hive 与关系数据库的区别具体如下:
1. Hive 和关系数据库存储文件的系统不同, Hive 使用的是 Hadoop 的 HDFS ( Hadoop 的分布式文件系统),关系数据库则是服务器本地的文件系统;
2. Hive 使用的计算模型是 Mapreduce ,而关系数据库则是自身的计算模型;
3. 关系数据库都是为实时查询的业务进行设计的,而 Hive 则是为海量数据做数据挖掘设计的,实时性很差;实时性的区别导致 Hive 的应用场景和关系数据库有很大的不同;
4. Hive 很容易扩展自己的存储能力和计算能力,这个是继承 Hadoop 的,而关系数据库在这个方面要比数据库差很多。
由上图可知, Hadoop 的 mapreduce 是 Hive 架构的根基。 Hive 架构包括如下组件: CLI ( command line interface )、 JDBC/ODBC 、 Thrift Server 、 WEB GUI 、 metastore 和 Driver(Complier 、 Optimizer 和 Executor) ,这些组件分为两大类:服务端组件和客户端组件。
l Driver 组件:该组件包括 Complier 、 Optimizer 和 Executor ,它的作用是将 HiveQL (类 SQL )语句进行解析、编译优化,生成执行计划,然后调用底层的 mapreduce 计算框架;
l Metastore 组件:元数据服务组件,这个组件存储 Hive 的元数据, Hive 的元数据存储在关系数据库里, Hive 支持的关系数据库有 derby 和 mysql 。元数据对于 Hive 十分重要,因此 Hive 支持把 metastore 服务独立出来,安装到远程的服务器集群里,从而解耦 Hive 服务和 metastore 服务,保证 Hive 运行的健壮性;
l Thrift 服务: thrift 是 facebook 开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发, Hive 集成了该服务,能让不同的编程语言调用 hive 的接口。
l CLI : command line interface ,命令行接口。
l Thrift 客户端:上面的架构图里没有写上 Thrift 客户端,但是 Hive 架构的许多客户端接口是建立在 thrift 客户端之上,包括 JDBC 和 ODBC 接口。
l WEBGUI : Hive 客户端提供了一种通过网页的方式访问 hive 所提供的服务。这个接口对应 Hive 的 hwi 组件( hive web interface ),使用前要启动 hwi 服务。
下载地址: http://dev.mysql.com/downloads/mysql/#downloads ,使用系统为 CentOS 选择 Red Hat Enterprise Linux/Oracle 系列,也可以在 /home/shiyanlou/install-pack 目录中找到这些安装包:
操作系统为 64 位,选择对应安装包进行下载:
下载在本地目录如下图:
使用命令查看是否已经安装过 mysql :
sudo rpm -qa | grep -i mysql
可以看到如下图的所示:
说明之前安装了 mysql ,可以参考 4.1 进行卸载旧的 mysql 。如果以前没有安装 mysql 则进入安装文件的目录,安装 mysql 服务端
cd /home/shiyanlou/install-pack
sudo rpm -ivh MySQL-server-5.6.21-1.el6.x86_64.rpm
出现异常,通过分析缺少 libaio 依赖包,使用如下命令进行安装:
sudo yum install libaio
再次安装 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
通过下面查看 mysql 服务状态:
sudo service mysql status
如果 mysql 没有启动,通过如下命令进行启动:
sudo service mysql start
在 CentOS6.5 操作系统使用如下命令给 mysql 设置 root 密码时,出现如下错误:
/usr/bin/mysqladmin -u root password 'root';
/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
(3) 跳过验证启动 MySQL
验证 mysql 服务已经在后台运行后,执行如下语句,其中后面三条命令是在 mysql 语句:
mysql -u root
mysql>use mysql;
mysql>update user set password = password('root') where user = 'root';
mysql>flush privileges;
(4) 跳过验证启动 MySQL
重启 mysql 服务并查看状态
sudo service mysql restart
sudo service mysql status
进入 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;
(注意:如果是 root 第一次登录数据库,需要重新设置一下密码,所报异常信息如下: ERROR 1820 (HY000): You must SET PASSWORD before executing this statement )
使用 hive 用户登录,创建 hive 数据库:
mysql -uhive -phive -h hadoop
mysql>create database hive;
mysql>show databases;
可以到 Apache 基金 hive 官网 http://hive.apache.org/downloads.html ,选择镜像下载地址: http://mirrors.cnnic.cn/apache/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
到 mysql 官网进入下载页面: http://dev.mysql.com/downloads/connector/j/ ,选择所需要的版本进行下载,这里下载的 zip 格式的文件
也可以在 /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
使用如下命令打开 /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
使配置文件生效:
source /etc/profile
echo $PATH
进入 hive-0.12.0/conf 目录,复制 hive-env.sh.templaete 为 hive-env.sh :
cd /app/hive-0.12.0/conf
cp hive-env.sh.template hive-env.sh
sudo vi hive-env.sh
分别设置 HADOOP_HOME 和 HIVE_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
复制 hive-default.xml.templaete 为 hive-site.xml
cd /app/hive-0.12.0/conf
cp hive-default.xml.template hive-site.xml
sudo vi hive-site.xml
(1) 加入配置项
默认 metastore 在本地,添加配置改为非本地
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
(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>
(3) 订正错误项
在配置文件 2000 行左右配置项 hive.server2.thrift.sasl.qop 原来为 <value>auth</auth> ,按照如下进行修改:
<property>
<name>hive.server2.thrift.sasl.qop</name>
<value>auth</value>
<des.....
</property>
并把 hive.metastore.schema.verification 配置项值修改为 false
<property>
<name>hive.metastore.schema.verification</name>
<value> false </value>
<desc....>
</property>
在使用 hive 之前需要启动 metastore 和 hiveserver 服务,通过如下命令启用:
hive --service metastore &
hive --service hiveserver &
启动用通过 jps 命令可以看到两个进行运行在后台
登录 hive ,在 hive 创建表并查看该表,命令如下:
hive
hive>create table test(a string, b int);
hive>show tables;
hive>desc test;
登录 mysql ,在 TBLS 表中查看新增 test 表:
mysql -uhive -phive
mysql>use hive;
mysql>select TBL_ID, CREATE_TIME, DB_ID, OWNER, TBL_NAME,TBL_TYPE from TBLS;
(1) 查找以前是否安装有 mysql
使用命令查看是否已经安装过 mysql :
sudo rpm -qa | grep -i mysql
可以看到如下图的所示:
说明之前安装了:
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 -ev – nodeps 包名
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
如果存在 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
删除对应的 mysql 目录
sudo rm -rf /usr/lib64/mysql
sudo rm -rf /var/lib/mysql
(4) 再次查找机器是否安装 mysql
sudo rpm -qa | grep -i mysql
无结果,说明已经卸载彻底、接下来直接安装 mysql 即可
启动 hive 时,出现 CommandNeedRetryException 异常,具体信息如下:
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.sh 的 HADOOP_CLASSPATH 配置项,由以前的:
export HADOOP_CLASSPATH=/app/hadoop-1.1.2/myclass
修改为:
export HADOOP_CLASSPATH= $HADOOP_CLASSPATH: /app/hadoop-1.1.2/myclass
启动 hive 后,使用 Hql 出现异常,需要启动 metastore 和 hiveserver
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 之前需要启动 metastore 和 hiveserver 服务,通过如下命令启用:
hive --service metastore &
hive --service hiveserver &
启动用通过 jps 命令可以看到两个进行运行在后台