//启动hive server 2
bin/hiveserver2
//启动beeline
bin/beeline
//链接hive server
!!connect jdbc:hive2://master.hadoop.com:10000 hadoop hadoop org.apache.hive.jdbc.HiveDriver
bin/beeline -u jdbc:hive2://hadoop-senior.ibeifeng.com:10000/default
HiveServer2 JDBC
将分析的结果存储在hive表(result),前段通过DAO代码,进行数据的查询。
Hive中大数据量的存储时通常会做以下几种操作:
1. 数据压缩
数据压缩带来的优势是:实际存储的数据量变小,减少本地磁盘的IO(这是读取数据最耗时的地方),减少数据在集群的网络传输IO。
2. 使用ORC,Parquet等存储格式进行存储。
引进ORC等数据存储格式是因为Hive的索引机制并不完善,所以才需要引入这些自带索引的数据存储格式来进一步优化查询速度。
3. 分区,分桶,排序等,(partition by, clustered by ,sort by )
分区不仅可以解决按不同分区查找数据的性能,而且在一些每天或者定时需要更新的数据仓库中其很好的解决了增量数据插入的问题。分桶和排序主要是为了减少Map Reduce中间的shuffle过程,从而提高性能(这一块,理解可能有误,后续会慢慢补充。)
Hive中的数据文件存储格式常见的就是下面几种,不过推荐大数据量还是用Parquet 或者 ORC。其性能对比,我这里就不赘述了,网上很多人做过实验,相信学过数据库原理的童鞋都能明白其中的原因。
file_format:
| SEQUENCEFILE
| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)
| RCFILE -- (Note: Available in Hive 0.6.0 and later)
| ORC -- (Note: Available in Hive 0.11.0 and later)
| PARQUET -- (Note: Available in Hive 0.13.0 and later)
| AVRO -- (Note: Available in Hive 0.14.0 and later)
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
下面是几个DDL示例:
create table page_views(
track_time string,
string,
session_id string,
referer string,
string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE ;
加载本地数据到表中
load data local inpath '/opt/datas/page_views.data' into table page_views ;
HDFS查看表的空间占用情况
dfs -du -h /user/hive/warehouse/page_views/ ;
18.1 M /user/hive/warehouse/page_views/page_views.data
创建一个表来测试ORC file的使用
create table page_views_orc(
track_time string,
session_id string,
referer string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS orc ;
创建一个表来测试Parquet file的使用
create table page_views_parquet(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS PARQUET ;
带压缩格式的ORC file存储数据
create table page_views_orc_snappy(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS orc tblproperties ("orc.compress"="SNAPPY");
不带压缩的存储方式
create table page_views_orc_none(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS orc tblproperties ("orc.compress"="NONE");
另外一种带压缩的存储的方法
set parquet.compression=SNAPPY ;
create table page_views_parquet_snappy(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS parquet;
================================
Hive 企业中的Join优化(这一块内容比较多,后面再详细补充)
Common/Shuffle/Reduce Join
连接发生的阶段,发生在 Reduce Task
适用情形:大表对大表
每个表的数据都是从文件中读取的
Map Join
连接发生的阶段,发生在 Map Task
使用情形:小表对大表
* 大表的数据放从文件中读取 cid
* 小表的数据放到内存中 id
DistributedCache
SMB Join(Sort-Merge-BUCKET Join)
先排序,再join
Hive 优化——执行计划
查看每个命令在MapReduce中执行的过程
EXPLAIN select * from emp ;
EXPLAIN select deptno,avg(sal) avg_sal from emp group by deptno ;
EXPLAIN EXTENDED select deptno,avg(sal) avg_sal from emp group by deptno ;
====================================================
实践项目思路
* 原表保存原始数据
* 针对不同的业务创建不同的子表
* 数据存储格式orcfile/parquet
* 数据压缩 snappy
* map output 数据压缩 snappy
* 外部表
* 分区表(演示)
这里有一个用正则表达式读取的数据到Hive表中的示例:
drop table if exists default.bf_log_src ;
create table IF NOT EXISTS default.bf_log_src (
remote_addr string,
remote_user string,
http_referer string,
http_user_agent string,
http_x_forwarded_for string,
host string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "(\"[^ ]*\") (\"-|[^ ]*\") (\"[^\]]*\") (\"[^\"]*\") (\"[0-9]*\") (\"[0-9]*\") (-|[^ ]*) (\"[^ ]*\") (\"[^\"]*\") (-|[^ ]*) (\"[^ ]*\")"
)
STORED AS TEXTFILE;
load data local inpath '/opt/datas/moodle.access.log' into table default.bf_log_src ;
定义UDF,对原表数据进行清洗
第一个udf
去除引号
add jar /opt/datas/hiveudf2.jar ;
create temporary function my_removequotes as "com.beifeng.senior.hive.udf.RemoveQuotesUDF" ;
insert overwrite table bf_log select my_removequotes(remote_addr), my_removequotes(http_referer) from default.bf_log_src;