Hive搭建

hive的运行环境

1、mysql数据库

1) hive支持derby、mssql、mysql、oracle、postgres这几种数据库充当metastore

2)hive默认使用Derby数据库(一个纯用Java实现的内存数据库)用于管理所建的库表等信息,

3)我们使用mysql, 为区别旧的hive,我们需要在原来的mysql实例中创建另来一个库,给予all权限(至少create,write,read)

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> create database new_hive;   
Query OK, 1 row affected (0.00 sec)

mysql> GRANT all on new_hive.* to hadoop@'10.1.1.185' IDENTIFIED BY '***';
Query OK, 0 rows affected (0.02 sec)

2、JAVA环境

3、hadoop集群

4、上官网下载编译好的二进制包

这里我们使用2.1版本,即apache-hive-2.1.0-bin

配置文件

到conf目录下

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

我们只列出关键配置,后面要优化的慢慢补上。

vim hive-site.xml

<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.ConnectionURL</name>
<value>jdbc:mysql://10.1.1.185:3306/new_hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>

<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hadoop</value>
<description>username to use against metastore database</description>
</property>

<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>youppwd</value>
<description>password to use against metastore database</description>
</property>

<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>

  <property>
    <name>hive.exec.scratchdir</name>
    <value>/data/hadoop/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}/&lt;username&gt; is created, with ${hive.scratch.dir
.permission}.</description>
  </property>
  <property>
    <name>hive.exec.local.scratchdir</name>
    <value>/data/hadoop/tmp_hive/tmp/${system:user.name}</value>
    <description>Local scratch space for Hive jobs</description>
  </property>
  <property>
    <name>hive.downloaded.resources.dir</name>
    <value>/data/hadoop/tmp_hive/tmp/${hive.session.id}_resources</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
  </property>

让我们用图来理解快速点:

1、javax.jdo.option.ConnectionDriverName

使用mysql jdbc

2、javax.jdo.option.ConnectionURL

指定jdbc连接串,其中可以指定编码与库引擎

jdbc:mysql://mysql_server_host:3306/hivedb?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=latin1

createDatabaseIfNotExist=true,必带,用于在mysql中的库中生成对应的表结构; 不然,你需要手动source进去

2、javax.jdo.option.ConnectionUserNamejavax.jdo.option.ConnectionPassword

用你创建hive数据库时的账号与密码填充上去即可

3、hive.metastore.warehouse.dir

(HDFS上的)数据目录, 用于记录都有哪些库与库信息,比如

[hdp@namenode ~]$ hadoop fs -ls /user/hive/warehouse
Found 2 items
drwxr-xr-x   - root supergroup          0 2016-03-11 20:29 /user/hive/warehouse/testdb.db
drwxr-xr-x   - hdp  supergroup          0 2016-03-04 11:12 /user/hive/warehouse/logscan.db

这里是直接保存于你所在的hadoop上面的,不同的hadoop集群,可以使用相同配置

另外一点,hive启动时是根据你当前的hadoop环境变量判断所管理的是哪一个hadoop,所以hadoop的环境变量一定要设置对了哦(如果你是使用了相同的路径的话)

这里我们是使用用户hadoop的环境变量

export HADOOP_HOME=/data/hadoop/hadoop-2.7.3
export HBASE_HOME=/data/hadoop/hbase-1.2.4/
export JAVA_HOME=/usr/local/jdk1.7.0_25/
export THRIFT_HOME=/data/hadoop/thrift-0.9.3
export HIVE_HOME=/data/hadoop/apache-hive-2.1.0-bin
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HBASE_HOME/bin:$THRIFT_HOME/bin:$HIVE_HOME/bin

4、hive.exec.scratchdir

(HDFS上的)临时文件目录,默认为/tmp/hive-${user.name}

而我们当前是使用hadoop这个用户,所以目录即为/tmp/hadoop

但是我们不能保证/tmp有足够的空间,所以我们还是自己自定义了路径

启动

在hive根目录下

lang=bash,lines=22,name=start_hive.sh
#!/bin/bash
./bin/hive --service metastore &

执行: sh start_hive.sh即可

常见问题与解决方案

1、show databases; show tables;出错

Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient

2、hive启动时报错Required table missing : "VERSION" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations

解决办法:修改hive配置文件 hive-site.xml,设置以下三个属性都为true,即可解决问题。

<property>
  <name>datanucleus.autoCreateSchema</name>
  <value>true</value>
</property>
<property>
  <name>datanucleus.autoCreateTables</name>
  <value>true</value>
</property>
<property>
  <name>datanucleus.autoCreateColumns</name>
  <value>true</value>
</property>

新版本直接配置:

  <property>
    <name>datanucleus.schema.autoCreateAll</name>
    <value>true</value>
    <description>creates necessary schema on a startup if one doesn't exist. set this to false, after creating it once</description>
  </property>

3、再次报Schema Transaction threw exception"Add classes to Catalog"metastore_db", Schema"""

查看hive库,表创建到VERSION表,再看一下 数据库配置与结构表:scripts/metastore/upgrade/mysql/ hive-schema-2.1.0.mysql.sql 这个导入成功,但是hive-txn-schema-2.1.0.mysql.sql没有导入成功

4、如果还是报错,请drop database,手动导入这两个文件表结构与内容

5、Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI

把hive-site.xml中的${system:java.io.tmpdir} 替换为绝对路径