六千字长文:大数据框架(分区,分桶,分片),建议收藏

本文深入探讨了大数据领域中Hive、ElasticSearch、Kafka、HBase及Kudu等主流框架的分区策略,包括分区的目的、实现方式及其对系统性能的影响。

前言

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

目录

  • 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”)显示声明数据要导入到表的哪个分区

设置分区的影响
  1. 首先是hive本身对分区数有限制,不过可以修改限制的数量;
set hive.exec.dynamic.partition=true;
set hive.exec.max.dynamic.partitions=1000; 
set hive.exec.max.dynamic.partitions.pernode=100000;
set hive.exec.dynamic.partition.mode=nonstrict; 
set hive.exec.parallel.thread.number=264;
  1. hdfs对单个目录下的目录数量或者文件数量也是有限制的,也是可以修改的;
  2. 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 个主分片

{
    "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1
    }
}

到底分配到那个shard上呢?

shard = hash(routing) % number_of_primary_shards

routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。routing 通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到余数 。这个在 0 到 number_o

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值