一:Hive基本介绍
Hive是建立在Hadoop上的数据仓库基础构架,它提供了一系列工具可以用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模的数据机制。
使用语言:QL语言(类SQL查询语言)。能处理内建的mapper和reducer无法完成的复杂分析工作。
1.Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后再Hadoop执行。
2.Hive的表其实是HDFS的目录(/文件夹),按表名把文件夹区分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据。
二:Hive的系统架构
1.用户接口主要有三个:CLI,JdbC/ODBC,WebUI
(1)CLI,即shell命令行。
(2)JDBC/ODBC,是Hive的Java接口,与使用传统数据库JDBC方式类似。
(3)WebUI,是通过浏览访问Hive。
2.Hive将元数据存储在数据库(metastore)中,目前只支持MySQL,derby。(Hive中的元数据包括表名,表列,和分区及其属性,表属性,表的数据所在目录等)
3.解析器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成。生成的查询计划存储在HDFS中,,并在随后有MapReducer调用执行。
4.Hive的数据存储在HDFS中,大部分的查询由MapReducer完成(包括含*的查询,比如select * from table不会生成MapReducer任务)。
三:Hive的安装
Hive只需在集群中的一个节点安装,Hive的默认是将元数据以derby的方式存储(在哪个目录下运行Hive,就在哪个目录下生成metastore_db数据库保存元数据,不利于多台client操作Hive)。
so:先安装MySQL数据库
1.rpm -ivh Mysql-Server.rpm
2.rpm -qa | grep mysql //过滤出MySQL包
3.rpm -e mysql-lib… –nodeps //强行删除上一布中过滤出的MySQL包
4.运行/usr/bin/mysql_secure_installation //配置登陆用户名&密码
5.mysql –uroot -p123 //进入MySQL….按照成功
//把MySQL作为Hive的metastore
//下面即配置Hive
1.删除hdfs上的Hive目录
hadoop fs -rmr /user/hive
2.修改conf配置文件
添加如下内容:<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://centos:3308/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> 3.安装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;
四:Hive语法
1.查看表(数据库)
show tables(database);
2.创建表(列之间以’\t’做分隔符)
create table student(id bigint,name string) row format delimited fields terminated by ‘\t’;
3.上传数据
load data local inpath ‘/usr/local/xx.txt’ into table student;
4.创建一张外部表
create external table ext_student (id int,name string) row format delimited fields terminated by ‘\t’ location ‘/data’;
5.创建分区表
create external table people (id int, name string) partitioned by (nation string) row format delimited fields terminated by ‘\t’ location ‘/people’;
6.分区表添加数据(指定分区)
load data local inpath ‘/usr/local/xx.txt’ into table people partition(nation=’China’);
7.暴力方式:
手动在HDFS中创建一个分区的文件夹,往里面添加数据。
问题:select查询不到语句
原因:手动方式是元数据没有在数据库中记录。
解决:暴力方式往数据库中添加分区信息
在Hive中运行:
alter table people add partition(nation="Japan") location ‘/people/nation=Japan’;
8.分区查询
select * from people where nation="China";
9.使用sqoop工具将MySQL中的表数据远程导入HDFS下的Hive目录中
竞争颇似打网球,与球艺胜过你的对手比赛,