开篇
基于大数据的时代背景,分布式计算框架已经是无可替代的计算工具。那么数据仓库的运行环境就不只是拘泥于关系型数据库了,在数据量比较大的前提下,分布式计算将会比关系型数据库更胜一筹。
那么数据仓库环境从关系型数据到分布式计算框架的迁移过程中要考虑哪些问题或者需要解决哪些问题,下面我们具体详细讲解。
数据仓库环境: Hadoop + HDFS + Hive
数据仓库整体架构图
问题清单(本文会依次讲解下面所有问题)
-
1 HDFS是基于文件存储的,那么列的分隔符应该怎么设定?
-
2 在hive中表的类型怎样选择?分区又该怎样设置?
-
3 hive直接操作文件,那么它的增删改怎样实现?
-
4 ETL过程中数据抽取和转化应该怎样实现?
-
5 元数据怎样管理?
-
6 数据分层应该怎样设计?
-
7 缓慢变化维(SCD)的处理方法
-
8 计算效率怎样提升?hive计算逻辑都做了哪些优化
-
9 遇到过的哪些问题汇总?
问题回答:
1 HDFS是基于文件存储的,那么列的分隔符应该怎么设定?
整个数据仓库的数据都是存储于HDFS上,HDFS是分布式文件系统,所以底层的数据是以文件的形式存在,那么文件要和HIVE中的表字段对应上就必须按照一定的分隔符分割,所以分隔符的选取是十分重要的。如果选取的分隔符在某个字段的内容中出现,就会导致表字段错位,导致查表时数据异常。
我们在数据仓库中指定的分隔符如下:
row format delimited fields terminated by '\u0007'
控制字符“^G” 也就是“\u0007” 是个不可见字符。在linux环境下cat 和 more命令下是看不见此分隔符的。只有在vim命令下才可以看见“^G”的分隔符。这样就能避免在字段内容里出现分隔符而导致的数据异常问题。
2 在hive中表的类型怎样选择?分区又该怎样设置?
hive的表有两种类型,一种是管理表,另一种是外部表。其中最大的区别就是外部表可以在drop table后HDFS上的数据依然不丢失。而管理表在执行drop语句后表结构和表数据都会删除。考虑到我们在ETL操作过程过程中可能会使用删除操作,并且为了保证数据不轻易丢失,我们决定使用外部表。另外ÿ