一、为什么要用数据仓库?mysql不好吗?mysql和hive的区别
1、mysql、hadoop和hive
mysql是关系型数据库,与之对应的是其实应该是HDFS,数据仓库。
hadoop是分布式计算的开源框架,包含HDFS,hive,Hbase。
hive是基于hadoop的一个数据仓库工具,本质是工具。提供SQL查询功能,HiveSQL会转化成mapReduce任务执行,无需编写代码。为数据统计分析提供便利。
2、为什么hive会慢?
因为hive查询时候需要提交mapReduce任务,申请资源和启动任务,因此会很慢。但是当数据量达到很大的级别时候,mysql的速度是远不及hive的。
另外因hadoop的分布式存储,即HDFS本身稳定性也很强。
3、应用场景
如果数据量很小,或者要求数据实时性强,用mysql没问题。如果数据量大还是得用数据仓库,hadoop进行分布式计算。
因此,这里所说的数据仓库,其实是离线数据仓库。
有人可能会问,假如我要求实时性很强,而且数据量又很大呢?难道没有分布式方面的解决方案吗?有,这就需要实时数仓,Flink流处理框架,Flink是java和Scala编写的分布式流数据流引擎。
数据库是面向事务的设计,数据仓库是面向主题设计的。 数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。
数据库设计是尽量避免冗余,一般采用符合范式的规则来设计,数据仓库在设计是有意引入冗余,采用反范式的方式来设计。
数据库是为捕获数据而设计,数据仓库是为分析数据而设计,它的两个基本的元素是维表和事实表。
(维是看问题的角度,比如时间,部门,维表放的就是这些东西的定义,事实表里放着要查询的数据,同时有维的ID)
二、数仓的各种概念
1、hadoop、HDFS、hive
hadoop 是分布式计算的开源框架,本质是一种框架。(是用java实现的)
HDFS是分布式存储文件系统,数据是以块的形式存储在各个datanode里面的。具体原理可以查资料。
hive是专门处理存储在HDFS里的数据的工具,它本质是工具。
顺便一提mysql,是关系型数据库,本质是数据库,与之对应的是HDFS。mysql的数据是以二维表的形式存储在磁盘中。具体原理可以查资料。
2、为什么安装hive的时候,需要安装mysql,作用是什么?
解决这个问题首先搞清楚“元数据”和“原始数据”的概念。
原始数据,很简单,就是数据本身,存储在磁盘上,通过数据库进行管理及查询。
元数据,就是描述数据的数据,包括比如表名称、列、分区、属性和大小等。
因此对于hive来说,真正的数据,即原始数据是存放在HDFS中,但是要查询HDFS的数据,就需要通过hiveSQL查询元数据来获取。实际上hiveSQL提交后,会执行mapReduce任务。那这些元数据放哪里呢?hive默认是存放在derby,但derby只适合单机,性能很差。因此多数都是存放在mysql中,也可以是其他的关系型数据库。hive安装完成后,可以在mysql数据库中找到hive的元数据库,这个库里面的表,就是hive的元数据,这些元数据就是描述HDFS的数据。
磁盘是怎么存储数据的?
可以参考这批文章 https://blog.csdn.net/Wisimer/article/details/115543032
3、sqoop是什么,能做什么?
sqoop是连接关系型数据库和hadoop的桥梁,本质是一种用java编写的工具。它也是基于hadoop的框架,因此也会通过执行mapReduce任务实现的。
简单来说,sqoop就是把mysql数据传到HDFS里,并且把相关元数据记录在mysql里的hive库中。
4、yarn是什么?
Yet Another Resource Negotiator,yarn是hadoop的资源管理器。因为hadoop这个框架本身就是要通过mapReduce进行map和reduce作业,不管是hive的数据查询,还是sqoop的数据导入导出。
而大量的mapReduce任务,就需要一个管理工具去协调,每个任务的资源分配,包括CPU、内存分配、任务队列等等。
关于yarn的知识点很多,ResourceManager,applicationMaster,nodeManager,container等等,想深入了解可以进一步去查阅。