-
- 数据仓库
- 概念:主要是存储数据 面向分析的额既不会产生数据 也不会消耗数据 唯一的数据是存储数据,数据是从外部而来
- 数据库:为了我们的增删改从查 主要是为了捕获数据一般使用在业务系统中
- 大数据领域的数据仓库: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);
- 创建普通表 ,并通过insert overwrite 的方式将普通表的数据通过查询的方式加入到 桶表中
- 开启分桶功能
- 常用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的
- set mapred.reduce.tasks=100;
- 三种方式的优先级:
- 参数说明>命令行参数>配置文件参数
- 函数
- 查看系统自带的函数
- 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端聚合参数
- 开启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秒)
- 推测执行(谨慎使用)
- 表的优化
- 新的版本自动优化
- 1 .fetch抓取
- Hive 调优
- 补充 : /etc/profile 是核心文件 尽量不要修改在 /etc/profile.d路径下添加一个脚本 将需要添加的配置填写在脚本中 最后 source profile
转载于:https://my.oschina.net/u/4140673/blog/3081581