Hive原理及Hive的搭建

Hive简介

  1. 什么是Hive
    hive是基于Hadoop的一个数据仓储工具,可以将结构化的数据文件映射为一张数据表,并提供SQL查询功能,可以将SQL语句转化为MapReduce任务进行执行。hive是基于Hadoop的一个数据仓储工具,可以将结构化的数据文件映射为一张数据表,并提供SQL查询功能,可以将SQL语句转化为MapReduce任务进行执行。
  2. Hive的优点
    学习成本年低,可以通过类SQL语句快速实现简单的MapReduce统计计算,不必开发专门的MapReduce,十分适合数据仓储的统计与分析。
  3. Hive的缺点
    虽然用类SQL简化了操作,但是实际上还是在hdfs上调用了MapReduce,这样的话,效率还是有所降低的。
  4. Hive数据仓储与数据库的区别
    Hive:数据仓储
    Hive:解释器、编译器、优化器等。
    Hive:运行时,元数据存储在关系型数据库里面。

    数据仓储主要用来保存数据,对数据进行分析计算,一次写入,多次读取,不能修改,不能删除单条数据,除非把整个文件删除。我们用的修改其实是覆盖,先把整个文件下载下来,修改后重新上传。

    Hive的主要功能可以将一条数据转换为MapReduce,Hive依赖于HDFS和Yarn。

Hive架构

在这里插入图片描述

  • 用户接口:包括CLI,JDBC/ODBC,web UI
  • 元数据存储,通常是存储在关系型数据库中mysql,derby中
  • 解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
  • Hive的真实数据(源数据)存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)。

Hive与传统数据库进行比较

查询语言 HQL SQL
数据存储位置 HDFS 本地FS
数据格式 用户定义 系统决定
数据更新 不支持 支持
索引 新版本有,但弱
执行 MapReduce Executor
执行延迟
可扩展性
数据规模

Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符 (”\n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加载数据的过程中,不需要从用用户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。

Hive的搭建

hive三种方式区别和搭建
按照Hive中metastore(元数据存储)不同位置分为三种方式:
 a)内嵌Derby方式
 b)Local方式
 c)Remote方式

1,安装Hive

	解压下载好的apache-hive-1.2.1-bin.tar.gz安装包到 /opt/apache-hive-1.2.1目录下
	tar -zxvf apache-hive-1.2.1-bin.tar.gz /opt/apache-hive-1.2.1

2,配置环境变量

export HIVE_HOME=/opt/apache-hive-1.2.1
export PATH=$HIVE_HOME/bin:$PATH

3,三种方式的搭建(配置文件的不同)
①Derby方式
修改hive-site.xml
配置文件,修改如下

<configuration>  
<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>
</configuration>  

启动hive

./hive

注意:将hive/lib目录下的jline jar包拷贝到hadoop的yarn lib下

这种模式的弊端
使用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

②Local(mysql)方式

这种存储方式需要在本地运行一个mysql服务器,并作如下配置(下面两种使用mysql的方式,需要将	
mysql的jar包拷贝到$HIVE_HOME/lib目录下)。 
即是hive和mysql都配置在客户端

修改hive-site.xml,配置如下

<configuration>  
<property>  
  <name>hive.metastore.warehouse.dir</name>  
  <value>/user/hive_meta/warehouse</value>  
</property>     
<property>  
 <name>hive.metastore.local</name>  
  <value>true</value>  
</property>   
<property>  
 <name>javax.jdo.option.ConnectionURL</name>  
 <value>jdbc:mysql://192.168.23.129/hive_remote?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> 

注意一个坑:
权限,虽然hive用户对hive_meta数据库是由操作权限的,但是这个数据库如果不存在,hive用户也是没有权限创建这个数据库,所以需要提前创建好hive_remote数据库

安装mysql

Yum install mysql-server -y

修改mysql权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
flush privileges;

删除多余会对权限造成影响的数据
刷新权限

添加用户:
CREATE USER 'hive'@'%' IDENTIFIED BY '123';
授权用户:
grant all privileges on hive_meta.* to hive@"%" identified by '123';
flush privileges;
设置开机启动
chkconfig mysqld on

注意每次修改后要刷新权限,否则不起作用

配置过程中出现的错误

[ERROR] Terminal initialization failed; falling back to unsupported
java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
at jline.TerminalFactory.create(TerminalFactory.java:101)

错误的原因: Hadoop jline版本和hive的jline不一致

③多用户模式

将hive-site.xml配置文件拆为如下两部分

服务端配置文件

<configuration>  
<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>  
</configuration>  

客户端配置文件

<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>  

启动hive服务端程序

 hive --service metastore
 或者,上面的那条语句执行比较慢,可以采用下面的让他在后台启动
 ./hive --service metastore >> meta.log 2>&1 &
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章