大数据的重要组件之一(hive)初认识

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

        • 数据仓库的分层
          • ods层 :原始数据层
          • Dw 层:数据仓库层
          • APP层:数据引用层
        • 数据从Ods层到DW层到APP层 数据之间的流动是通过EtL实现的
          • 2f25ee02-6fbb-4442-ac5f-f8defbe79242-3250872.jpg

        • b6c5acff-4034-4320-b686-d3a2774078ca-3250872.jpg

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

        ec49b3bf-d391-4852-a466-22ac668866f2-3250872.jpg

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

        f3364f12-33c1-4363-ac04-37e106647d9f-3250872.jpg

    • Hive的交互方式
      • 31cbd1c7-8770-4034-afc3-2295d1a5a147-3250872.jpg

  •  
  • 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必须有
        • 多插入模式:将一张表拆开分成俩部分
          • 271e8c59-be94-4451-9038-26ffbae7eaef-3250872.jpg

        • 查询语句中创建表并加载数据
          • create table score5 as select* from score;
        • fad43a1a-af8d-4fa9-aeb7-4e975b20df7e-3250872.jpg

        • 查询
          • 890daeb5-c59a-4a34-aaed-0b83e1d5bc5c-3250872.jpg

          • 注:
            • 18363d0c-3bc0-40d1-9eab-28e7555fca08-3250872.jpg

  • 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抓取
        • fa82b156-ae76-4c34-9bf9-c413dc5d6688-3250872.jpg

        • 默认是more 对于以下三种查询不会转成Mr
        • a4ced936-a865-429b-bf4a-1077cc52ac1a-3250872.jpg

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

          f37fb544-7dd4-451f-8b20-2c927b81ae41-3250872.jpg

        • 41c8b98e-d7e2-4fb9-a82f-b252f7c05002-3250872.jpg

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

            1156ff1c-ca1f-4487-9a6f-294f547b29eb-3250872.jpg

      • count(distinct)
        • 基于语法级别优化
        • ddac859b-2fbd-4ee8-9122-12a7ecf410ec-3250872.jpg

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

            db25e10a-aba5-4098-9489-a80adcf7427d-3250872.jpg

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

          f0f76fcd-be5d-40fa-8186-338e420a4fc6-3250872.jpg

        • 文件数量很多,但每个文件内的数据量较少 此时会开启很多map 此时map的开销要高于计算时间 数据;量较少 但时间较长 方案:小文件合并
        • Map数量的多少 应根据实际应用综合考虑
      • reduce数量的调整
        • 1ccd818c-9d1c-4099-8a7a-02ace56d9a8c-3250872.jpg

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

          b5e69808-b76d-4462-898e-5abc92176e6b-3250872.jpg

      • Hive严格模式
        • e6dd50a4-0f0b-4703-9532-fbc8ad4ef866-3250872.jpg

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

      • 推测执行(谨慎使用)
        • a24fd721-aa4c-439a-89e2-450dd1f591f8-3250872.jpg

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

转载于:https://my.oschina.net/u/4140673/blog/3081581

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值