深入浅出认识Hive

来源:互联网 发布:淘宝图片优化软件 编辑:程序博客网 时间:2024/06/05 05:26

1、什么是Hive---Hive是一个数据仓库,不是数据库

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

◆数据仓库和数据库的区别

简而言之,数据库是面向事务的设计,数据仓库是面向主题设计的;数据库一般存储在线交易数据,数据仓库存储的一般是历史数据;数据库设计是尽量避免冗余,一般采用符合范式的规则来设计,数据仓库在设计是有意引入冗余,采用反范式的方式来设计;数据库是为捕获数据而设计,数据仓库是为分析数据而设计。

Hive构建在基于静态批处理的Hadoop之上,Hadoop通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive并不能够在大规模数据集上实现低延迟快速的查询,例如,Hive在几百MB 的数据集上执行查询一般有分钟级的时间延迟。所以,Hive并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。Hive查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive将用户的HiveQL 语句通过解释器转换为MapReduce作业提交到Hadoop集群上,Hadoop监控作业执行过程,然后返回作业执行结果给用户。Hive并非为联机事务处理而设计,Hive并不提供实时的查询和基于行级的数据更新操作。Hive的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。

2Hive的体系结构

A用户接口

用户接口主要有三个:CLIJDBC/ODBC和 Web GUI。其中最常用的是 CLICli 启动的时候,会同时启动一个 Hive 副本。JDBC/ODBC 是 Hive 的客户端,用户连接至 Hive Server,在1.x之后,Hive使用了HiveServer2WUI 是通过浏览器访问 Hive

B数据存储

Hive 将元数据存储在数据库中,如 mysqlderbyHive自带的和默认的数据库,不过由于derby不支持多线程并发查询,所以通常不使用derby)。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

C、Driver(解释器、编译器、优化器、执行器)

解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。

D、Hadoop

Hive 的数据存储在 HDFS 中,最直观的表现是:Hive对应着HDFS中根下的一个目录,而其他数据库对应该目录下的子目录,而Hive中的表对应着真实的文件(在创建表的时候由一个load操作,如果创建的是外部表,会将HDFS中的文件copy到数据库对应目录下,如果创建的是内部表,则会将对应文件直接move到库目录下)。大部分的查询由 MapReduce 完成(包含 的没有逻辑的查询,比如 select * from tbl 不会生成 MapReduce 任务)。


HiveSQLMR的转换---Hive可以看作是MR的客户端

hive的客户端有三种,CLI(命令行)、JDBCWeb页面。

1)webUI----脱裤子放屁的操作,并没有什么卵用

A、环境:

hive

hadoop

jdk

ant

B、安装

a、解压hivesrc tar

b、进入${HIVE_SRC_HOME}/hwi/web 并执行jar -cvf hive-hwi-2.1.1.war * 并将打包好的war文件复制到hivelib目录下

c、修改hivehive-site.xml

<property>

<name>hive.hwi.listen.host</name>

<value>0.0.0.0</value>

     <description>监听的地址</description>

   </property>

   <property>

<name>hive.hwi.listen.port</name>

<value>9999</value>

<description>监听的端口号</description>

   </property>

   <property>

<name>hive.hwi.war.file</name>

<value>lib/hive-hwi-2.1.1.war</value>

<description>war包所在的地址,注意这里不支持绝对路径,坑!</description>

   </property>

C、将jdk下的tools.jar复制到hivelib目录下

D、安装并配置ANT

E、将antlibant.jar复制到hivelib目录下

F、启动web ui

hive --service hwi


2JDBC---一般javaEE开发会用,大数据开发基本不用--

A、为什么需要JDBC

JDBCJava数据库连接技术的简称,提供连接各种常用数据库的能力。通常java程序想要访问数据库,需要使用这种技术。

BJDBC的工作原理?

java程序 <--> JDBC API <--> JDBC Drive Manager <--> JDBC 驱动 <--> MysqlOracleDB2....

JDBC APIsun公司提供的、供程序员调用的接口与类,集成在java.sqljavax.sql包中,如:DriverManagerConnectionStatementResultSet

DriverManager也是sun公司提供的、管理各种不同的JDBC驱动(DRIVER)

JDBC 驱动是对应的数据库厂商根据sun公司提供的接口自己实现的驱动,如mysqljdbc、还有hivejdbc等等。

CJDBC API

与数据库建立连接、执行SQL 语句、处理结果

1、获取驱动 DriverManager

2、获取连接 Connection

3、执行查询语句 Statement

4、返回结果 ResultSet

DJDBCODBC的区别--->http://blog.csdn.net/u010926964/article/details/46389867

EJDBC API常用方法:

aStatement:

ResultSet executeQuery(String sql) 执行SQL查询并获取到ResultSet对象

int executeUpdate(String sql) 可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数

boolean execute(String sql)  可以执行任意SQL语句,然后获得一个布尔值,表示是否返回ResultSet

bResultSet

boolean next() 将光标从当前位置向下移动一行

boolean previous() 游标从当前位置向上移动一行

void close() 关闭ResultSet 对象

int getInt(int colIndex) 以int形式获取结果集当前行指定列号值

int getInt(String colLabel) 以int形式获取结果集当前行指定列名值

float getFloat(int colIndex) 以float形式获取结果集当前行指定列号值

float getFloat(String colLabel) 以float形式获取结果集当前行指定列名值

String getString(int colIndex) 以String 形式获取结果集当前行指定列号值

String getString(String colLabel) 以String形式获取结果集当前行指定列名值

FStatementPreparedStatement的区别?

"select * from user where name=? and password=?;"

Properties prop =  new  Properties();    

InputStream in = Object. class .getResourceAsStream( "/test.properties" ); 

<property>

<name>hadoop.proxyuser.root.hosts</name>

<value>*</value>

</property>

<property>

<name>hadoop.proxyuser.root.groups</name>

<value>*</value>

</property>

 

HiveSQL的区别:

      Hive是读时模式(不会在数据加载时进行验证,而是在查询的时候进行),SQL是写时模式(数据在写入数据库是对模式进行检查)。在创建表时,Hive会直接将相应文件导入,而SQL会将文件中的数据一条一条写入数据库。因此,在进行大数据的分析时,使用Hive效率更高。
    HQL和MySQL的方言最接近,但是两者还是存在显著性差异的。Hive不支持行级插入操作、更新操作和删除操作,Hive也不支持事务。

 

3CLI---详见后续博客




原创粉丝点击