HIve数据仓库应用及搭建

1、Hive是什么

         Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张数据库表,并提供类SQL查询功能。 通俗讲,其实HIVE就是一个SQL解析引擎,它将SQL语句转译成M/R JOB然后在Hadoop执行,来达到快速开发的目的。拨开HIVE的神秘面纱之后来看它的表其实就是一个Hadoop的目录/文件(HIVE默认表存放路径一般都是在你的工作目录的hive目录里面),按表名做文件夹分开。
        Hive是为了简化用户编写MapReduce程序而生成的一种框架Hive是建立在Hadoop之上的数据仓库基础构架、是为了减少MapReduce编写工作的批处理系统,Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce。Hive可以理解为一个客户端工具,将我们的sql操作转换为相应的MapReduce jobs,然后在Hadoop上面运行。
         Hive可以认为是MapReduce的一个封装、包装。Hive的意义就是在业务分析中将用户容易编写、会写的Sql语言转换为复杂难写的MapReduce程序,从而大大降低了Hadoop学习的门槛,让更多的用户可以利用Hadoop进行数据挖掘分析。

那么hive的优势有什么呢?

  • Hive支持标准的SQL语法,免去了用户编写MapReduce程序的过程,大大减少了公司的开发成本。
  • Hive的出现可以让那些精通SQL技能、但是不熟悉MapReduce、编程能力较弱与不擅长Java语言的用户能够在HDFS大规模数据集上很方便地利用SQL语言查询、汇总、分析数据,毕竟精通SQL语言的人要比精通Java语言的多得多。
  • Hive是为大数据批量处理而生的,Hive的出现解决了传统的关系型数据库
    (MySql、Oracle)在大数据处理上的瓶颈。

Hive的架构:

在这里插入图片描述

         用户在cient节点根据实际的业务编写出相应的sql语句后,hive就会对sql语句进行分析,因为hive中封装了索引的MapReudce模板,hive会对于分析结果和MapReudce框架进行匹配,匹配成功后生成相应MapReduce程序并运行,最后将结果返回给用户,这就是Hive框架的主要运行流程。

2、Hive体系结构

在这里插入图片描述

Hive Client(用户接口):

         用户可以通过三种方式操作hive数据库,shell命令连接操作、JDBC/ODBC连接、webUI连接;shell命令连接就是直接在操作系统的终端进行连接,JDBC是通过JAVA代码连接,webUI则是通过浏览器连接
Hive Server:

         hive对外开发的服务器,用要想操作hive’数据库,首先得连上Server
Driver(驱动器)

         对用户传递的sql语句进行解释、编译、优化、执行。
Meta_store(元数据存储)

         用户操作表的元数据都会存在meta_store中,比如下表,meta_store既可以存在自带的derby中,也可以存在本地的mysql数据中。
在这里插入图片描述

Hadoop
         用 MapReduce 进行计算,用 HDFS 进行存储。

3、Hive运行机制

在这里插入图片描述

Hive安装模式

        hive的安装模式分为三种:内嵌Derby模式,本地独立(Local)模式,远程(Remote)模式。三种安装模式示意图:
在这里插入图片描述

Hive安装内嵌(derby)模式:
        这种模式的元数据库和Hive工具都是在本地的,这种模式一次只允许一个用户同时操作hive,安装教程:
首先将Hive的安装包上传到client节点中:
在这里插入图片描述
        这种方式是最简单的存储方式,只需要在$HIVE_HOME/conf/hive-site.xml(conf目录下是没有hive-site.xml文件的,需要将hive-default.xml.template复制一份并改名为hive-site.xml,然后删除默认的配置信息)做如下配置便可:

<property>  
 	 <name>javax.jdo.option.ConnectionURL</name>  
	  <value>jdbc:derby:;databaseName=metastore_db;create=true</value>  
	</property>  

	<property>  
	  <name>javax.jdo.option.ConnectionDriverName</name>  
	  <value>org.apache.derby.jdbc.EmbeddedDriver</value>  
	</property>  

	<property>  
	  <name>hive.metastore.local</name>  
	  <value>true</value>  
	</property>  

	<property>  
	  <name>hive.metastore.warehouse.dir</name>  
	  <value>/user/hive/warehouse</value>  
	</property>

在这里插入图片描述

        配置完成后,将/opt/software/hive/hive-1.2.1/lib/jline-2.12.jar复制到/opt/software/hadoop/hadoop-2.6.5/share/hadoop/yarn/lib/下,并将原来的jline-0.9.94.jar改名使其失效或者直接删除
在这里插入图片描述
        然后将hive/lib目录下的jline jar包拷贝到hadoop的yarn lib下,接下来直接在bin下面启动hive就行:
在这里插入图片描述

注:使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误

[html] view plaincopyprint?
hive> show tables;  
FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for 	details.  
NestedThrowables:  
java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.  
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask  
hive> show tables;
FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for details.
NestedThrowables:
java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

在这里插入图片描述
Hive安装本地(local)模式:

        这种存储方式需要在本地运行一个mysql服务器:
安装mysql

yum install mysql-server -y

        登录mysql后修改mysql权限:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
	flush privileges;

        添加用户:

CREATE USER 'hive'@'%' IDENTIFIED BY '123456';

        授权用户:

grant all privileges on hive_meta.* to [email protected]"%" identified by '123456';
flush privileges;

        设置开机启动

chkconfig mysqld on

        修改配置文件:hive-site.xml

<configuration>  
<property>  
  <name>hive.metastore.warehouse.dir</name>  
  <value>/user/hive_remote/warehouse</value>  
</property>  

<property>  
  <name>hive.metastore.local</name>  
  <value>true</value>  
</property>  

<property>  
  <name>javax.jdo.option.ConnectionURL</name>  
  <value>jdbc:mysql://localhost/hive_meta?createDatabaseIfNotExist=true</value>  
</property>  
   
<property>  
  <name>javax.jdo.option.ConnectionDriverName</name>  
  <value>com.mysql.jdbc.Driver</value>  
</property>  
   
<property>  
  <name>javax.jdo.option.ConnectionUserName</name>  
  <value>hive</value>  
</property>  
   
<property>  
  <name>javax.jdo.option.ConnectionPassword</name>  
  <value>123456</value>  
</property>  
</configuration>

将 mysql-connector-java-5.1.32-bin.jar包上传到$HIVE_HOME/lib目录下,然后执行hive,进入数据库:
在这里插入图片描述

Hive安装远程(Remote)模式

此时我的client节点作为Hive的服务端,node01节点作为Hive的客户端.。Client服务端的配置文件修改如下:

<configuration>  
	<property>  
	  <name>hive.metastore.warehouse.dir</name>  
	  <value>/user/hive/warehouse</value>  
	</property>  
	   
	<property>  
	  <name>hive.metastore.local</name>  
	  <value>false</value>  
	</property>  
	  
	<property>  
	  <name>hive.metastore.uris</name>  
	  <value>thrift://192.168.57.5:9083</value>  
	</property>  
  
</configuration>

在这里插入图片描述

Node01节点作为客户端,配置文件如下:

<property>  
	  <name>hive.metastore.warehouse.dir</name>  
	  <value>/user/hive/warehouse</value>  
	</property>  
	   
	<property>  
	  <name>javax.jdo.option.ConnectionURL</name>  
	  <value>jdbc:mysql://192.168.57.6:3306/hive?createDatabaseIfNotExist=true</value>  
	</property>  
	   
	<property>  
	  <name>javax.jdo.option.ConnectionDriverName</name>  
	  <value>com.mysql.jdbc.Driver</value>  
	</property>  
	   
	<property>  
	  <name>javax.jdo.option.ConnectionUserName</name>  
	  <value>root</value>  
	</property>  
	   
	<property>  
	  <name>javax.jdo.option.ConnectionPassword</name>  
	  <value>123456</value>  
	</property>

在这里插入图片描述

然后启动hive服务端程序
hive --service metastore
或者
hive --service metastore >> /var/log/meta.log 2>&1 &
在这里插入图片描述

客户端直接使用hive命令即可
在这里插入图片描述

使用JDBC模式连接:
在client节点的原有的hive-site.xml文件的基础上添加以下配置:

<property>
                <name>hive.server2.authentication</name>
                <value>CUSTOM</value>
        </property>

        <property>
                <name>hive.jdbc_passwd.auth.zhangsan</name>
                <value>123456</value>
        </property>
        <property>
                <name>hive.server2.custom.authentication.class</name>
                <value>com.hoe.hive.authoriz.UserPasswdAuth</value>
        </property>

在这里插入图片描述

首先将以下代码达成jar包发送到客户端$HIVE_HOME/lib中:

package com.hpe.hive.authoriz;

import javax.security.sasl.AuthenticationException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hive.service.auth.PasswdAuthenticationProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**   
 * @ClassName:  UserPasswdAuth   
 * @Description:TODO描述:   
 * @author: mozhaojian
 * @date:   2018年10月26日 下午7:30:07       
 */  
public class UserPasswdAuth implements PasswdAuthenticationProvider {
	Logger logger = LoggerFactory.getLogger(UserPasswdAuth.class);

	private static final String USER_PASSWD_AUTH_PREFIX = "hive.jdbc_passwd.auth.%s";

	private Configuration conf = null;

	@Override
	public void Authenticate(String userName, String passwd) throws AuthenticationException {
		logger.info("user: " + userName + " try login.");
		String passwdConf = getConf().get(String.format(USER_PASSWD_AUTH_PREFIX, userName));
		if (passwdConf == null) {
			String message = "沒有发现用户 " + userName;
			logger.info(message);
			throw new AuthenticationException(message);
		}
		if (!passwd.equals(passwdConf)) {
			String message = "用户名密码不匹配 " + userName;
			throw new AuthenticationException(message);
		}
	}

	public Configuration getConf() {
		if (conf == null) {
			this.conf = new Configuration(new HiveConf());
		}
		return conf;
	}

	public void setConf(Configuration conf) {
		this.conf = conf;
	}
}

在client节点启动hivesercer2服务:
在这里插入图片描述

node1节点进入beenline模式,然后使用jdbc连接:
在这里插入图片描述