作者:2551529836
Hive
** Facebook开源
** 官网:hive.apache.org
** Hive是基于Hadoop的一个数据仓库工具
Hive与数据库:
数据库: mysql、oracle、DB2、sqlserver
数据仓库 !== 数据库 换言之, Hive不是数据库
为什么要选择hive
** MapReduce编程成本高
** 针对传统的DBA,不会不熟悉java,要想数据分析,借助Hive
Hive简介:
** 流程
** hql --> Hive(java) --> mapreduce -->yarn --> hdfs
** 本质: 将HQL转化成MapReduce程序
** 使用MapReduce计算模型,运行在yarn平台之上
** Hive适合离线批量处理,延时比较大
** 不适合在线业务实时分析结果,业务要求延时较低的场景不适合
Hive体系结构
** 用户接口: Client
** 终端命令行CLI --主要的一种使用方式
** JDBC方式 --几乎不用
** 元数据:metastore
** 默认apache使用的是derby数据库(只能有一个客户端使用),CDH使用postgreDB
** 企业通常我们会选择另外一种mysql来存储
** 元数据包括:表名、表所属的数据库(默认是default)、
表的拥有者、列/分区字段、表的类型(是否是外部表)、
表的数据所在目录等
** 这里并没有存储Hive表的真实数据
** Hadoop
** 使用HDFS进行存储
** 使用MapReduce进行计算
** 驱动器: Driver
** 解析器: 解析Hql语句
** 编译器: 把sql语句翻译成MapReduce程序
** 优化器: 优化sql语句
** 执行器: 在yarn平台运行MapReduce程序
====Hive安装======================================================
** 版本 0.13.1(和后面使用到的框架兼容性好)
1、安装JDK
$ java -version
2、安装Hadoop
** 确保Hadoop可以正常使用(测试:上传文件、或者运行jar)
$ hdfs dfs -mkdir /input2 #在HDFS上创建文件夹,没有类似-cd进入目录的参数
$ hdfs dfs -mkdir -p /aaa/bbb/ccc #级联创建目录
$ hdfs dfs -ls / #查看
$ hdfs dfs -put b.txt /input #把本地文件拷到HDFS
$ hdfs dfs -cat /input2/b.txt #查看文件
$ hdfs dfs -rm /input2/b.txt #删除文件
$ hdfs dfs -rmr /input? #递归删除文件夹和里面的文件,推荐使用'-rm -r'格式;单字符通配符'?'
$ hdfs dfs -help
3、安装mysql
$ su -
# yum -y install mysql --安装mysql客户端、常用命令
# yum -y install mysql-server --mysql服务
# yum -y install mysql-devel --mysql develop扩展包
***以上可以合并为一句,-y表示所有提问回答都为yes
# yum -y install mysql mysql-server mysql-devel
# rpm -qa|grep mysql --查看安装的mysql
# rpm -ql mysql-server-5.1.73-7.el6.x86_64 --查看安装位置
# rpm -e --nodeps mysql-server-5.1.73-7.el6.x86_64 --卸载,nodeps:不检查依赖
# service mysqld start --启动mysql服务
# chkconfig mysqld on --设置开机启动
# /usr/bin/mysqladmin -uroot password 'root' --初始化密码,只能执行一次
给用户授权:
# mysql -uroot -proot
*** grant 权限 on 数据库对象(数据库.表) to 用户
mysql> grant all on *.* to root@'blue01.mydomain' identified by 'root';
mysql> flush privileges; #刷新授权表,可以不执行
mysql> set password for root@localhost = password('root'); --修改密码
mysql> show databases;
** mysql数据库默认只允许root用户通过localhost(127.0.0.1)来登录使用
** 想要使用Windows上的Navicat登录,需要授权
** mysql> grant all on *.* to root@'192.168.122.1' identified by 'root';
附:yum命令和rpm命令安装的都是rpm包
yum安装包的来源: 来自互联网(由仓库配置文件指定)
rpm安装包的来源: 先提取现在需要安装的软件包
----------------------
4、安装Hive
# su - tom
$ tar zxf /opt/softwares/apache-hive-0.13.1-bin.tar.gz
** 在conf/目录:
$ cp -a hive-env.sh.template hive-env.sh --重命名,-a连同原来属性一起复制
$ cp -a hive-default.xml.template hive-site.xml
5、修改hive-env.sh
JAVA_HOME=/opt/modules/jdk1.7.0_67
HADOOP_HOME=/opt/modules/hadoop-2.5.0
export HIVE_CONF_DIR=/opt/modules/apache-hive-0.13.1-bin/conf
6、配置hive-site.xml,注意:用户名和密码不可以有空格
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://blue01.mydomain:3306/metastore?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、拷贝mysql驱动到lib/
** 若是jar已解压,则不必执行这步:$ tar zxf mysql-connector-java-5.1.27.tar.gz
$ cp mysql-connector-java-5.1.27-bin.jar /opt/modules/apache-hive-0.13.1-bin/lib/
8、进入Hadoop目录,修改目录权限
** /tmp存放临时文件
$ bin/hadoop fs -chmod g+w /tmp #给用户组加上写的权限
** /user/hive/warehouse为Hive存放数据的目录
$ bin/hdfs dfs -mkdir -p /user/hive/warehouse
$ bin/hadoop fs -chmod g+w /user/hive/warehouse
9、启动客户端使用Hive
$ bin/hive --用法几乎跟mysql一样
hive> show databases;
====基本操作==========================================
基本操作语句:
hive> show databases;
hive> create database mydb;
hive> use mydb;
hive> show tables;
--创建表
create table customer(
id int,
username string
)row format delimited fields terminated by ' ';
hive> desc customer;
hive> desc formatted customer; --详细信息
--向表插入数据
[tom@blue01 ~]$ vi b.txt
1001 aaa
1002 bbb
hive> load data local inpath '/home/tom/b.txt' into table customer;
--查看数据
hive> select * from customer;
Hive与Hadoop的关系、mysql的关系:
** Hive数据存储在HDFS的/user/hive/warehouse目录
** 由hive-site.xml里hive.metastore.warehouse.dir属性指定
** 创建数据库(create database)
** 默认会到仓库目录下面去创建一个同名的目录,
** 这个目录用来保存该数据库所有的表数据
** 创建表
** 在数据库目录下面生成一个同名的目录,用来保存该表的所有数据
** 载入数据
** load data(0.14版本之前没有insert)
** 文件上传到:/user/hive/warehouse/mydb.db/customer/b.txt
总结: Hive数据就是把文件存在HDFS上,然后做了表和文件之间的映射
Hive的数据并没有存入mysql,mysql只是存放元数据
----日志----------------------
定义Hive的日志信息
** 重命名配置文件
$ cp hive-log4j.properties.template hive-log4j.properties
$ mkdir logs --用来存放日志
** 修改hive-log4j.properties,指定日志文件生成的位置
hive.log.dir=/opt/modules/apache-hive-0.13.1-bin/logs
重启Hive
# 动态监视日志文件,hive里执行任何操作,日志都会有显示
# 此时可以打开一个hive窗口,随意执行些操作,观察效果
$ tail -f hive.log
-------------------------------
** 修改hive-site.xml(重启)
# 显示列名
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
# 显示数据库名
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
====杂项操作============================================
Hive里面两个重要的参数:
# -e 一次性执行hive语句
$ bin/hive -e "select * from mydb.customer"
$ bin/hive -e "select * from mydb.customer" > a.txt --结果导入到文件
# 在Hive里执行简单的Linux命令(并非所有的命令都可以在Hive里执行)
> !pwd;
> !ls;
# -f 执行hql脚本文件
$ vi a.hql --创建hql脚本
select * from mydb.customer;
$ hive -f a.hql --linux命令行
hive> source a.hql; --hive命令行
# dfs命令
hive> dfs -ls /;
hive> dfs -mkdir /aaa;
hive> dfs -rmr /aaa;
Hive中set命令:
hive > set; --显示hive属性
hive > set -v; --更多的属性,包括hadoop、mapreduce、yarn属性
hive > set hive.cli.print.current.db; --显示单个属性
hive > set hive.cli.print.current.db=true; --设置,set命令设置的值是临时生效
# 假如记不清某个属性,可以使用如下技巧来查找
$ hive -e "set"|grep print;
$ hive -e "set -v"|grep print;
Hive中历史命令的存放位置
~/.hivehistory --'~'是指/home/tom目录
$ cat .hivehistory
Hive调试参数
** 将日志输出级别降低为DEBUG,通常在调试错误时,会加这个参数
** 日志级别为5级:DEBUG、INFO、WARN、ERROR、FATAL
$ hive --hiveconf hive.root.logger=DEBUG,console
hive > select * from mydb.customer; --不走MapReduce,速度快
hive > select username from mydb.customer; --走MapReduce,慢
hive的其他语句:
hive > show functions; --函数,如:count、sum...
hive > truncate 表名;
====Hive表常用操作==========================================
***Hive官网:wiki--User Documentation(DDL)
Hive创建数据库
hive (mydb)> create database 数据库名称 ;
hive (mydb)> drop database 数据库名称 ;
Hive创建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type ...)]
[PARTITIONED BY (col_name data_type , ...)]
[ROW FORMAT row_format]
[LOCATION hdfs_path]
[AS select_statement];
create table aaa(
a int,
b string
)row format delimited fields terminated by ' ';
Hive中常见数据类型:
tinyint smallint int bigint
float double
boolean
string
......
加载数据
load data local inpath '文件路径' [overwrite] into table 数据库名.表名 ;
** local 表示加载本地文件,若inpath后面跟随一个目录,那么会将该目录下的所有文件copy过去
** 去掉local表示hdfs,注意:此时使用load data,进行的将是move操作
** 文件加载模式
** append 追加,默认的,可以省略,
** overwrite 覆盖
** load data加载只是把文件从本地简单地复制到hdfs上,我们可以通过hdfs增加、删除对应表格目录里面的文件,
这样做,会影响到表格里的数,可见hive和hdfs是松散关系
** 加载数据时,hive不会去判断字段分隔符是否正确,只有在查询数据时,才会发现是否有错
hive> load data local inpath '/home/tom/b.txt' into table aaa;
***若是再次执行load data,新的文件中的数据将会追加到hive表的末尾
--创建表
create table dept(
deptno int, --部门编号
dname string, --部门名称
loc string --地点
)row format delimited fields terminated by ' ';
create table emp(
empno int, --雇员号
ename string,
job string, --职位
mgr int, --上司
hiredate string,
sal double, --薪水
comm double, --奖金(注意:有人没有奖金)
deptno int
)row format delimited fields terminated by ' ';
--导入数据
hive > load data local inpath 'dept.txt' into table dept;
hive > load data local inpath 'emp.txt' into table emp;
Hive创建表注意事项
** 一般都是先有数据文件,再去用Hive把它映射成一张对应的表
** 创建表时,字段要根据原文件内容而定
** 指定表的列分隔符时,必须要和原文件字段分隔符一致,否则Hive识别不到数据
终止job任务:
***执行 select deptno,dname from dept; 语句时,将会运行mapreduce任务,可以在8088端口查看
***若是任务运行过程中卡住了,可以执行"hadoop job -kill 任务名"来终止任务,如:
***hadoop job -kill job_1479691925666_0003
***执行语句时,日志中有提示:Kill Command = /opt/modules/hadoop-2.5.0/bin/hadoop job -kill job_1479691925666_0003
====管理表、外部表=================================
Hive中表类型:
** 管理表(内部表)
** MANAGED_TABLE --可以通过desc formatted emp查看
** 删除表,会连同HDFS上面的数据文件一起删除
** 外部表
** EXTERNAL_TABLE
** 删除表,不会连同HDFS上面的数据文件一起删除
** 通常有多个业务接入同一个文件(同一个数据源)时,会创建外部表
业务1 业务2 业务3
table1 table2 table3
同一个文件(HDFS)
** 外部表在创建的时候,数据源一般就已经存在了
--创建管理表
create table emp_inner(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)row format delimited fields terminated by ' ';
--创建外部表
create external table emp_ext(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)row format delimited fields terminated by ' ';
load data local inpath 'emp.txt' into table emp_inner;
load data local inpath 'emp.txt' into table emp_ext;
***基于相同数据,创建其他外部表
create external table emp_ext1(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
row format delimited fields terminated by ' '
--关联对应目录
location "/user/hive/warehouse/mydb.db/emp_ext";
hive > select * from emp_ext1;
**同理可创建emp_ext2
create external table emp_ext2(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
row format delimited fields terminated by ' '
location "/apps/app1" ;
hive > select * from emp_ext2 ;
测试:
**删除表emp_ext2,观察数据文件是否被删除,emp_ext1表的数据是否可以查询
hive > drop table emp_ext2;
hive > select * from emp_ext1;
** 外部表
a) 共享数据
b) 删除表时不删除对应数据
附:
** Hive0.14版本前,没有insert、update、delete,没有事务