mapreduce的升级(hive)

数据仓库
概念:主要是存储数据 面向分析的额既不会产生数据 也不会消耗数据 唯一的数据是存储数据,数据是从外部而来
数据库:为了我们的增删改从查 主要是为了捕获数据一般使用在业务系统中
大数据领域的数据仓库:hive只是数据仓库的一个工具而已
数据仓库的特征
面向主题: 数据仓库的分析是有一定主题的
数据集成性:涉及到的数据都会获取到进行分析
非易失性 :不可更新性 数据仓库当中的数据都是历史已经存在的数据
时变性:数据仓库的分析的思路会随着时间的发展而变化
数据仓库与数据库的区别

数据仓库的分层
ods层 :原始数据层
Dw 层:数据仓库层
APP层:数据引用层
数据从Ods层到DW层到APP层 数据之间的流动是通过EtL实现的

数据仓库元数据管理
包括表的个数,表的字段,数据加载的时间 数据仓库处理的时间等等
Hive的基本概念
基于Hadoop的数据仓库工具 可以将结构化的数据文件映射为一张数据表 并提供类sql查询功能n
意义:在于大幅度降低工程师学习mapreduce的学习成本 让好用的mapreduce更方便使用
Hive可以做数据存储 可以做数据分析
Hive的存储依赖于HDFS ,HIve的分析依赖于mapreduce
特点
可扩展
可以自由的扩展集群的规模一般情况下不需要重启服务
延展性
支持用户自定义函数 用户卡可根据自己的需求来实现自己的函数
容错
良好的容错性节点出现问题sql 仍可完成执行
Hive架构
用户接口
元数据存储 :通常是存储在关系数据库中 Hive的元数据包括表的名字,表的列和分区及其属性 表的属性(是否为外部表等) 表的数据所在的目录等
解释器 编译器 优化器 执行器 完成hql查询语句到mapreduce的的调用执行
Hive与传统数据库的对比
海量数据是前提 离线分析是场景

Hive中没有定义专门的数据格式
Hive 在加载数据的过程中 不需要从用户数据格式到Hive定义的数据格式的转换
Hive在加载的过程中不会对数据本身进行任何修改,甚至不会对数据进行扫描 只是将数据内容复制或移动到相应的HDFS目录中
Hive中不支持对数据的改写和添加
Hive在加载数据的过程中不会对数据的某些key建立索引
Hive的可扩展性和hadoop的扩展性是一致的
Hive的数据存储
Hive所有的数据都存储在Hdfs中没有专门的数据存储格式(支持Text,SequenceFile Parque ,ORc)

Hive的交互方式

Hive的基本操作
Hive的数据库 表 分区在hdfs上都是以文件夹的形式存在
数据库的增删改查
创建数据库
create database if not exits myhive
create database myhive2 location ‘/myhive2’ :创建数据库并制定hdfs存储位置
删除数据库
drop database myhive02 :删除空数据库
drop database myhive casccade :强制删除数据库包括数据库下面的表一起删除 (删除需谨慎)
修改数据库
alter database myhive2 set dbpropertities(‘createtime’=‘2018611’);
查看数据库
show data bases 查看所有的数据库
desc database myhive2 :查看数据库的基本信息
desc databa extended myive2; 查看数据库更多详细信息
数据表的操作
常用的操作语法
create[external] table [if not exisist] table_name [partitioned by (col_name data_type)] [ row farmart row_format][stored as file_format] [location hdfs_path]
创建表(内部表)
没有制定列的分隔符
create table stu(id int,name string);
指定列的分隔符
create table if not exists stu2(id int,name string) row format delimited fields terminated by ‘\t’ stored as textfile location ‘/user/stu2’;
根据查询结果创建表
create table stu3 as select * form stu2
根据已经存在的表结构创建表
create table stu4 like stu2
查看表的信息
desc stu2 desc formatted stu2;
本地(Linux)数据加载到Hive表上
load data local inpath ‘/export/servers/hivedatas/student.csv’overwrite into table student_imp;
加载hdfs上的数据
load data inpath’/export/servers/hivedatas/student.csv’overwrite into table student_imp;
外部表 :在创建表的时候添加关键字子 external
建表语句:
create external table techer(id string name string ) row format delimited fields terminated by ‘\t’;
使用场景:每天将收集到的网站日志定期流入HDFS文本文件
外部表在删除数据的时候 hdfs的数据依然存在 只删除 元数据
分区表
建表的时候添加分区语句 partitioned by(year string , month string ,day string )
数据加载
load data local inpath’ /export/sersvers/hivedatas/score.csv into table score2 partition(year=‘2018’, month=‘06’,day=‘01’);
注:数据在加载的时候 必须清楚的知道这个数据属于哪个分区
查看分区
show partitions tablename;
添加分区
alter table score add partition(month=‘201805’);
删除分区
alter table score drop parttion(month=‘201805’);
注:分区可看做在表中添加的字段 在Hdfs 中是以文件夹的形式存在的
按照业务逻辑或者需求做物理划分 把 大的数据按照进行分成一个个小的文件
建表语句
注: 分区的字段不能在数据表的字段内出现
注:分区都是以文件夹的形式存在的
分桶表
桶 可以作用在hive的表上 也可以作用在HIVE 的分区上
将数据按照指定的字段(必须是表中的字段)进行划分
hive采用对列值哈希 然后除以桶的个数取余 决定放在桶的哪个位置
数据加载
不能使用load data方式加载数据
只能使用 insert overwrite 加载数据
操作步骤
开启分桶功能
set hive.enforce.bucketing=true;
设置reduce数量
set mapreduce.job.reduces=3;
建表
​create table course (c_id string,c_name string,t_id string) clustered by(c_id) into 3 buckets row format delimited fields terminated by ‘\t’;
加载数据
创建普通表 ,并通过insert overwrite 的方式将普通表的数据通过查询的方式加入到 桶表中
insert overwrite table course select*from course_common cluster by(c_id);
常用Hql语句
添加列
alter table score 5 add columns( mycol string,mysco string);
更新列
alter table score5 change colum mysco mysconew int;
直接向分区表中 添加数据
insert into table score3 partition(month=‘06’) values (‘001’,‘002’,‘100’);
通过查询方式加载数据
insert overwrite table score4 partition(month=‘201906’ select s_id ,c_id ,s_core from score;
注:关键字 overwrite必须有
多插入模式:将一张表拆开分成俩部分

查询语句中创建表并加载数据
create table score5 as select* from score;

查询

注:

Hive的参数和函数
对于一般参数 有以下三种设定方式
配制文件
命令行参数
bin/hive -hiveconf hive.root.logger=INFO,console
这一设定对本次启动的Session(对于Server方式启动,则是所有请求的Sessions)有效。
参数声明
set mapred.reduce.tasks=100;
这一设定的作用域也是session的
三种方式的优先级:
参数说明>命令行参数>配置文件参数
函数
查看系统自带的函数
show functions
显示自带的函数的用法
desc function extended upper;
自定义函数
创建自己的类,继承UDF
编写自己的业务代码
将代码导出成为jar文件,将jar文件上传到Hive的安装目录下的lib内
在hive shell窗口他添加jar文件 add jar /export/servers/hive-1.1.0-cdh5.14.0/lib/udf.jar;
创建自定义函数 :create temporary function tolowercase as ‘cn.itcast.udf.ItcastUDF’; (临时的)
create function tolowercase as ‘cn.itcast.udf.ItcastUDF’; (永久的)
UDAF 多进一出
UDTF一进多出
Hive的压缩格式和存储格式
行存储的使用场景
只需要找到其中一个值 其余的值都在相邻地方, 找到一个值时 这个值周边的字段大部分的业务都会使用到
列式存储的使用场景
对少量字段 但是数据条数很多的情况下使用列式存储
数据格式
TextFIle(行存)
sequencefile(行存)
ORC(列存)
Parquet(列存)
总结:
在实际的项目开发当中 hive表的数据存储格式一般选择orc 或parquet 压缩方式一般选择 snappy
Hive的调优
Hive 调优
1 .fetch抓取

默认是more 对于以下三种查询不会转成Mr

若果设置的参数为none时,所有的语句都会转换成mr
本地模式
此方法将Mr程序直接在本地执行,不提交到集群中
本地模式设置

Group BY
开启Map端聚合功能 此功能使用场景需谨慎不能使用在类似平均数的算法上
开启Map端聚合参数

count(distinct)
基于语法级别优化

笛卡尔积
尽量避免无效的on条件或不再使用条件
分区剪裁
在查询语句中,尽量使用哪些列就读取哪些列 业务需要使用哪些分区的数据 就读取哪些分区 关于join的优化尽量将where条件添加在on的后面
尽量优先过滤数据在进行数据的join 尽量避免先join后过滤
动态分区调整
以第一个表的表结构为准,将第一个表的表结构完全复制到第二个表中 第二个表中的数据就不需要指定分区
实现步骤

注意:新表的分区不需要指定值,只需指定列名即可 在原始表查询数据时 分区列必须在最后一列
数据倾斜
影响Map数量的因素 :切片的数量 文件的数量
正在数据分析时尽量合理设置map的数量 若一个大文件 字段较少 数据量较多 此时map数量较少 会导致每个map处理的数据量很多 解决方案是增加map的数量

文件数量很多,但每个文件内的数据量较少 此时会开启很多map 此时map的开销要高于计算时间 数据;量较少 但时间较长 方案:小文件合并
Map数量的多少 应根据实际应用综合考虑
reduce数量的调整

并行执行
Hive将sql转成mr 程序在执行有多个阶段我们可以开启hive的并行执行功能

Hive严格模式

JVM重用
MapReduce任务在运行时会开启大量的J VM默认情况下Jvm使用后会自动释放 新的task需要时需要重新开启JVM jvm频繁开启消耗时间较多
开启jvm重用,一个jvm结束后不释放 新的Task 需要时直接使用 减少了Jvm的开启次数 从而起到了调优的效果(每个Jvm的启动视角为1秒)

推测执行(谨慎使用)

表的优化
新的版本自动优化
补充 : /etc/profile 是核心文件 尽量不要修改在 /etc/profile.d路径下添加一个脚本 将需要添加的配置填写在脚本中 最后 source profile

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值