大数据的重要组件之一(hive)初认识
-
- 数据仓库
- 概念:主要是存储数据 面向分析的额既不会产生数据 也不会消耗数据 惟一的数据是存储数据,数据是从外部而来
- 数据库:为了咱们的增删改从查 主要是为了捕获数据通常使用在业务系统中
- 大数据领域的数据仓库:hive只是数据仓库的一个工具而已
- 数据仓库的特征
- 面向主题: 数据仓库的分析是有必定主题的
- 数据集成性:涉及到的数据都会获取到进行分析
- 非易失性 :不可更新性 数据仓库当中的数据都是历史已经存在的数据
- 时变性:数据仓库的分析的思路会随着时间的发展而变化
- 数据仓库与数据库的区别
- 数据仓库的分层
- ods层 :原始数据层
- Dw 层:数据仓库层
- APP层:数据引用层
- 数据从Ods层到DW层到APP层 数据之间的流动是经过EtL实现的
-

- 数据仓库元数据管理
- 包括表的个数,表的字段,数据加载的时间 数据仓库处理的时间等等
- Hive的基本概念
- 基于Hadoop的数据仓库工具 能够将结构化的数据文件映射为一张数据表 并提供类sql查询功能n
- 意义:在于大幅度下降工程师学习mapreduce的学习成本 让好用的mapreduce更方便使用
- Hive能够作数据存储 能够作数据分析
- Hive的存储依赖于HDFS ,HIve的分析依赖于mapreduce
- 特色
- 可扩展
- 延展性
- 支持用户自定义函数 用户卡可根据本身的需求来实现本身的函数
- 容错
- 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;
- 三种方式的优先级:
- 函数
- 查看系统自带的函数
- 显示自带的函数的用法
- 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)
- 基于语法级别优化
-

- 笛卡尔积
- 分区剪裁
- 在查询语句中,尽可能使用哪些列就读取哪些列 业务须要使用哪些分区的数据 就读取哪些分区 关于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
欢迎关注本站公众号,获取更多信息