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的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
◆Hive与SQL的区别:
Hive是读时模式(不会在数据加载时进行验证,而是在查询的时候进行),SQL是写时模式(数据在写入数据库是对模式进行检查)。在创建表加载数据时,Hive会直接将相应文件导入,而SQL会将文件中的数据一条一条写入数据库。因此,在进行大数据的分析时,使用Hive效率更高。
HQL和MySQL的方言最接近,但是两者还是存在显著性差异的。Hive不支持行级插入操作、更新操作和删除操作,Hive也不支持事务。
2、Hive的体系结构
A、用户接口
用户接口主要有三个:CLI,JDBC/ODBC和 Web GUI。其中最常用的是 CLI,Cli 启动的时候,会同时启动一个 Hive 副本。JDBC/ODBC 是 Hive 的客户端,用户连接至 Hive Server,在1.x之后,Hive使用了HiveServer2。WUI 是通过浏览器访问 Hive。
B、数据存储
Hive 将元数据存储在数据库中,如 mysql、derby(Hive自带的和默认的数据库,不过由于derby不支持多线程并发查询,所以通常不使用derby)。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
C、Driver(解释器、编译器、优化器、执行器)
解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。
D、Hadoop
Hive 的数据存储在 HDFS 中,最直观的表现是:Hive对应着HDFS中根下的一个目录,而其他数据库对应该目录下的子目录,而Hive中的表对应着真实的文件(在创建表的时候由一个load操作,如果创建的是外部表,会将HDFS中的文件copy到数据库对应目录下,如果创建的是内部表,则会将对应文件直接move到库目录下)。大部分的查询由 MapReduce 完成(包含 * 的没有逻辑的查询,比如 select * from tbl 不会生成 MapReduce 任务)。
3、鬼知道该怎么起标题
HiveSQL与MR的转换---Hive可以看作是MR的客户端
hive的客户端有三种,CLI(命令行)、JDBC和Web页面。【了解即可】
1)webUI----脱裤子放屁的操作,并没有什么卵用
A、环境:
hive
Hadoop
jdk
ant
B、安装
a、解压hive的src tar包
b、进入${HIVE_SRC_HOME}/hwi/web 并执行jar -cvf hive-hwi-2.1.1.war * 并将打包好的war文件复制到hive的lib目录下
c、修改hive的hive-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复制到hive的lib目录下
D、安装并配置ANT--自己百度,不想装
E、将ant的lib下ant.jar复制到hive的lib目录下
F、启动web ui
hive --service hwi
2)JDBC---一般javaEE开发会用,大数据开发基本不用,延迟太高
A、为什么需要JDBC?
JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力。通常java程序想要访问数据库,需要使用这种技术。
B、JDBC的工作原理?
java程序 <--> JDBC API <--> JDBC Drive Manager <--> JDBC 驱动 <--> Mysql、Oracle、DB2....
JDBC API是sun公司提供的、供程序员调用的接口与类,集成在java.sql和javax.sql包中,如:DriverManager、Connection、Statement、ResultSet等
DriverManager也是sun公司提供的、管理各种不同的JDBC驱动(DRIVER)
JDBC 驱动是对应的数据库厂商根据sun公司提供的接口自己实现的驱动,如mysql的jdbc、还有hive的jdbc等等。
C、JDBC API:
与数据库建立连接、执行SQL 语句、处理结果
1、获取驱动 DriverManager
2、获取连接Connection
3、执行查询语句Statement
4、返回结果ResultSet
D、JDBC和ODBC的区别--->http://blog.csdn.net/u010926964/article/details/46389867
E、JDBC API常用方法:
a、Statement:
ResultSet executeQuery(String sql)执行SQL查询并获取到ResultSet对象
int executeUpdate(String sql)可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数
boolean execute(String sql) 可以执行任意SQL语句,然后获得一个布尔值,表示是否返回ResultSet
b、ResultSet:
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形式获取结果集当前行指定列名值
F、Statement和PreparedStatement的区别?
"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>
3)CLI---见后续相关博客