hive load 文件夹 hive load多个文件_数据


什么是Hive?

Hive是建立在Hadoop基础上的数据仓库基础架构。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 QL ,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。


hive load 文件夹 hive load多个文件_数据_02


Hive是SQL解析引擎,将SQL转换为Map/reducer job然后在Hadoop执行。Hive的表其实就是HDFS的目录,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在Map/Reduce Job里使用这些数据。

Hive把HQL语句转换成MR任务后,采用批处理的方式对海量数据进行处理。数据仓库存储的是静态数据,很适合采用MR进行批处理。Hive还提供了一系列对数据进行提取、转换、加载的工具,可以存储、查询和分析存储在HDFS上的数据。

hive与Hadoop生态系统中其他组件的关系

1.Hive依赖于HDFS存储数据,依赖于MR处理数据;

2.Pig可作为Hive的替代工具,是一种数据流语言和运行环境,适合用于在Hadoop平台上查询半结构化数据集,用于与ETL过程的一部分,即将外部数据装载到Hadoop集群中,转换为用户需要的数据格式;

3.HBase是一个面向列的、分布式可伸缩的数据库,可提供数据的实时访问功能,而Hive只能处理静态数据,主要是BI报表数据,Hive的初衷是为减少复杂MR应用程序的编写工作,HBase则是为了实现对数据的实时访问。

Hive的系统结构

Hive架构的根基是HDFS和MapReducer。

(1)用户接口模块:包含CLI,HWI,JDBC,Thrift Server等,用于实现对hive的访问.

(2)底层根基:

Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比如 select * from table 不会生成 MapRedcue 任务)

hive有三种运行模式:内嵌模式、本地模式、远程模式.

元数据存储系统 : RDBMS MySQL

元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息。

Hive 中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和 外部表),表的数据所在目录

Metastore 默认存在自带的 Derby 数据库中。缺点就是不适合多用户操作,并且数据存 储目录不固定。数据库跟着 Hive 走,极度不方便管理

解决方案:通常存我们自己创建的 MySQL 库(本地 或 远程)

Hive 和 MySQL 之间通过 MetaStore 服务交互

Hive的数据组织:

1、Hive 的存储结构包括数据库、表、视图、分区和表数据等。数据库,表,分区等等都对 应 HDFS 上的一个目录。表数据对应 HDFS 对应目录下的文件。

2、Hive 中所有的数据都存储在 HDFS 中,没有专门的数据存储格式,因为 Hive 是读模式

3、 只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据

Hive 的默认列分隔符:控制符 Ctrl + A,x01 Hive

Hive 的默认行分隔符:换行符 n

4、Hive 中包含以下数据模型:

database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹

table:在 HDFS 中表现所属 database 目录下一个文件夹

external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径

partition:在 HDFS 中表现为 table 目录下的子目录

bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散 列之后的多个文件

view:与传统数据库类似,只读,基于基本表创建

5、Hive 的元数据存储在 RDBMS 中,除元数据外的其它所有数据都基于 HDFS 存储。默认情 况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的 测试。实际生产环境中不适用,为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持。

6、Hive 中的表分为内部表、外部表、分区表和 Bucket 表

内部表和外部表的区别:

删除内部表,删除表元数据和数据

删除外部表,删除元数据,不删除数据

内部表和外部表的使用选择:

大多数情况,他们的区别不明显,如果数据的所有处理都在 Hive 中进行,那么倾向于 选择内部表,但是如果 Hive 和其他工具要针对相同的数据集进行处理,外部表更合适。

使用外部表访问存储在 HDFS 上的初始数据,然后通过 Hive 转换数据并存到内部表中

使用外部表的场景是针对一个数据集有多个不同的 Schema

通过外部表和内部表的区别和使用选择的对比可以看出来,hive 其实仅仅只是对存储在 HDFS 上的数据提供了一种新的抽象。而不是管理存储在 HDFS 上的数据。所以不管创建内部 表还是外部表,都可以对 hive 表的数据存储目录中的数据进行增删操作。

分区表和分桶表的区别:

Hive 数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同 时表和分区也可以进一步被划分为 Buckets,分桶表的原理和 MapReduce 编程中的 HashPartitioner 的原理类似。

分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于 Hive 是读模式,所 以对添加进分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行 hash 散列 形成的多个文件,所以数据的准确性也高很多.

使用 MySQL 作为 Hive 的 metastore:

1.把mysql的jdbc驱动放置到hive的lib目录下:cp mysql-connector-java-5.1.10.jar /usr/local/hive/lib

2.修改hive-site.xml:

javax.jdo.option.ConnectionURL jdbc:mysql://hadoop-master:3306/hive?createDatabaseIfNotExist=true javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword admin

Hive的执行流程


hive load 文件夹 hive load多个文件_数据_03


hive load 文件夹 hive load多个文件_数据_04


误区:Hive被称为"数据仓库",但是Hive不存储数据,数据存储在HDFS中,hive主要用于管理和解析数据,也不是作为数据库使用。

注意:1.Hive运行时,元数据只能存储在关系型数据库(derby)中。

2.元数据由我们自己手动实现。元数据丢失,找不回数据,此元数据与namenode中的元数据不是一回事。