Hive
官网 http://hive.apache.org/
基本概念
数据仓库(历史数据,用于计算分析)
解释器、编译器、优化器等(将sql转换为MR,提交给Hadoop集群)。
hive运行时,元数据(表、库、字段、属性)存储在关系型数据库(在线数据,交互式)里面,数据存储在HDFS里面
架构图
HIVE 搭建模式
local (测试/但不推荐)Derby数据库(自带)
单用户模式 Mysql
多用户/远程服务器模式(MetaStore Server)
单用户模式
安装mysql
yum install mysql-server -y
启动服务
service mysqld start
设置开机启动
chkconfig mysqld on
查看开机启动列表
chkconfig mysql --list
通过mysql命令连接数据库
mysql 连接成功
登录权限控制
show databases;
use mysql;
show tables;
desc user;
select host, user, password from user;
GRANT ALL PRIVILEGES ON \*.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
delete from user where host != '%';
flush privileges;
quit;
mysql -u root -p 123 登录验证
1. 上传安装包
sz - e
2. 解压
tzr - zxvf apache- hive- 2.1 .1 - bin. tar. gz / usr/ local/ software/
3. 配置环境变量
vim / etc/ profile
export HIVE_HOME = / usr/ local/ software/ apache- hive- 2.1 .1
PATH = $HIVE_HOME / bin
: wq
source / etc/ profile
4. 配置文件修改
cp hive- default . xml. template hive- site. xml
vim hive- site. xml
: . , $- 1 d
< property>
< name> hive. metastore. warehouse. dir< / name>
< value> / user/ hive_remote/ warehouse< / value>
< / property>
< property>
< name> hive. metastore. local< / name>
< value> true < / value>
< / property>
< property>
< name> java x. jdo. option. ConnectionURL< / name>
< value> jdbc: mysql: / / node1/ hive< / value>
< / property>
< property>
< name> javax. jdo. option. ConnectionDriverName< / name>
< value> com. mysql. jdbc. Driver< / value>
< / property>
< property>
< name> javax. jdo. option. ConnectionUserName< / name>
< value> username< / value>
< / property>
< property>
< name> javax. jdo. option. ConnectionPassword< / name>
< value> pwd< / value>
< / property>
/ usr/ local/ software/ apache- hive- 2.1 .1 / lib
/ usr/ local/ software/ hadoop- 2.6 .0 / share/ hadoop/ yarn/ lib
hive
多用户模式
1. 分发服务端到其他节点,然后更改配置
< property>
< name> hive. metastore. local< / name>
< value> false < / value>
< / property>
< property>
< name> hive. metastore. warehouse. dir< / name>
< value> / user/ hive_remote/ warehouse< / value>
< / property>
< property>
< name> hive. metastore. uris< / name>
< value> thrift: / / node1: 9083 < / value>
< / property>
2. 启动服务端
hive -- service metasore
后台启动
hive -- service metasore & > hive. log
客户端直接
hive
ss - nal
查看9083
Hive SQL
DDL
官方文档 http://hive.apache.org/
1. DESC TBNAME ;
2. DESC FORMATTED + TBNAME ;
3. SHOW CREATE TABLE + TBNAME ;
4. hive 建表外部指定 Location(EXTERNAL TABLE ), 删除表 ( DROP TABLE + TBNAME ) 只是删除了元数据,但数据并不删除。
5. 分区:PARTITIONED BY ( col_name data_type [ COMMENT col_comment] , ... ) 根据col_name 建不通的子目录进行管理。
- 分区字段不能在建表的字段里面;
- 分区字段太多、粒度太细不易维护;
6. 修改增加分区
ALTER TABLE page_view ADD PARTITION ( dt= '2008-08-08' , country= 'us' ) location '/path/to/us/part080808'
PARTITION ( dt= '2008-08-09' , country= 'us' ) location '/path/to/us/part080809' ;
7. 设置动态分区
set hive. exec. dynamic. partition. mode= nonstrict;
beeline> set hive. exec. dynamic. partition. mode= nonstrict;
beeline> FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view PARTITION ( dt, country)
SELECT pvs. viewTime, pvs. userid, pvs. page_url, pvs. referrer_url, null , null , pvs. ip,
from_unixtimestamp ( pvs. viewTime, 'yyyy-MM-dd' ) ds, pvs. country
DISTRIBUTE BY ds, country;
8. 行转列 可以用case a when 'b' then c end as ...
DML
1. LOAD DATA LOCAL INPATH 'filepath' INTO TABLE tab1 partition ( month= '10' , ... . ) ;
TIPS
1. hive后台运行-- > 并将结果写入到本地文件
> vim hive_shell. sh
`hive [-S] -e "select * from tb_name where col_name = 'x' " > ./localresult`
> sh hive_shell. sh
2. hive后台运行 -- > 并将结果写入到本地文件2
> vim exer. sql
`select * from student where sex = '男';
select count(*) from student;`
> hive - f exer. sql > . / output. txt
3. hive后台运行 -- > 并将结果写入到本地文件3
将结果写入到hdfs 中
- [ - S ] 静默输出
- e exec
- i 执行完进入hive
[ hvie> source ** * . sql 在hive客户端执行linux上的sql文件]
4. explain + sql
5. UDF 开发
- 继承UDF
- 开发程序,打包上传到指定机器
- hive> add jar / usr/ ... / udf. jar
- create tmporary tmp_fun as 'com.***.***'
- hive> select tmp_fun ( col_) from tb_name;
6. 加载数据
insert into 会执行mr操作,慢
load data [ local] inpath '' into table 快,但是会将数据加载 ( 移动) 到同一目录
from tb_name insert into ... 快
7. 创建表 ( 表结构) create table tb_name1 like tb_name;
8. 分区:提高查询效率,将不同的数据文件存放到不同的目录,检索查询时可以查询部分目录
9. select explode ( split ( word, '' ) ) from wc
10. 分桶(适用于抽样)
word count
hive 优化
1. 核心思想: 将Hive Sql 当成MR 程序进行优化
tips:select不会转换成MR 程序执行
where 仅对本表字段做条件过滤
2. Explain [ Extended] + sql 显示执行计划
3. 参数
set hive. exec. local. auto= true ; -- 开启本地计算
set hive. exec. parallel= true ; -- 开启并行计算
set hive. exec. parallel. thread. number= 10 ; -- 并行计算的数量
set hive. mapred. mode= true ; -- 严格模式(生产环境不开启)
hive> hive. mapred. mode= nonstrict
-- 对于分区表,必须添加where 对于分区字段的限制
-- order by 语句必须包含limit 限制输出条数
-- 限制执行笛卡尔积的查询
4. hvie join
join 计算时,将小标放在join的左边
Map join: 在Map端完成jion,
- 1. Sql方式:在Sql语句中添加MapJoin标记(mapjoin hint)
语法:参考文章 [ https: / / www. cnblogs. com/ raymoc/ p/ 5323824. html] ( https: / / www. cnblogs. com/ raymoc/ p/ 5323824. html)
- 2. 开启自动的MapJoin
5. Map- Side聚合:
set hive. map. aggr= true ;
相关参数配置:
hive. groupby. mapaggr. checkinterval;
- map端聚合时处理的数据行数(默认:100000 )
hive. map. aggr. hash. min. reduction;
- 进行聚合的最小比例,(预先对100000 行数据做聚合,如果聚合之后的数据/ 100000 大于0.5 ,则不会聚合)
hive. groupby. skewindata;
- 是否对group by之后的数据倾斜做优化,默认false ;
6. 控制hive中的M & R 的数量
Map数量相关参数
mapred. max. split. size
mapred. max. split. size= 256000000
-- 一个split的最大值,即每个map处理文件的最大值
set mapred. min. split. size. per. node= 1 ;
-- 一个节点上split的最小值
set mapred. min. split. size. per. rack= 1 ;
-- 一个机架上split的最小值
Reduce数量相关参数
mapred. reduce. tasks= - 1 ;
-- 强制指定reduce任务的数量
7. JVM 重用
1 )小文件过多
2 )task过多
通过设置 set mapred. job. reuse. jvm. num. tasks= n (taks的插槽个数) 来设置
缺点:插槽个数设置后,会一直占用资源,知道所有的tasks都执行完即整个job执行完才会释放
-- loading