百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

细品入门Hive(hive详解)

wxin55 2024-11-06 12:44 14 浏览 0 评论

#2021加油带头人#HIVE是构建在Hadoop上的数据仓库平台,设计目标是使Hadoop上的数据操作与传统SQL结合,便于熟悉SQL的开发人员转向Hadoop平台,简化编写MapReduce。hive是批处理系统,任务是高延迟性的。Hive的处理集非常小,比如几百兆,在执行时也会出现延迟现象。


Hive与HBASE的区别:

Hive本身不存储和计算数据,完全依赖HDFS和MapReduce,hive中的表是纯逻辑表。

HBASE是一个分布式的、面向列的开源数据库,适合非结构化数据存储的数据库。HBASE通过组织起节点内所有机器的内存,提供一个超大的内存hash表。HBASE需要组织自己的数据结构,包括磁盘和内存,而hive是不做这些的。表在HBASE是物理表。HBASE主要用于需要随机访问、实时读取的大数据。

Hive与关系型数据库的关系:



hive体系结构:


1、用户接口:UI用户提交查询和其他操作,包括命令接口、web UI、JDBC客户端、ODBC客户端。最常用的是CLI,CLI启动时,会同时启动一个hive副本。Client是hive的客户端,用户连接至hive server,在启动client模式时,需要指出hive server所在的节点,并且在该节点启动hive server。

2、Thrift服务器:当hive以服务模式运行时,可以作为Thrift服务器供客户连接。

3、元数据存储:存储数据仓库中所有表的结构化信息,包括列与列类型的信息,序列化器与反序列化器,从而能够读写HDFS中的数据,通常是存储在关系型数据库中如MySQL、Derby。

4、解析器:完成HQL查询语句,词法分析、语法分析、编译优化、查询计划的生成,生成的查询计划存储在HDFS中,并在随后的MapReduce中调用并执行。

5、Hadoop:hive的数据存储在HDFS中,并且利用Hadoop的MapReduce进行计算。

hive有三种连接模式:单用户模式(single user mode),多用户模式(multi user mode)、远程服务模式(remote server mode)。其中单用户和多用户模式属于本地存储,远程服务模式属于远端存储。

单用户模式:默认安装hive时,是使用Derby存储元数据。该模式只连接到一个内存数据库Derby中,一般用于单元测试。使用Derby存储时运行hive,会在当前目录中生成一个Derby文件和一个metastore_db目录。这种存储方式的弊端,是在同一个目录下同时只能有一个客户端使用数据库。



多用户模式:通过网络连接到一个数据库中。


远程服务器模式:主要用于非Java客户端访问元数据库,在服务器端启动MetaStore Server,客户端利用Thrift协议,通过MetaStore Server访问元数据库。该模式服务器配置与多用户模式基本一致。



Hive主要包括四种数据模型:表、分区、桶(bucket)、外部表(external table)。



数据库下是表,表中包含分区、桶、倾斜数据、正常数据,分区下也可以创建桶。

1、表:比如表tab1,HDFS路径: /datawarehouse/tab1 ,其中/datawarehouse 是配置文件hive-site.xml中${hive.metastore.warehouse.dir}指定的数据仓库目录。除了外部表之外,其余的表都保存在这个目录中。

2、分区:hive中每个分区都对应数据库中相应列的一个索引,但是分区的组织方式与传统关系型数据库不同。在hive表中,表的一个分区对应表的一个目录,所有分区数据都存储在对应的目录中,比如tab1中包含dt和ct两个分区,分别对应两个目录,对应dt=123456,ct=Shenzhen的HDFS子目录为 /datawarehouse/tab1/dt=123456/ct=Shenzhen 。

3、桶:相对于指定的列进行hash计算,根据hash值切分数据,每个桶对应一个文件。比如将属性user列分散到32个桶中,首先要将user列进行hash计算,对应hash值为0的桶写HDFS的目录为: /datawarehouse/tab1/dt=123456/ct=Shenzhen/part=00000 。

对应hash值为10的HDFS目录为:

/datawarehouse/tab1/dt=123456/ct=Shenzhen/part=00010 。

4、外部表:指向已经在HDFS中存在的数据,也可以创建分区,外部表与表在元数据上是相同的,但实际数据的存储则存在差异,主要表现为:a、创建表的操作包含两个过程:表创建过程 和 数据加载步骤。两个过程可以在同一个语句中完成,在数据加载过程中,实际数据会移到数据仓库目录中,后续的数据访问会在实际的目录中完成。删除表,表中的数据和元数据会一并被删除。b、外部表的创建只有一个步骤,加载数据和创建表同时完成,实际数据存储在创建表语句 location 指定的HDFS路径中,并不会移动到数据仓库目录中。如果删除一个外部表,只会删除元数据,不会删除表中的数据。

常见的SQL语句转换成MapReduce:

1、join:举例,

select u.name, o.orderid

from order o

join user u

on o.uid = u.uid



2、group by:举例

Select rank, isonline, count(1)

From city

Group by rank, isonline;



3、单个distinct:举例

Select dealid, count(distinct uid)

From num

Group by dealid;


4、多个distinct:举例:

Select dealin, count(distinct uid), count(distinct date)

From order

Group by dealid;



Hive的执行流程:

由客户端提供查询语句交给hive,hive再交给driver处理,分成四个步骤:1、编译器先编译。编译器从MetaStore中获取元数据,生成逻辑计划。2、执行物理计划。3、由driver进行优化。4、执行器执行时对物理计划再分解成job,并且将这个job提交给MapReduce的job tracker进行运行。提交job的同时,还需要提取元数据信息,关联具体的数据,这些数据信息将发送给NameNode。Job tracker拆分成各个task进行计算,并将结果返回或者写入HDFS。

Hive执行流程的要点:

1、操作符是hive的最小处理单位。

2、每个操作符处理代表HDFS操作或MR作业。

3、编译器把hive SQL转换成一组操作符。

4、hive通过ExecMapper和ExecReduceer来执行MapReduce任务。

5、执行MapReduce有两种模式:本地模式和分布式模式。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: