详解大数据框架之分区,分桶,分片

来源:王了个博 大数据左右手 日期:2021-06-30

本文转载自微信公众号「大数据左右手」,作者王了个博 。转载本文请联系大数据左右手公众号。

前言

在大数据分布式中,分区,分桶,分片是设计框架的重点。此篇就来总结各个框架。

目录

  • Hive分区与分桶
  • ES分片
  • Kafka分区
  • HBase分区
  • Kudu分区

Hive

Hive分区

是按照数据表的某列或者某些列分为多区,在hive存储上是hdfs文件,也就是文件夹形式。现在最常用的跑T+1数据,按当天时间分区的较多。

把每天通过sqoop或者datax拉取的一天的数据存储一个区,也就是所谓的文件夹与文件。在查询时只要指定分区字段的值就可以直接从该分区查找即可。创建分区表的时候,要通过关键字 partitioned by (column name string)声明该表是分区表,并且是按照字段column name进行分区,column name值一致的所有记录存放在一个分区中,分区属性name的类型是string类型。

当然,可以依据多个列进行分区,即对某个分区的数据按照某些列继续分区。

向分区表导入数据的时候,要通过关键字partition((column name="xxxx")显示声明数据要导入到表的哪个分区

设置分区的影响

首先是hive本身对分区数有限制,不过可以修改限制的数量;

  1. set hive.exec.dynamic.partition=true
  2. set hive.exec.max.dynamic.partitions=1000;  
  3. set hive.exec.dynamic.partition.mode=nonstrict;  
  4. set hive.exec.parallel.thread.number=264; 

hdfs对单个目录下的目录数量或者文件数量也是有限制的,也是可以修改的;

NN的内存肯定会限制,这是最重要的,如果分区数很大,会影响NN服务,进而影响一系列依赖于NN的服务。所以最好合理设置分区规则,对小文件也可以定期合并,减少NN的压力。

Hive分桶

在分区数量过于庞大以至于可能导致文件系统崩溃时,我们就需要使用分桶来解决问题

分桶是相对分区进行更细粒度的划分。分桶则是指定分桶表的某一列,让该列数据按照哈希取模的方式随机、均匀的分发到各个桶文件中。因为分桶操作需要根据某一列具体数据来进行哈希取模操作,故指定的分桶列必须基于表中的某一列(字段) 要使用关键字clustered by 指定分区依据的列名,还要指定分为多少桶

create table test(id int,name string) cluster by (id) into 5 buckets .......

insert into buck select id ,name from p cluster by (id)

Hive分区分桶区别

  • 分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助
  • 不同于分区对列直接进行拆分,桶往往使用列的哈希值对数据打散,并分发到各个不同的桶中从而完成数据的分桶过程
  • 分区和分桶最大的区别就是分桶随机分割数据库,分区是非随机分割数据库

ElasticSearch分片

主分片:用于解决数据水平扩展的问题,一个索引的所有数据是分布在所有主分片之上的(每个主分片承担一部分数据,主分片又分布在不同的节点上),一个索引的主分片数量只能在创建时指定,后期无法修改,除非对数据进行重新构建索引(reindex操作)。

副本分片:用于解决数据高可用的问题,一个副本分片即一个主分片的拷贝,其数量可以动态调整,通过增加副本分片也可以实现提升系统读性能的作用。

在集群中唯一一个空节点上创建一个叫做 blogs 的索引。默认情况下,一个索引被分配 5 个主分片

  1.     "settings": { 
  2.         "number_of_shards": 5, 
  3.         "number_of_replicas": 1 
  4.     } 

到底分配到那个shard上呢?

  1. shard = hash(routing) % number_of_primary_shards 
 1/6    1 2 3 4 5 下一页 尾页
    A+
声明:本文转载自其它媒体,转载目的在于传递更多信息,并不代表赞同其观点和对其真实性负责。