内容简介:Hive 的底层执行引擎有 :MapReduce,Tez,Spark - Hive on MapReduce - Hive on Tez - Hive on spark压缩:GZIP,LZO,Snappy,Bzip2... 存储:Textfile,SequenceFile,RcFile,ORC,Parquet UDF:自定义函数为什么要使用Hive: 简单,容易上手(提供了类SQL的查询语言HQL) 为超大数据集设计的计算/存储扩展能力(MR计算,HDFS存储) 统一的元数据管理(可与Pretso/Imp
Hive 的底层执行引擎有 :MapReduce,Tez,Spark - Hive on MapReduce - Hive on Tez - Hive on spark
压缩:GZIP,LZO,Snappy,Bzip2... 存储:Textfile,SequenceFile,RcFile,ORC,Parquet UDF:自定义函数
为什么要使用Hive: 简单,容易上手(提供了类 SQL 的查询语言HQL) 为超大数据集设计的计算/存储扩展能力(MR计算,HDFS存储) 统一的元数据管理(可与Pretso/Impala/SparkSQL数据共享)
Hive 的体系结构
1.Hive的元数据
2.HQL 的执行过程
- 解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划(PLAN)的生产,生产的查询计划存储在 HDFS中,并在随后有MapReduce调用执行
3.体系结构
4.Hive 生产环境部署架构
Hive 安装
1.嵌入入模式(元数据保存在自己维护的dirbe数据库)
解压好文件夹后直接进入bin目录执行hive脚本
${HIVE_HOME}/bin/hive
复制代码
2.本地模式或者远程模式(元数据保存在本地或者远程的 mysql 库)
修改hive-site.xml
<!-- jdbc 参数 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/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>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
复制代码
Hive 管理
1.cli模式
# 进入cli
${HIVE_HOME}/bin/hive --service cli
# 1. Hive -S进入静默模式,不会打印MapReduce作业调试信息
# 2. 一般情况下,hive执行SQL都会转换成MapReduce作业进行执行,但是如果是使用select * 则不会转换成mr任务
${HIVE_HOME}/bin/hive -S
# 不进入交互模式
${HIVE_HOME}/bin/hive -e {sql语句}
复制代码
2.web管理界面模式(只能做查询)
-
进入hive的源代码目录的hwi目录
${HIVE_SRC_HOME}/hwi -
将其打包编译
mvn package(需要安装mvn环境) -
将打好的包放入
${HIVE_HOME}/lib/目录下 -
修改 hive_site.xml
<!-- web界面监听的主机地址 -->
<property>
<name>hive.hwi.listen.host</name>
<value>0.0.0.0</value>
<description>This is the host address the Hive Web Interface will listen on</description>
</property>
<!-- web界面监听的端口 -->
<property>
<name>hive.hwi.listen.port</name>
<value>9999</value>
<description>This is the port the Hive Web Interface will listen on</description>
</property>
<!-- war包的位置 -->
<property>
<name>hive.hwi.war.file</name>
<value>${HIVE_HOME}/lib/hive-hwi-<version>.war</value>
<description>This is the WAR file with the jsp content for Hive Web Interface</description>
</property>
复制代码
6.拷贝jdk目录下的tools.jar 到hive的lib下
cp ${JAVA_HOME}/lib/tools.jar ${HIVE_HOME}/lib
复制代码
- 启动web服务
${HIVE_HOME}/bin/hive --service hwi
复制代码
验证:浏览器访问 http://localhost:9999/hwi/
3.远程连接
${HIVE_HOME}/bin/hive --service hiveserver
复制代码
数据类型
1.基本数据类型
hive新版本中,新增了两种字符串类型 varchar和char varchar(20) 最大长度是20 ,可伸缩 char(20) 固定长度20 复制代码
2.复杂数据类型
create table student1 ( sid int , sname string, score array<float> ) create table studetnt2 ( sid int , sname string, score map<string,float> ) create table student3 ( sid int , info struct<name:string,age:int,sex:string> ) 复制代码
3.时间类型
timestamp 与时区无关,是自从有了unix以来的偏移量 date 描述的是特定的日期 YYYY-MM-DD 复制代码
数据模型
1.数据存储
/user/hive/warehouse/
| sid | sname |
|---|---|
| 1 | Tom |
| 2 | Mary |
这张表在文件中默认存储为文件,使用垂直制表符分割
1 Tom 2 Mary 复制代码
- 存储结构主要包括:数据库 文件 表 视图
- 可以直接加载文本文件(.txt等)进行数据添加
- 创建表时,可以指定Hive数据的列分隔符和行分隔符
- 表
· Table 内部表
· Partition 分区表
· External 外部表
· Bucket Table 桶表
复制代码
2.详解表
-
Table 内部表
create table student1
( sid int ,
sname string
)
location '${目录}'
row format delimited fields terminated by '列分隔符'
复制代码
-
分区表
create table partition_table
(
sid int,
sname string
)
partitioned by (gender string)
row format delimited fields terminated by ',';
复制代码
-
外部表
create external table partition_table
(
sid int,
sname string
)
row format delimited fields terminated by ','
location '/input';
-- input 目录中有相关数据
复制代码
-
桶表
create external table partition_table
(
sid int,
sname string
)
clustered by({hash的字段}) into {桶的数量} buckets
-- input 目录中有相关数据
复制代码
3.视图
Hive 的数据导入
1.使用load语句导入
LOAD DATE [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2)] -- [LOCAL] 代表从本地文件系统导入,否则从HDFS中导入 -- [OVERWRITE] 代表覆盖原有的数据 -- [PARTITION] 代表分区 -- 如果filepah是一个文件则导入一个文件的数据,如果是一个目录,则导入该目录下所有的文件 复制代码
2.Sqoop导入
安装步骤
- 下载并解压
- 设置两个环境变量
# hadoop目录 export HADOOP_COMMON_HOME='/Users/gaowenfeng/software/hadoop-2.6.0-cdh5.7.0/' # MP目录 export HADOOP_MAPRED_HOME='/Users/gaowenfeng/software/hadoop-2.6.0-cdh5.7.0/' # HIVE 目录 export HIVE_CONF_HOME='/Users/gaowenfeng/software/hive-1.2.2/' 复制代码
3.使用Sqoop导入Mysql数据到HDFS中
sqoop import --connect {jdbc_url} --username {username} --password {password} --table {table} --columns {col1,col2...} -m {mp进程数} --target-dir {path}
复制代码
4.使用Sqoop导入Mysql数据Hive中
# 如果不指定表名,会在hive找那个创建一张表,表名与源表名一样
sqoop import --hive-import --connect {jdbc_url} --username {username} --password {password} --table {table} --columns '{col1,col2...}' -m {mp进程数} --columns '{col1,col2...}' --table {target_table} --where '{where条件}'
复制代码
5.使用Sqoop导入Mysql数据到Hive中并使用查询
# 如果不指定表名,会在hive找那个创建一张表,表名与源表名一样
sqoop import --hive-import --connect {jdbc_url} --username {username} --password {password} --table {table} --columns '{col1,col2...}' -m {mp进程数} --columns '{col1,col2...}' --table {target_table} --query 'sql语句'
# sql语句必须有 and $CONDITIONS
复制代码
Hive 调优
-- 动态分区,根据插入的记录自动分区 SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; -- 并行执行,子查询可以并行执行 SET hive.exec.parallel=true; -- 计算结束以后将小文件合并 SET hive.merge.mapredfiles=true; -- 如果某个维表小于100000000B(100M),就做MAP关联,不用到reduce阶段 SET hive.mapjoin.smalltable.filesize=100000000; -- 超时时间 SET mapred.task.timeout=1800000; -- 添加自定义jar包 ADD jar viewfs://hadoop-meituan/user/hadoop-hotel/user_upload/gaowenfeng02_hive-udf-zhaoxiang.jar; -- 创建UDF CREATE TEMPORARY FUNCTION get_tag_list as 'com.meituan.hive.udf.common.ResolveTagUdf'; -- map jvm内存设置3G -- SET mapred.map.child.java.opts="-Xmx3072m"; -- map task 的内存 约等于4G -- SET mapreduce.map.memory.mb=4000; -- reduce jvm内存设置3G -- SET mapred.reduce.child.java.opts="-Xmx3072m"; -- reduce task 的内存 约等于4G -- SET mapreduce.reduce.memory.mb=4000; 复制代码
Hive教程:www.yiibai.com/hive/
ETL的优化
hive.exec.reducers.bytes.per.reducer 这个参数控制一个job会有多少个reducer来处理,依据的是输入文件的总大小。默认1GB。(即每个reduce任务处理的数据量。)
hive.exec.reducers.max 这个参数控制最大的reducer的数量, 如果 input / bytes per reduce > max 则会启动这个参数所指定的reduce个数。 这个并不会影响mapre.reduce.tasks参数的设置。默认的max是999。
mapred.reduce.tasks 这个参数如果指定了,hive就不会用它的estimation函数来自动计算reduce的个数,而是用这个参数来启动reducer。默认是-1.
reduce的个数设置其实对执行效率有很大的影响: 1、如果reduce太少: 如果数据量很大,会导致这个reduce异常的慢,从而导致这个任务不能结束,也有可能会OOM 2、如果reduce太多: 产生的小文件太多,合并起来代价太高,namenode的内存占用也会增大。
如果我们不指定mapred.reduce.tasks, hive会自动计算需要多少个reducer。 计算的公式: reduce个数 = InputFileSize / bytes per reducer
mapreduce.map.memory.mb 每个Map Task需要的内存量 mapreduce.reduce.memory.mb 每个Reduce Task需要的内存量
查看任务执行的日志: XT平台生产运维栏目中,调度管理下的执行日志 测试参数:
- -delta 1 -v
测试的表名:ba_hotel_test.topic_log_mt_order_trade_entrance 线上的表名:ba_hotel.topic_log_mt_order_trade_entrance 测试流量:页面流量,模块流量(某个页面之前前的页面流量一定是大于该页面的流量)
任务流程—测试及上线: 测试完再上线,测试包括线下测试和线上测试 提交审核,审核通过后就自动上线了 在XT平台中,该任务下点执行计划,再进行线上测试
map、reduce java代码讲解 ba_hotel.topic_log_mt_order_trade_entrance.mpt_track ba_hotel.topic_log_mt_order_trade_entrance.patch_track ba_hotel.topic_log_mt_order_trade_entrance.mge_track
ba_travel.topic_log_tag_moudle fact_log_tag_pv
优化排查: 1.最后一个map少,时间长 2.reduce一直在99%,发生了数据倾斜 3.job交接时间长,说明碎片多
优化: 1.ETL语句执行问题:问Hadoop小客服 2.子查询,精简数据 3.子查询之间的关联,是否数据倾斜 4.参数调高
测试代码: 线上库: select count(uuid), count(DISTINCT uuid) from ba_hotel.topic_log_mt_order_trade_entrance where datekey='20180422' and partition_entrance_type= 'mpt' limit 10 测试库: select count(uuid), count(DISTINCT uuid) from ba_hotel_test.topic_log_mt_order_trade_entrance where datekey='20180422' and partition_entrance_type= 'mpt'
以上所述就是小编给大家介绍的《Hive 入门》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- TiDB入门(四):从入门到“跑路”
- MyBatis从入门到精通(一):MyBatis入门
- MyBatis从入门到精通(一):MyBatis入门
- Docker入门(一)用hello world入门docker
- 赵童鞋带你入门PHP(六) ThinkPHP框架入门
- 初学者入门 Golang 的学习型项目,go入门项目
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Release It!
Michael T. Nygard / Pragmatic Bookshelf / 2007-03-30 / USD 34.95
“Feature complete” is not the same as “production ready.” Whether it’s in Java, .NET, or Ruby on Rails, getting your application ready to ship is only half the battle. Did you design your system to......一起来看看 《Release It!》 这本书的介绍吧!