9模式设计
2021-05-11 21:39:55 0 举报
AI智能生成
Hive模式设计
作者其他创作
大纲/内容
分区
HDFS用于设计存储数百万的大文件,而非数十亿的小文件
使用过多分区可能导致创建大量的非必须的Hadoop文件和文件夹
一个分区对应着一个包含多个文件的文件夹
过多的文件会超出NameNode对系统云数据信息的处理能力
NameNode必须将所有的系统文件的元数据信息保存在内存中
每个文件需要150字节大小的元数据
MapReduce会将一个任务(job)转换成多个任务(task)
默认情况下,每个task都是一个新的JVM实例,都需要开启和销毁的开销
对于小文件,每个文件都会对应一个task
在一些情况下,JVM开启和销毁的时间可能会比实际处理数据的时间消耗要长
一个理想的分区方案不应该导致产生太多的分区和文件夹目录
并且每个目录下的文件应该足够大,应该是文件系统中块大小的若干倍
如果用户不能找到好的、大小相对合适的分区方式,那么可以考虑使用分桶存储
唯一键和标准化
Hive没有主键
应避免对非标准化数据进行连接(JOIN)操作
避免标准化的主要原因是为了最小化磁盘寻道,比如那些通常需要外键关系的情况
非标准化数据允许被扫描或写入到大的、连续的磁盘存储区域,从而优化磁盘驱动器的I/O性能
然而,非标准化数据可能导致数据重复,而且有更大的导致数据不一致的风险
分区
临时表分区
更具鲁棒性的处理方法是整个过程中使用分区,这样就不会存在同步问题
分桶
分区提供一个隔离数据和优化查询的便利的方式
创建太多分区导致超过文件系统的处理能力
分桶是将数据集分解成更容易管理的若干部分的另一个技术
分桶字段被hash分发到桶中
如果字段数比桶数多得多,那么每个桶内就会包含多个字段的记录
CLUSTERED BY (xxx) INTO n BUCKETS
不过,将数据正确地插入到表的过程完全取决于用户自己
CREATE TABLE语句中所规定的信息仅仅定义了元数据,而不影响实际填充表的命令
hive.enforce.bucketing = true
桶数量是固定的,所以没有数据波动
为表增加列
无法在已有字段的开始或者中间增加新字段
列式存储?
几乎总是使用压缩
几乎在所有情况下,压缩都可以使磁盘上存储的数据量变小,这样可以通过降低I/O来提高查询执行速度
不使用压缩唯一的理由是数据用于外部系统,或者非压缩格式是最兼容的
压缩和解压缩都会消耗CPU资源
MapReduce任务往往是I/O密集型的,因此CPU开销通常不是问题
0 条评论
下一页