Hive---基于Hadoop的数据仓库工具讲

2018-02-05 10:27:27来源:http://www.thebigdata.cn/KaiYuanJiShu/34568.html作者:中国大数据人点击

分享

hadoop:


Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用来开发分布式程序。充分利用集群的威力进行高速运算和存储。


Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。


Hadoop框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算。


Hadoop体系结构:


hive:


一、什么是hive

Hive是部署在hadoop集群上的数据仓库工具。


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


数据库(如常用关系型数据库)可以支持实时增删改查。


数据仓库不仅仅是为了存放数据,它可以存放海量数据,而且可以查询、分析和计算存储在Hadoop 中的大规模数据。但他有一个弱点,他不能进行实时的更新、删除等操作。也就是一次写入多次读取。


Hive 也定义了简单的类 SQL 查询语言,称为 QL ,它允许熟悉 SQL 的用户查询数据。现在hive2.0也支持更新、索引和事务,几乎SQL的其它特征都能支持。


Hive支持SQL92大部分功能,我们暂时可以把 hive理解成一个关系型数据库,语法和MySQL是几乎是一样的。


Hive是Hadoop 上的数据仓库基础构架之一,是SQL解析引擎,它可以将SQL转换成MapReduce任务,然后在Hadoop执行。


二、hive的部署与安装


Hive只在一个节点上安装即可


1. 上传tar包


apache-hive-1.2.1-bin.tar.gz


2. 解压


tar -zxvf hive-0.9.0.tar.gz -C /cloud/


3. 配置mysql metastore 元数据库(切换到root用户)


配置HIVE_HOME环境变量


rpm -qa | grep mysql


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


rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rpm


rpm -ivh MySQL-client-5.1.73-1.glibc23.i386.rpm


修改mysql的密码


/usr/bin/mysql_secure_installation


(注意:删除匿名用户,允许用户远程连接)


登陆mysql


mysql -u root -p


4. 配置hive


cp hive-default.xml.template hive-site.xml


修改hive-site.xml(删除所有内容,只留一个<property></property>)


添加如下内容:


<property>


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


<value>jdbc:mysql://xcloud36:3306/hive?createDatabaseIfNotExist=true</value>


<description>JDBC connect string for a JDBC metastore</description>


</property>


<property>


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


<value>com.mysql.jdbc.Driver</value>


<description>Driver class name for a JDBC metastore</description>


</property>


<property>


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


<value>root</value>


<description>username to use against metastore database</description>


</property>


<property>


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


<value>123</value>


<description>password to use against metastore database</description>


</property>


5. 安装hive和mysq完成后,将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下


如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行)


mysql -uroot -p


#(执行下面的语句 *.*:所有库下的所有表 %:任何IP地址或主机都可以连接)


GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;


FLUSH PRIVILEGES;


6. 启动hive


进入hive的安装的home目录下的bin目录

[[emailprotected] bin]$ pwd


/home/Neo/apache-hive-1.2.1-bin/bin


执行hive脚本

[[emailprotected] bin]$ ./hive


Cannot find hadoop installation: $HADOOP_HOME or $HADOOP_PREFIX must be set or hadoop must be in the path


三、Hive的系统架构


• 用户接口,包括 CLI(Shell命令行),JDBC/ODBC,WebUI


• MetaStore元数据库,通常是存储在关系数据库如 mysql, derby 中


• Driver 包含解释器、编译器、优化器、执行器


• Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算


Hive的表和数据库,对应的其实是HDFS( Hadoop分布式文件系统)的目录/文件,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在MapReduce Job里使用这些数据。


四、hive的元数据库以及数据存储方式


Hive的MetaStore,集中存储元数据的一个库,可以叫它元数据库。


元数据库保存的是不是我们要计算的数据?不是,元数据库中并没有保存我们要计算的数据,我们要计算的数据是存放在HDFS(分布式文件系统)里。


Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等表的描述信息。真正要处理的数据在HDFS里。


元数据通常是存储在关系数据库如 mysql, derby 中。


Metastore默认使用内嵌的derby数据库作为存储引擎


Derby引擎的缺点:不支持多链接,一次只能打开一个会话


使用MySql作为外置存储引擎,支持多用户同时访问,所以一般将MySQL作为Hive的MetaStore。


Hive 的数据存储在 HDFS 中,大部分SQL转换成 MapReduce 任务来完成。(全表扫描,比如 select * from table 不会就生成 MapRedcue 任务)



hive>
create
table
test(id
int
,
name
string) row format delimited fields terminated
by
'/t'
;


hive>
load
data
local
inpath ‘/home/hadoop/test/test.txt’
into
table
test;

五、hive 数据类型


Hive数据类型分为 基础数据类型 和 复杂数据类型 。


基础数据类型包括:


数字 TINYINT,SMALLINT,INT/INTEGER,BIGINT,FLOAT,DOUBLE


字符串:


STRING,CHAR,VARCHAR


日期/时间类型


TIMESTAMP,DATE,INTERVAL(没有datetime)


其他类型



BOOLEAN


复杂类型 包括 ARRAY,MAP,STRUCT,UNION ,这些复杂类型是由基础类型组成的。


arrays: ARRAY<data_type>


maps: MAP<primitive_type, data_type>


structs: STRUCT<col_name : data_type [COMMENT col_comment],...>


union: UNIONTYPE<data_type, data_type,...>


六、hive与依赖环境的交互


与linux交互:

hive> !pwd; #查看路径


hive> !ls; #查看有哪些文件

与hdfs交互:

hive> dfs -ls / ; #查看hdfs下目录


hive> dfs -mkdir /haha;#hdfs下创建目录haha



七、hive表的基本操作

Hive的数据模型-表的分类:


Table 内部表


External Table 外部表


Partition 分区表


Bucket Table


桶表


Hive的数据模型-内部表


与数据库中的 Table 在概念上是类似,每一个 Table 在 Hive ��都有一个相应的目录存储数据。例如,一个表 test,它在 HDFS 中的路径为:/warehouse/test。


warehouse是在 hive-site.xml 中由${hive.metastore.warehouse.dir} 指定的数据仓库目录。


所有的 Table 数据(不包括 External Table)都保存在这个目录中。删除表时,元数据与数据都会被删除(对应目录和文件都会被删除)


创建数据文件inner_table.dat


创建表


hive>
create
table
inner_table (id
int
,
key
string);

加载数据


hive>
load
data
local
inpath
'/var/lib/hadoop-hdfs/test/inner_table.dat'
into
table
inner_table;

查看数据



select
*
from
inner_table


select
count
(*)
from
inner_table (也可以排序)

删除表


drop
table
inner_table

Hive的数据模型- External Table 外部表


指向已经在 HDFS 中存在的数据,可以创建 partition


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


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


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


创建数据文件



/data/student/text.txt
创建外部表:


create
external
table
ext_student(id
int
,


name
string) row format delimited fields terminated
by
'/t'
location
'/data/student'
;

加载数据


load
data inpath
'/home/external_table1.dat'
into
table
ext_student;

查看数据



select
*
from
ext_student;


select
count
(*)
from
ext_student;

删除表


drop
table
ext_student;

Hive的数据模型-分区表


创建分区是为了提高查询效率,在数据量非常大的时候一定要优先考虑分区,


partition 分区对应于数据库的 partition 列的密集索引


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


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


则对应于date=20130201, city = bj 的 HDFS 子目录为:


/
user
/hive/warehouse/test/
date
=20130201/city=beijing

对应于date=20130202, city=sh 的HDFS 子目录为:


/
user
/hive /warehouse/test/
date
=20130202/city=shanghai

创建数据文件


beauty_ch.txtbeauty_uk.txtbeauty_us.txt

创建外部分区表:


create
external
table
beauties(id
bigint
,
name
string,age
double
) partitioned
by
(nation string) row format delimited fields terminated
by
'/t'
location
'/data/beauty'
;

加载数据到分区



load
data
local
inpath


'/var/lib/hadoop-hdfs/test/beauty_ch.txt'
into
table
beauties partition (nation=
'China'
);

修改表分区


alter
table
beauties
add
partition (nation=
'UK'
) location
'/data/beauty/nation=UK'
;

• 查看数据



select
*
from
partition_table


select
count
(*)
from
partition_table

• 删除表


drop
table
partition_table

Hive的数据模型—桶表


桶表是对数据进行哈希取值,然后放到不同文件中存储。数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。


创建表



create
table
bucket_t1(id string) clustered
by
(id)
into
6 buckets;


------表里的数据根据ID分成了6桶

加载数据



create
table
t2(id string);


load
data
local
inpath
'/var/lib/hadoophdfs/test/bucket_test'
into
table
t2;


insert
overwrite
table
bucket_t1
select
id
from
t2;

删除表时,元数据与数据都会被删除(对应目录和文件都会被删除)


drop
table
bucket_table;

桶表专门用于抽样查询,是很专业性的,不是日常用来存储数据的表,需要抽样查询时,才创建和使用桶表。


抽样查询:


select
*
from
bucket_table tablesample(bucket 1
out
of
4
on
id);
八、Hive的JDBC/ODBC接口

用户可以像连接传统关系数据库一样使用JDBC或ODBC连接Hive



JDBC的具体连接过程


1.使用jdbc的方式连接Hive,首先做的事情就是需要启劢hive的Thrift Server,否则连接hive的时候会报connection refused的错误。


启动命令如下:


hive --service hiveserver


2.新建java项目,然后将hive/lib下的所有jar包和hadoop的核心jar包hadoop-0.20.2-core.jar添加到项目的类路径上。Jar包版本要和hive版本一致。



最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台