大数据的重要组件之一(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
相关文章
相关标签/搜索