上文介绍了Hadoop2.6.4集群搭建的详细步骤。现在我们在此基础上,搭建Hiveserver。同样,事无巨细,难免跑题。

环境需求列表

  • Hive1.2版本开始,依赖Java1.7+0.14-1.1版本依赖Java1.6+。推荐用Java1.8
  • 推荐使用Hadoop2.x 系列。Hive2.0开始不再支持Hadoop1.x系列。0.13版之前的Hive也仍支持Hadoop0.20.x0.23.x系列。
  • 在生产环境下推荐使用LinuxWindows系统。Mac系统仅推荐在试验环境使用。

下载安装Hive

从镜像列表http://www.apache.org/mirrors 找个速度快的国内镜像。

下载Hive安装包

wget http://mirrors.cnnic.cn/apache/hive/hive-1.2.1/apache-hive-1.2.1-bin.tar.gz

解压到当前用户目录下(我的安装包都下载在用户的download的目录下。)

tar -xzvf apache-hive-1.2.1-bin.tar.gz -C ~/

强迫症,改个和Hadoop统一的名字。

mv apache-hive-1.2.1-bin/ hive-1.2.1

设置环境变量

需要配置HIVE_HOMEHIVE_BIN

vim ~/.bashrc

修改内容如下:

export HIVE_HOME=$HOME/hive-1.2.1
export PATH=$PATH:$HOME/bin:$HIVE_HOME/binsour

立即生效

source ~/.bashrc

Metadata Store MySQL安装

Hive有三种元数据存储的模式。

  • Embedded mode
  • Local mode
  • Remote mode

很多文章里都有介绍,但是很少有人具体解释其区别和原理。OneCoder很不满意,这里找到一篇介绍,至少对我来说,算是能看懂他所介绍的。 Metastore Deployment Modes

这里采用Remote mode。因此我们先要部署MySQL

安装MySQL5.7.12

下载

wget http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-community-server-5.7.12-1.el6.x86_64.rpm

安装

sudo rpm -i mysql-community-server-5.7.12-1.el6.x86_64.rpm

发现缺少依赖

mysql-community-common-5.7.12、mysql-community-client-5.7.12和mysql-community-libs-5.7.12

下载依赖:

wget http://repo.mysql.com/yum/mysql-5.7-community/el/6/x86_64/mysql-community-common-5.7.12-1.el6.x86_64.rpm
wget http://repo.mysql.com/yum/mysql-5.7-community/el/6/x86_64/mysql-community-client-5.7.12-1.el6.x86_64.rpm
wget http://repo.mysql.com/yum/mysql-5.7-community/el/6/x86_64/mysql-community-libs-5.7.12-1.el6.x86_64.rpm

赋予可执行权限

chmod 700 mysql-community-*

安装依赖

sudo rpm -i mysql-community-libs-5.7.12-1.el6.x86_64.rpm
sudo rpm -i mysql-community-common-5.7.12-1.el6.x86_64.rpm
sudo rpm -i mysql-community-client-5.7.12-1.el6.x86_64.rpm

安装MySQL

sudo rpm -i mysql-community-server-5.7.12-1.el6.x86_64.rpm

创建自己的MySQL数据目录,在当前用户的主目录下执行

mkdir -p metastore-mysql/data
mkdir -p metastore-mysql/logs

赋予权限,由于mysql实际是使用mysql用户启动服务。而我们的数据目录改在了dps-hadoop用户的根目录下,所以得从根上,给mysql用户以RX权限

sudo chmod -R 755 /home/dps-hadoop

修改my.cnf配置文件

vim /etc/my.cnf

内容如下

[mysqld]
datadir=/home/dps-hadoop/metastore-mysql/data
socket=/home/dps-hadoop/metastore-mysql/data/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
socket=/home/dps-hadoop/metastore-mysql/data/mysql.sock
log-error=/home/dps-hadoop/mysqllog/mysqld.log
pid-file=/home/dps-hadoop/metastore-mysql/data/mysqld.pid
[mysql]
socket=/home/dps-hadoop/metastore-mysql/data/mysql.sock
[mysqladmin]
socket=/home/dps-hadoop/metastore-mysql/data/mysql.sock
datadir=/home/dps-hadoop/metastore-mysql/data
socket=/home/dps-hadoop/metastore-mysql/data/mysql.sock
log-error=/home/dps-hadoop/mysqllog/mysqld.log

其中log-error对应的路径需要提前创建,而datadir路径会自动创建。

关闭Selinux,否则会因为无法创建数据目录而报错。

setenforce 0

启动mysql

sudo service mysqld start

在启动日志里会发现root用户的临时密码: qkkmgd.Np0?N 登录后修改密码即可。

mysql -u root -p

创建数据库hive

mysql> create database hive;

创建hive用户并授权

mysql> grant all on hive.* to hive@'%'  identified by '密码';

配置Hive

Hiveconf目录下提供了一个配置文件模版hive-default.xml.template供我们修改。而Hive会默认加载hive-site.xml配置文件。因此,拷贝一份。

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

同样,按照了解,我们需要配置metastore的相关信息,如数据库连接,驱动,用户名,密码等。

<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>数据库密码</value>
    <description>password to use against metastore database</description>
  </property>
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false;</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>hive.metastore.uris</name>
    <value>thrift://master:9083</value>
    <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
  </property>

这里,metastore服务的默认端口为9083

还需要配置本地数据仓库路径

<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/home/dps-hadoop/warehouse</value>
    <description>location of default database for the warehouse</description>
  </property>

由于我们需要连接MySQL数据库,而Hive并没有提供相应的驱动,所以需要下载MySQL JDBC驱动,并放在Hivelib目录下。直接进入lib目录执行

wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar

修改log日志文件位置

Hive默认将日志存放在/tmp/${user.name}下。为了方便维护和查看,修改日志文件位置。

cp conf/hive-log4j.properties.template conf/hive-log4j.properties

修改

hive.log.dir=/home/dps-hadoop/logs/hive

启动HiveServer服务

启动MetaStore Service

bin/hive --service metastore &

启动HiveServer

bin/hive --service hiveserver2 &

查看日志一切正常。

验证Hive客户端

bin/hive

发现报错

Exception in thread “main” java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected

这是由于jline的版本冲突,在hadooplib带的版本低。解决办法,修改hive-env.sh

vim conf/hive-env.sh

添加

export HADOOP_USER_CLASSPATH_FIRST=true

即用hive里的高版本覆盖Hadoop里的低版本。

再次启动客户端,一切OK。通过beeline客户端验证也ok。至此Hiveserver2部署完成。