Hive体系介绍

1 篇文章 0 订阅

Hive体系介绍

★ Hive简介

Hive是架构在Hadoop上的数据仓库架构。它提供了一系列的工具,可以用这些工具来进行ETL,即数据的提取转化加载。这是一种可以存储、查询和分析存储在Hadoop中HDFS中的大规模数据的机制。

Hive定义了简单的类SQL语言,称为QL,也被称为HQL.

Hive的工作原理就是将SQL语句默诵成MR Job然后在Hadoop上运行。

Hive的表就是HDFS的目录,表名就是用一个个的文件来区分的。如果是分区表,则分区值是文件夹的子文件夹,可以直接将在MR Job里使用这些数据。

★ Hive的架构

下图是一个典型的Hive的架构图。

1:Hive的用户接口包括:CLI(即shell命令行)、JDBC/ODBC(Hive的Java)、和WebUI

2:Hive元数据的存储,通常是存储在关系型数据库中,如Mysql或Derby

         Hive中的元数据包括有表的名字、表的列和分区及其属性,表的属性(外部表or内部表),表的数据所在的目录

3:Hive自己有解释器、编译器、优化器和执行器

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

4:Hadoop利用HDFS进行数据存储,利用MapReduce来计算

5:Hive的数据存储在HDFS中,大部分的查询由MapReduce完成。包含*的查询不会转化为MapReduce任务。

▲ 什么是ETL?

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过萃取(extract)、转置(transform)、加载(load)至目的端的过程。[摘自百度百科]

 

 

★ Hive的安装

一、安装步骤

1:上传文件、解压、重命名略

2:配置环境变量

export HIVE_HOME=/usr/local/hive

export PATH=.:$PATH:$HIVE_HOME/bin

source /etc/profile

3:修改Hive的配置文件的名称

原配置文件名称:

hive-default.xml.template

hive-exec-log4j.properties.template

hive-env.sh.template

hive-log4j.properties.template

修改:

mv hive-default.xml.template hive-site.xml

mv hive-env.sh.template hive-env.sh

修改后配置文件名称:

hive-env.sh

hive-site.xml

4:修改$HADOOP_HOME/conf/hadoop-env.sh

export HADOOP_CLASSPATH=.:$CLASSPATH:$HADOOP_CLASSPATH:$HADOOP_HOME/bin

 

5:修改$HIVE_HOME/bin/hive-config.sh

export JAVA_HOME=/usr/local/jdk1.6

export HIVE_HOME=/usr/local/hive

export HADOOP_HOME=/usr/local/hadoop1

 

6:修改hive保存metadata的数据关系型数据库

默认Hive保存Metadata的关系型数据库是内嵌的Derby数据库。

Metadata是HiveHive元数据的集中存放地。

由于Derby一次只能打开一个会话,由于存在这个缺点,故要修改Hive保存Metadata的数据库。

修改$HIVE_HOME/conf/hive-site.xml

<property>

         <name>javax.jdo.option.ConnectionURL</name>

         <value>jdbc:mysql://hadoop5: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>root</value>

</property>

 

7:启动Hive

执行$HIVE_HOME/bin/hive进入cli命令行交互模式

启动Hive并查看所有的数据库。还可以查看表,语法类似Mysql。

 

根据配置:jdbc:mysql://hadoop5:3306/hive?createDatabaseIfNotExist=true

在Mysql数据库中会有一个叫做hive的数据库,如下图所示:如下是Hive在Mysql中的数据库及表。

 

设置Hive数据库文件夹及文件在HDFS中的保存目录。

<property>

 <name>hive.metastore.warehouse.dir</name>

 <value>/hivemetastore</value>

 <description>location of default database for thewarehouse</description>

</property>

 

二、运行模式

Hive的运行模式即任务的执行环境。

运行模式包括本地和集群两种,可以通过mapred.job.tracker来指明。

设置:

hive>SET mapred.job.tracker=local

三、Hive的启动方式

㈠、Hive命令行方式

命令:hive --service cli

或者直接输入#hive

也可以进入命令行交互模式

㈡、hive web 界面(端口号:9999)的启动方式

         #hive--service hwi &

用于通过浏览器来访问hive

在浏览器输入http://hadoop5:9999/hwi/authorize.jsp

即可访问到如下页面。

㈢、hive 远程服务(端口号10000) 启动方式

#hive --service hiveserver &

#hive --service hiveserver 10000>/dev/null 2>/dev/null &

 

★ Hive与传统数据库

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

下表展示Hive与传统数据库的区别:

查询语言

HiveQL

SQL

数据存储位置

HDFS

Raw Device or 本地FS

数据格式

用户定义

系统决定

数据更新

不支持

支持

索引

新版本有,但弱

执行

MapReduce

Executor

执行延迟

可扩展性

数据规模

 

 

 

★ Hive的数据类型

基本数据类型:

tinyint/smallint/int/bigint

float/double

bolean

strign

复杂数据类型

Array/Map/Struct

 

 

Hive的存储结构主要包括:数据库、文件、表、视图

Hive默认可以直接加载文本文件(TextFile),还支持sequencefile,创建表时,指定Hive数据的列分隔符,Hive即可解析数据。

 

★ Hive的表的数据模型

四种表类型的介绍。

▲ Table 内部表

每一个内部表在Hive中都有一个相应的目录存储数据。

例如:一个表test,它在HDFS中的路径为/hivemetastore/test

注:其中hivemetastore是在hive.site.xml中${hive.metastore.warehouse.dir} 指定的数据仓库的目录。

${hive.metastore.warehouse.dir}是除分区表外所有的表数据保存数据的目录。

准备数据:

创建表/导入数据/查看导入数据:

 

查询数据库中的记录数:

查询记录数的时候,实际上是走了一个MRJob来计算数据表中记录的个数。

如下是数据文件在HDFS中的存储:

 

 

▲ Partition 分区表

Partition对应于数据库的Partition列的密集索引。

在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。

如:表test中包含date和city两个Partition,

则对应于date=20140725,city=bj的HDFS子目录为:/hivemetastore/test/date=20140725/city=bj

对应于date=20140725,city=bj的HDFS子目录为:/hivemetastore/test/date=20140725/city=bj

 

准备数据:(用'\t'来分割)

 

创建表:

create table partition_table (rectimestring,msisdn string) partitioned by (daytime string,city string) row formatdelimited fields terminated by '\t' stored as TEXTFILE;

加载数据到表:

load data local inpath'/root/partition_table.dat' into table partition_table partition(daytime='2014-07-25',city='bj');

查看数据:

查看分区表的分区信息:

查看表结构:

如下显示的是所有的分区在HDFS中的情况:

删除分区:

删除分区后:

删除分区后,元数据、数据文件被删除,而目录还存在。如下所示:

 

▲ External Table 外部表

注:外部表导入时似乎不用把数据传到HDFS中。只用Linux下的系统文件即可。

 

 

外部表:指向在HDFS中已经存在的数据,可以创建Partition

它和内部表在元数据的组织上是一致的,而实际的数据存储则有较大差异。

内部表的创建过程和数据加载过程,在加载数据的过程中,实际数据会被移动到数据仓库目录中。之后对数据的访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。内部表的创建过程和数据加载可以在同一个语句中完成。

外部表只有一个过程,加载数据和创建表同时完成,并不会移动数据到数据仓库的目录中,只是与外部数据建立一个链接。当删除一个外部表时,仅仅是删除该链接。

 

准备数据:

文件路径:/root/external_table2.dat

创建表:

命令:

create external table external_table (namestring,age int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location'/root/external_table2.dat';

导入数据:(如果需要)

LOAD DATA INPATH '/external_table2' INTOTABLE external_table;

此时导入时应该用的是HDFS文件。

查询某列:

查询某列时,则会启动一个MR Job来查询结果。

 

▲ Bucket Table 桶表

桶表是对数据进行哈希取值,然后放到不同文件中进行取值。

数据源:

创建桶表:

create table bucket_table(age int,namestring) clustered by(age) into 4 buckets;

设置参数:

hive> set hive.enforce.bucketing = true;

插入数据:

导入数据后查看数据:

 

 

 

★ Hive的shell操作

包括对数据库的各种操作。

▲ 创建一个数据库

命令:create database test_hive;

▲ 使用数据库

命令:use test_hive;

▲ 基于Partition的查询

表中所有数据:

表结构:

按分区查询:

▲ Limit 查询

 

▲ TOP N查询

select partition_table.* from partition_tablesort by rectime asc;

再结合limit

select partition_table.* frompartition_table sort by rectime asc limit 5;

▲ 表连接

导入ac信息表

hive> create table acinfo (namestring,acip string)  row format delimitedfields terminated by '\t' stored as TEXTFILE;

hive> load data local inpath'/home/acinfo/ac.dat' into table acinfo;

内连接

select b.name,a.* from dim_ac a join acinfob on (a.ac=b.acip) limit 10;

左外连接

select b.name,a.* from dim_ac a left outerjoin acinfo b on a.ac=b.acip limit 10;

▲ 创建一个数据库

 

▲ 创建一个数据库

 

▲ 创建一个数据库

 

▲ 创建一个数据库

 

▲ 创建一个数据库

 

 

★ Java客户端

第一:启动Hive远程服务

#hive --service hiveserver >/dev/null  2>/dev/null &

 

JAVA客户端相关代码

Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");

Connection con =DriverManager.getConnection("jdbc:hive://192.168.1.102:10000/wlan_dw","", "");

Statement stmt = con.createStatement();

String querySQL="SELECT * FROMwlan_dw.dim_m order by flux desc limit 10";

 

ResultSet res =stmt.executeQuery(querySQL); 

 

while (res.next()) {

System.out.println(res.getString(1)+"\t" +res.getLong(2)+"\t" +res.getLong(3)+"\t"+res.getLong(4)+"\t" +res.getLong(5));

}

 

★ UDF函数

 

 

 

 

★ UDAF函数

 

 

 

 

 

 

 

 

 

 

 

 

 

★ Mysql安装

在设置Hive保存元数据之前,应该安装Mysql数据库,并设置相应的用户密码。

卸载Mysql 5.1.66

rpm -e mysql-libs-5.1.66-2.el6_3.x86_64 --nodeps

rpm -e mysql-5.1.66-2.el6_3.x86_64 --nodeps

rpm -e mysql-server-5.1.66-2.el6_3.x86_64 --nodeps

rpm -e mysql-connector-odbc-5.1.5r1144-7.el6.x86_64

安装Mysql 5.1.66

rpm -ivh mysql-5.1.66-2.el6_3.x86_64.rpm --force--nodeps

rpm -ivhmysql-libs-5.1.66-2.el6_3.x86_64.rpm --force --nodeps

rpm -ivhmysql-server-5.1.66-2.el6_3.x86_64.rpm --force --nodeps

rpm -ivh mysql-connector-odbc-5.1.5r1144-7.el6.x86_64.rpm--force --nodeps

 

安装MySQL-server-5.5.31-2.el6.i686.rpm

 

报错!有时间再安装下

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值