1.hive简介
1)hive是建立在hadoop之上的数据仓库基础架构,它提供了一系列的工具,可以用来进行数据提取转化加载(ETL)
,这是一种可以存储、查询、和分析存储在hadoop中的大规模数据的机制,hive定义了简单那的类sql查询语言,
成为QL,他允许熟悉SQL的用户查询数据。同时,这个语言也允许使用MapReduce开发者的开发者自定义的mapper和
reducer来处理内建的mapper和reducer无法完成的复杂的分析工作
2)hive是SQL的解析引擎,它将SQL语句转译成M/R 的job,然后在hadoop上执行
3)hive的表其实就是hdfs的目录、文件,按表明把文件夹分开。如果是分区表,则分区值是子文件夹,
可以直接在M/R job里使用这些数据。
2.hive的系统架构:
解释:
1)用户接口:CLI,JDBC/ODBC和WebUI
CLI,即shell命令
JDBC/ODBC是hive的java,与使用传统数据库jdbc的方式类似
WebGUI是通过浏览器访问hive
2)hive将元数据存储在数据库中(metastore),目前只支持mysql,derby。hive中的元数据宝库表的名字,表的列和
分区及其属性,表的属性(是否是外部表),表的数据所在的目录等。
3)解释器,编译器,有乎其完成HQL查询语句从词法分析,语法分析,编译,优化以及查询计划的生成,生成的查询计划存储在hdfs
中,并在随后有mapreduce调用执行
4)hive的数据存储在hdfs中,大部分的查询由mapreduce完成含*的查询,比如select * from table 不会生成mapreduce任务
3.hive配置与安装
Hive只在一个节点上安装即可
1).上传tar包
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>
</property>
<property>
</property>
<property>
</property>
<property>
</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的输入格式
4.hive的数据模型:
hive的数据时存储在hadoop的hdfs之中的,没有专门的数据格式,存储结构有数据库,文件,表,视图
创建表时,指定hive数据的列分割符与行分隔符,hive即可解析数据
1)内部表:
与数据库中的table在概念上是类似的,每一个table在hive中都有一个相应的目录存数数据。
创建表:
create table inner_table(id int);
创建的表默认与hdfs中的
/user/hive/warehouse/inner_table 路径相对应
加载数据
load data local inpath '/root/inner_table.dat' into table inner_table;
如果是加载本地文件需要指定 local
查询数据
select * from inner_table ; //没有执行mr
select count(*) from inner_table; //执行mr
2)分区表:
partition对应于数据库中的partition列的密集索引,在hive中,表中的一个partion对应于表下的一个目录,
所有的partition的数据都存储在对应的目录中
创建分区表:
create table beautities(id int,name string,height int) partitioned by (nation string) row format delimited fields terminated by '\t'
对应的hdfs的文件目录是:
/user/hive/warehouse/beauties
加载数据到分区
load data local inpath '/home/b.c' into table beauties partition(nation='china')
对应的hdfs的文件目录是:/user/hive/warehouse/beauties/nation=china
文件b.c的内容是是:
1
zhangwenyan 170
2 yuzihan 165
3 wenwenjing 167
查看文件
select * from beauties where nation='china'
创建文件b.j
1
xiaoze
170
2 cangjinkong 165
上传到hdfs的目录下
hdfs dfs -put /home/b.j /
user/hive/warehouse/beauties/nation=japan/
在执行select * from beauties ;
发现没有有关japan的数据,是因为hive的描述信息中并没有将这个文件夹目录作为beauties的分区
执行
alter table beauties add partition(nation='japan') localtion '
/
user/hive/warehouse/beauties/nation=japan/
'
在执行select * from beauties 就有数据了
将查询出来的数据保存到表中
create table result row format delimited fields terminated by '\t' as select nation, avg(height) as ag from beauties
group
by nation order by ag;
3)外部表:
指向已经在HDFS中存在的数据,可以创建partition。
它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。
内部表的数据过程和数据加载过程在同一个语句中完成,在数据加载的过程中,实际数据源会被移动到数据
仓库目录中;之后对数据的访问会直接在数据仓库的目录中完成。删除表时,表中的数据和元数据将会同时被删除。
外部表只有一个过程,加载数据和创建表同时完成,并不会移动数据到数据仓库中,只是与外部数据建立一个连接
。当删除一个外部表是,仅删除该连接。
创建表:(先有数据后有表)
hive>create external table external_table1 (key string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
location '/home/external';
在HDFS创建目录/home/external
#hadoop fs -put /home/external_table.dat /home/external