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连接: