《离线和实时大数据开发实战》_Hive原理实践_读书笔记

Hive原理实践

  • Hive让数据的直接使用人员都能使用Hadoop的大数据处理能力,即使不会java编程

1、离线大数据处理的主要技术:Hive

1.2、Hive出现背景
  • Hive是Facebook开发并贡献给Hadoop开源社区的;
  • Hive是建立在Hadoop体系架构上的一层SQL抽象;
  • Hive SQL是翻译为MapReduce任务后再Hadoop集群执行的,而Hadoop是一个批处理系统,所以Hive SQL是高延迟的,
  • Hive不能提供数据排序和查询缓存功能,也不提供在线事务处理,更不能提供实时的查询和记录级的更新,但他能更好地处理不变的大规模数据集,
1.3、Hive基本架构
  • 主要组件包括UI组件,Driver组件,Metastore组件,CLI,JDBC/ODBC,Thrift Server和Hive Web Interface(HWI)等;
    • Driver组件: 核心组件,包括Complier(编译器),Optimizer(优化器)和Executor(执行器);
    • Metastore组件:运输局服务组件,这个组件存储Hive的元数据;Hive的元数据存储在关系数据库里,Hive支持MySQL;默认情况下,Hive元数据保存在内嵌的Derby数据库中;实际生产环境中,mysql更适合
    • CLI:命令行接口;
    • Thrift Server:提供JDBC和ODBC接入的能力,用来进行可扩展且跨语言的服务开发;
    • Hive Web Interface(HWI):Hive客户端提供了一种通过网页方式访问Hive所提供的服务;

[外链图片转存失败(img-L0XARUDS-1566993315493)(.\assets\1561557097673.png)]

[外链图片转存失败(img-khAH5bKB-1566993315494)(assets/1566963632873.png)]

2、Hive SQL

  • Hive SQL和MySQL的SQL方言最为接近,但两者之间也有差异,比如Hive不支持行级数据插入(有insert 但不适合使用),更新和删除,也不支持事务等;
2.1、Hive关键概念
  • Hive数据库:Hive中的数据库从本质上来说仅仅是一个目录或者命名空间;但是它可以避免表名冲突,等同于关系型数据库中的数据库概念;

  • Hive表:每一个表在hive中都有一个对应的目录存储数据,如果没有指定表的数据库,那么hive会通过{HIVE_HOME}/conf/hive-site.xml配置文件中的hive.metastore.warehouse.dir属性来使用默认值(一般是/user/hive/warehouse),所有的table数据都保存在这个目录中;

    • 内部表(managed table):即hive管理的表,数据将真实存在于表所在的目录中,删除内部表时,物理数据和文件也一并删除;

      create table my_managed_table(coll STRING);
      LOAD DATA INPATH '/user/root/test_data.txt' INTO TABLE my_managed_table;
      --删除表
      DROP TABLE my_managed_table;
      
    • 外部表(external table):新建表仅仅是指向一个外部目录而已,真实数据在外部,删除时,只是删除了引用和定义

      CREATE EXTERNAL TABLE external_table(dummy STRING)
      LOCATIOIN '/user/root/external_table';
      LOAD DATA INPATH '/user/root/data.txt' INTO TABLE external_table;
      --指定external关键字后,hive不会将数据移动到warehouse目录中;事实上,Hive甚至不会校验外部表的目录是否存在;这使的我们可以在创建表之后再创建数据
      
    • 常见的模式是使用外部表访问存储的 HDFS (通常由其他工具创建)中的初始数据,然后使用 Hive 转换数据并将其结果放在内部表中;

    • 使用外部表的另一种场景是针对一个数据集,关联多个 Schema;schema(发音 “skee-muh” 或者“skee-mah”,中文叫模式)是数据库的组织和结构,schemas andschemata都可以作为复数形式。模式中包含了schema对象,可以是(table)、(column)、数据类型(data type)、视图(view)、存储过程(stored procedures)、关系(relationships)、主键(primary key)、**外键(**foreign key)等。数据库模式可以用一个可视化的图来表示,它显示了数据库对象及其相互之间的关系;MySQL的文档中指出,在物理上,模式与数据库是同义的,所以,模式和数据库是一回事

  • 分区和桶

    • 分区(partition):

      -- 创建表时要用partitioned by定义
      create table logs (ts bigint, line string) partitioned by (dt stirng, country string);
      --当导入数据到分区表时,分区的值被显示指定:
      load data inpath '/user/root/path' into table logs partition (dt='2001-01-01',country='gb');--通过日期划分后,还可以通过国家分)
      --如下代码仅会扫描2001-01-01目录下的GB目录
      select ts, dt ,line from logs where dt = '2001-01-01' and country='GB';
      

在这里插入图片描述

  • 分桶(bucket):

    --clustered by指定;根据id进行分桶,并且分为4个桶
    create table bucketed_users(id int, name string)
    clustered by (id) into 4 buckets;
    --分桶时,hive根据字段哈希后取余数来决定数据应该放在哪个桶,因此每个桶都是整体数据的随机抽样
    --设置hive.enforce.bucketing属性为true可以把分桶的工作交给hive完成,如果是在hive执行命令,先开启分桶和设定reduce个数;否则无效
    set hive.enforce.bucketing=true;
    set mapreduce.job.reduces=3;
    
    --分桶加载数据,用insert overwrite;像load data只会有一个文件,数据就不符合分桶的意义了
    insert overwrite table bucketed_users select * from course_common cluster by(c_id)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值