精华内容
下载资源
问答
  • 分桶策略
    千次阅读
    2021-03-16 15:20:18

    分桶策略在代码withBucketAssigner中设定

     

     Flink写入hiveHive
    分桶策略写入hive中的一个文件夹保存在文件
    分区指的是如何分配到下游算子中进行计算[2]保存在文件夹

     

    也就是说flink的写入分桶和hive的分桶不是一个概念

    其中的flink分区是用来 流/离线 计算的

     

    分桶策略[1]作用
    BasePathBucketAssigner不分桶,所有文件写到根目录
    DateTimeBucketAssigner基于系统时间分桶

    Reference:

    [1]学习 Flink(十六):Streaming Parquet File

    [2]Flink分区策略

    更多相关内容
  • 分桶策略 ZooKeeper的会话管理主要是由SessionTracker负责的,其采用了一种特殊的会话管理方式,称其为“分桶策略”。所谓分桶策略,是将超时时间相近的会议放到同一个桶中来进行管理,以减少管理的复杂度。在检查...

    分桶策略

    ZooKeeper的会话管理主要是由SessionTracker负责的,其采用了一种特殊的会话管理方式,称其为“分桶策略”。所谓分桶策略,是将超时时间相近的会议放到同一个桶中来进行管理,以减少管理的复杂度。在检查超时的会话时,只需要检查桶中剩下的会话即可(没有被转移走的会话全是超时的)。

    会话超时时间的计算方法如下:

     

    可见,超时检查的粒度就是expirationInterval,以这个粒度为单位,就可以分成多个桶,同一个桶中存放着超时时间一致的会话。

    会话激活

    有了桶之后,接下来就是激活。每次客户端和ZooKeeper服务器之间有通信时,会话就会被激活,会话的超时时间就会被重新计算,然后会话就会被放到其他的桶中。顺便说一句,每个桶就是一个Set,SessionTracker还维护了另外一个Map:

    HashMap sessionSets= new HashMap();

    sessionSets存放超时时间到桶的映射。这样通过某个超时时间,就可以获取这个时间超时的所有会话了。这样一次可以检查多个会话。

    会话检查

        @Override
    
        synchronizedpublic void run() {
    
            try {
    
               while (running) {
    
                    currentTime =System.currentTimeMillis();
    
                    if (nextExpirationTime >currentTime) {
    
                       this.wait(nextExpirationTime - currentTime);
    
                       continue;
    
                    }
    
                    SessionSet set;
    
                    set =sessionSets.remove(nextExpirationTime);
    
                    if (set != null) {
    
                        for (SessionImpl s :set.sessions) {
    
                           setSessionClosing(s.sessionId);
    
                           expirer.expire(s);
    
                        }
    
                    }
    
                    nextExpirationTime +=expirationInterval;
    
               }
    
           } catch (InterruptedException e) {
    
                handleException(this.getName(), e);
    
           }
    
           LOG.info("SessionTrackerImpl exited loop!");
    
        }

    从源代码中可以看出,分桶后,每次把一个桶中剩下的会话全认为是超时的即可(不超时的会话会被移走)。检查一个桶后,经过expirationInterval时间后,再检查下一个桶。

    ZooKeeper的会话分桶策略,在一些需要管理大量超时会话的场景下,会非常有用。​

    展开全文
  • 分桶策略: ZooKeeper的会话管理主要是由SessionTracker负责的,其采用了一种特殊的会话管理方式,称其为“分桶策略”。所谓分桶策略,是将超时时间相近的会议放到同一个桶中来进行管理,以减少管理的复杂度。在...

    分桶策略:

    ZooKeeper的会话管理主要是由SessionTracker负责的,其采用了一种特殊的会话管理方式,称其为“分桶策略”。所谓分桶策略,是将超时时间相近的会议放到同一个桶中来进行管理,以减少管理的复杂度。在检查超时的会话时,只需要检查桶中剩下的会话即可(没有被转移走的会话全是超时的)。

    会话超时时间的计算方法如下:

       long expireTime = roundToInterval(System.currentTimeMillis() + timeout);

     

       private long roundToInterval(long time) {

           // We give a one interval grace period

           return (time / expirationInterval + 1) * expirationInterval;

        }

    可见,超时检查的粒度就是expirationInterval,以这个粒度为单位,就可以分成多个桶,同一个桶中存放着超时时间一致的会话。

     

    会话激活:

    有了桶之后,接下来就是激活。每次客户端和ZooKeeper服务器之间有通信时,会话就会被激活,会话的超时时间就会被重新计算,然后会话就会被放到其他的桶中。顺便说一句,每个桶就是一个Set,SessionTracker还维护了另外一个Map:

    HashMap sessionSets= new HashMap();

    sessionSets存放超时时间到桶的映射。这样通过某个超时时间,就可以获取这个时间超时的所有会话了。这样一次可以检查多个会话。

     

     

    会话检查:

       @Override

        synchronizedpublic void run() {

           try {

               while (running) {

                    currentTime =System.currentTimeMillis();

                    if (nextExpirationTime >currentTime) {

                       this.wait(nextExpirationTime - currentTime);

                        continue;

                    }

                    SessionSet set;

                    set =sessionSets.remove(nextExpirationTime);

                    if (set != null) {

                        for (SessionImpl s :set.sessions) {

                           setSessionClosing(s.sessionId);

                            expirer.expire(s);

                        }

                    }

                    nextExpirationTime +=expirationInterval;

               }

           } catch (InterruptedException e) {

                handleException(this.getName(), e);

           }

           LOG.info("SessionTrackerImpl exited loop!");

        }

     

    从源代码中可以看出,分桶后,每次把一个桶中剩下的会话全认为是超时的即可(不超时的会话会被移走)。检查一个桶后,经过expirationInterval时间后,再检查下一个桶。

     

    ZooKeeper的会话分桶策略,在一些需要管理大量超时会话的场景下,会非常有用。​

    展开全文
  • 1.2 什么是分桶策略辅助理解 通过分桶策略的定义,我们可以看出分桶策略中有两个桶,这两个桶在代码层面的表现形式就是两个Map数据类型,那么我们就会想Map的key是什么?接着往下看,我们慢慢就会揭开TA神奇的面纱...

      

    关历史文章(阅读本文前,您可能需要先看下之前的系列👇

    国内最全的Spring Boot系列之四

    享元模式:共享女友 - 第355篇

    什么是 ZooKeeper - 第347篇

    ZooKeeper安装 - 第348篇

    ZooKeeper数据结构和实操  - 第349篇

    ZooKeeper的watch机制 - 第350篇

    ZooKeeper的acl权限控制  - 第351篇

    ZooKeeper内存数据和持久化  - 第352篇

    ZooKeeper集群搭建 - 第354篇

    ZooKeeper Java客户端的基本使用 - 第356篇

    ZooKeeper客户端Curator - 第358篇

    ZooKeeper客户端Curator的进阶使用 - 第359篇

    ZooKeeper客户端Curator实现Watch事件监听 - 第361篇

    Spring Boot 使用 Curator 操作 ZooKeeper - 第363篇

    Spring Boot使用Apache Curator实现服务的注册和发现 - 第364篇
    Spring Boot使用Apache Curator实现分布式锁(可重入排它锁) - 第365篇

    Spring Boot使用Apache Curator实现leader选举 - 第366篇

    Spring Boot使用Apache Curator实现分布式计数器 - 367篇

    ZooKeeper Session 基本原理 - 第369篇

    ZooKeeper分桶策略实现高性能的会话管理 - 第371篇

    ZooKeeper集群架构以及读写原理 - 第372篇

    ZooKeeper Leader选举原理也不过如此,看完这篇你不再懵逼了 - 第374篇

    Zookeeper 集群节点为什么要部署成奇数呢?- 第376篇

    ZooKeeper集群脑裂问题 - 第379篇

    分布式一致性算法Paxos,ZooKeeper的ZAB协议 - 第381篇

    前言

             在前面的小节中,我们介绍了ZK的Session的基本原理,其中有一个属性是这么描述的:

    TickTime:下次会话超时时间点,默认 2000 毫秒。可在 zoo.cfg 配置文件中配置,便于 server 端对 session 会话实行分桶策略管理。

             这里对Session会话实行分桶策略管理是什么意思呐?这就是本节要重点来介绍的。

    一、分桶策略概述

    1.1 什么是分桶策略

    Zookeeper的session管理主要是通过SessionTracker来负责,其采用了分桶策略进行管理。

    分桶策略是指,将空闲超时时间相近的会话放到同一个桶中来进行管理,以减少管理的复杂度。在检查超时时,只需要检查桶中剩下的会话即可,因为没有超时的会话已经被移出了桶,而桶中存在的会话就是超时的会话。

             zk 对于会话空闲的超时管理并非是精确的管理,即并非是一超时马上就执行相关的超时操作。

    1.2 什么是分桶策略辅助理解

             通过分桶策略的定义,我们可以看出分桶策略中有两个桶,这两个桶在代码层面的表现形式就是两个Map数据类型,那么我们就会想Map的key是什么?接着往下看,我们慢慢就会揭开TA神奇的面纱。

    二、分桶策略原理

    2.1 分桶策略图示解说

    那在每个红点所在的时间点都要运行一次‘session过期任务’,而且一次任务的执行,只使得一个session过期。这样效率不高。而且如果session比较多的话,那“session过期任务”的执行会占用很大的负载。

    ZooKeeper为了方便管理session超时时间,使用分桶策略,使用如下计算公式,来计算session的超时时间:

    long currentTime = Time.currentElapsedTime();
    long sessionTimeout = 10000;
    long expireTime_0 = currentTime + sessionTimeout;
    long expireTime = (expireTime_0 / expirationInterval + 1) * expirationInterval;
    

    此计算公式,会根据expirationInterval(默认2000毫秒)把时间分成相同时间段,让处于同一时间段的session的超时时间移动到此时间段结束的时间点上。

    如上例子,这三个session的超时时间都变为ExpirationTime2。也就是在ExpirationTime1到ExpirationTime2之间的session,超时时间都设置为ExpirationTime2,这样当currentTime到达ExpirationTime2的时刻,执行一次session过期任务,就把这三个session都给设置为过期了。

             这样处理会更加方便。

    2.2 分桶类ExpiryQueue整体工作流程图

     

    2.2.1 ExpiryQueue作用

    ZooKeeper服务端管理客户端会话超时使用到ExpiryQueue,用来管理Session超时的会话。

    2.2.2 ExpiryQueue类图

     

    该类中主要包含了以下变量:

    (1)nextExpirationTime(下一个过期的时间点) ;

    (2)expirationInterval(过期时间间隔) ;

    (3)elemMap(Session对象集合,key是session对象,类型是SessionImpl,value为过期时间);

    (4)expiryMap(过期的Session对象集合,key为过期时间,value为session)

            

    该类中主要方法:

    (1)构造方法初始化nextExpirationTime

    (2)update增加或更新session的过期时间

    (3)remove清除过期session

    (4)getWaitTime判断当前时间是否已经超过了nextExpirationTime,超过返回0,没有超过返回nextExpirationTime-now,zookeeper中通过不停的轮询这个方法来判断是否清除过期session

    (5)poll拉取过期session进行清除

    2.2 分桶类ExpiryQueue数据结构理解

     

     

    ExpiryQueue根据expirationInterval将时间分段,将每段区间的时间放入对应的一个集合进行管理。如图二所示,时间段在1503556830000-1503556860000中的数据将会放到1503556860000对应的集合中,1503556860000-1503556890000中的数据将会放到1503556890000的集合中,以此类推。

             在ExpiryQueue的数据结构中,图中的集合由ConcurrentHashMap<Long, Set<E>>进行管理,其中的Key值为到期时间。

             数据分段使用公式为:(当前时间(毫秒)/ expirationInterval + 1)* expirationInterval。该公式表示将当前时间按照expirationInterval间隔算份数,算完后再加一个份额,最后再乘以expirationInterval间隔,就得出了下一个到期时间。

    三、分桶策略源码解析

             我们来看看源码的实现。

    3.1 SessionTrackerImpl#touchSession

    分桶策略的实现,主要是 SessionTrackerImpl#touchSession 方法,通俗说这个方法是给session续期的。我们先来阅读此方法的源码:

     

    此代码的逻辑:

    (1)调用touchSession(sessionId , timeout)方法,先从 sessionsById 这个map中通过 sessionId 取出session1(下面的update会此session1传入);

    (2)然后调用updateSessionExpiry(s,timeout)进行续期。

             我们跟进updateSessionExpiry(s,timeout):

             从这里我可以看出来,session续期最终是交给了sessionExpiryQueue来进行管理,我们通过定义可以看到是ExpiryQueue<SessionImpl>,也是就是实现类是ExpiryQueue。

    3.2 ExpiryQueue

             我们看下ExpiryQueue的update是怎么续期的。

             在此之前,我们先来看下ExpiryQuqueue类的情况:

     

    (1)nextExpirationTime(下一个过期的时间点) ;

    (2)expirationInterval(过期时间间隔) ;

    (3)elemMap(Session对象集合,key是session对象,类型是SessionImpl,value为过期时间);

    (4)expiryMap(过期的Session对象集合,key为过期时间,value为session)

    3.3 ExpiryQueue#update

             对于ExpiryQueue有了基本的认知之后,我们就可以来看看update这个方法是怎么续期的了:

     

     

    此代码逻辑说明:

    (1)eleMap.get(elem):这个的E代表的是SessionImpl ,这个通过上面的说到的定义中ExpiryQueue<SessionImpl>可以看出来;所以这个就是通过会话对象获取到上一期的过期时间点。

    (2)通过roundToNextInterval(time)计算下一个过期时间点:

    (3)把session1 从expirationTime1 移动到 expirationTime2:(代码上就是先从expirationTime1的sessionSet中移除session1;然后把session1 添加到expirationTime2的sessionSet中。)

     

     

    3.3 session过期任务线程

             过期任务主要是由SessionTrackerImpl的run来进行处理的:

    在 SessionTrackerImpl 中的session超时任务中,只是把 session 的isClosing 变量设置为true。

    只把session标识位isClosing是不够的,如果此session对应的client创建了临时节点,还需要把临时节点删掉呢。所以要调用 expirerexpire(s); 处理session过期逻辑的:

    org.apache.zookeeper.server.ZooKeeperServer#createSessionTracker

             可以找到ZooKeeperServer的expire(Session): 

     

     

             此方法处理session过期逻辑:调用的是 ZooKeeperServer#close 方法,close方法中又调用了 ZooKeeperServer#submitRequest提交请求 方法,其中 操作类型为OpCode.closeSession。

             也就是 ZooKeeperServer 处理session 过期,是提交了一个操作类型为 为OpCode.closeSession的request,

    3.4 session什么时候被移出掉呢?

             session标识位isClosing = true后,是在哪里把session从sessionSet中remove掉的呢?

    以为 调用 expirer.expire(s); 就是为了把session从 sessionSet中remove掉。

    所以的请求处理器,都只是把session 的isClosing赋值为true。

    其实,在 touchSession()方法中有一个前提:就是session不能是isClosing 状态的,否则就直接返回:

     

    四、小结

             这个可能有点复杂,大家可以根据源码自己进行分析的。

             要知道的核心就是:

    (1)分桶策略的实现就是两个HashMap的容器来进行实现的。

    (2)核心的两个方法就是SessionTrackerImpl的touchSession()和run()方法。 

     

    我就是我,是颜色不一样的烟火。
    我就是我,是与众不同的小苹果。

    à悟空学院:悟空学院

    学院中有Spring Boot相关的课程!!

    SpringBoot视频:从零开始学Spring Boot Plus - 网易云课堂

    SpringBoot交流平台:https://t.cn/R3QDhU0

    SpringSecurity5.0视频:权限管理spring security - 网易云课堂

    ShardingJDBC分库分表:分库分表Sharding-JDBC实战 - 网易云课堂

    分布式事务解决方案:分布式事务解决方案「手写代码」 - 网易云课堂

    JVM内存模型调优实战:深入理解JVM内存模型/调优实战 - 网易云课堂

    Spring入门到精通:Spring零基础从入门到精通 - 网易云课堂

    大话设计模式之爱你:大话设计模式之爱你一万年 - 网易云课堂

    展开全文
  • <!--zkClient 依赖--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency>
  • Hive分桶 详解

    千次阅读 2020-07-18 18:52:07
    实际生产中分桶策略使用频率较低,更常见的还是使用数据分区。 #! /bin/bash set -o errexit source /etc/profile source ~/.bashrc ROOT_PATH=$(dirname $(readlink -f $0)) echo $ROOT_PATH date_pattern_old='^...
  • 基于自动分类的可移动垃圾的营销策略.docx
  • 基于自动分类的可移动垃圾的营销策略.pdf
  • minio8.x版本设置policy桶策略

    千次阅读 2022-01-21 14:26:08
    文章目录前言一、policy策略1)7.0版本实现方式2)8.0后设置桶策略二、policy-理解json字符串含义1.新建桶是什么策略2.设置桶的规则3.用java代码完成1)将桶设置为public2)桶内文件夹权限设置4.prefix是断言吗?5....
  • S3存储桶策略(S3 Bucket Policies)

    千次阅读 2020-01-06 15:33:55
    关注公众号:AWS爱好者(iloveaws) 文 | 沉默恶魔(禁止转载,转载请先...【 Domain 1的组织复杂性设计(Design for Organizational Complexity)】——-S3存储桶策略(S3 Bucket Policies) Hello大家好,欢迎回...
  • 租户及访问策略配置1.新建Bucket2.策略生成3.新建User并指定策略4.登录四.其他 一.环境准备 Centos 7.5 Docker 20.10.7 二.服务部署 1.Docker Minio 镜像下载 //搜索 docker search minio //下载 docker pull ...
  • Hive中的数据分桶

    千次阅读 2020-11-10 11:34:00
    hive分桶管理 https://blog.csdn.net/freefish_yzx/article/details/77150714 hive的分区和分桶 https://blog.csdn.net/wl1411956542/article/details/52931499 ----------------------------------------------...
  • Hive分区和分桶的区别和优缺点

    千次阅读 2021-01-12 20:27:09
    彻底搞懂 hive分区表 hive分桶表 Hive分区和分桶的区别 Hive分区和分桶的优缺点 spark分区 spark分桶
  • Hive动态分区和分桶

    千次阅读 多人点赞 2020-06-21 22:05:38
    实际生产中分桶策略使用频率较低,更常见的还是使用数据分区。 2.5、Hive分桶的抽样查询 --案例 select * from bucket_table tablesample(bucket 1 out of 4 on columns) --TABLESAMPLE语法: TABLESAMPLE(BUCKET...
  • 在大数据分布式中,分区,分桶,分片是设计框架的重点 一、Hive分区与分桶 1.1Hive分区 是按照数据表的某列或者某些列分为多区,在hive存储上是hdfs文件,也就是文件夹形式。现在最常用的跑T+1数据,按当天时间...
  • Hive Hive中的数据分桶 以及 使用场景

    万次阅读 多人点赞 2018-07-04 14:19:41
    参考文章:hive分桶管理https://blog.csdn.net/freefish_yzx/article/details/77150714hive的分区和分桶https://blog.csdn.net/wl1411956542/article/details/52931499Hive中有数据分区的方案,也有数据分桶的方案,...
  • hive分桶和分区的联系和区别

    千次阅读 2019-04-10 22:01:38
    也可以进一步被分桶(Buckets),实际上就是MR编程中的 HashPartitioner。 ——看起来二者似乎区别不大,但不管是论坛还是一些培训机构,都把二者分开来讲,但具体的区别有说的模棱两可,今天我就说一下我的理解: ...
  • 字符串hash分桶方法

    千次阅读 2020-12-24 15:38:46
    利用hashlib的md5算法作为分桶基数,md5的字符串位数长度是固定的,这样很方便进行下一步的输出再分桶操作: import random import string import hashlib from operator import add from functools import reduce...
  • 流量为王:ABTest流量分层分桶机制

    千次阅读 2021-03-25 11:57:41
    在互联网行业,无论是构建搜索推荐系统,还是智能营销等场景,都是围绕用户进行不同的实验,从各项指标上观察用户对不同交互、流程、策略、算法等反馈,进而对产品、营销策略、搜索推荐算法等进行迭代改进。...
  • Spark SQL 分桶表在字节跳动的优化

    千次阅读 2020-09-24 08:39:43
    字节跳动在分桶方面的优化 Spark 分桶和 Hive 分桶对齐 前面介绍了 Spark 和 Hive 分桶不兼容,对于这方面,字节跳动将 Hive 分桶表和 Spark 分桶表进行了对齐,主要包括: Spark SQL 写 Hive 分桶表的逻辑和 Hive ...
  • zk中的session管理策略
  • StarRocks采用Range-Hash的组合数据分布方式,也就是我们一直在提的分区分桶方式。StarRocks中的分区是在建表时通过PARTITION BY RANGE()语句设置,用于分区的列也被称之为分区键,当前分区键仅支持日期类型和整数...
  • 一、应用场景: Flink 消费 Kafka 数据进行实时处理,并将结果写入 HDFS。 ...1、Flink 提供了两个分桶策略分桶策略实现了 org.apache.flink.streaming.api.functions.sink.filesystem.BucketAss
  • 现有的差隐私直方图发布技术未能高效...算法采用基于邻近合并的贪心策略,并利用红黑树对合并过程进行优化.实验对本文算法发布数据的可用性及算法效率与同类算法进行比较分析.实验结果表明,该算法是有效可行的.
  • ES聚合查询详解(二):聚合

    千次阅读 2021-10-19 15:30:42
    ES聚合查询主要分为3类:指标聚合、聚合和管道聚合。 本文主要是介绍其中聚合的相关使用。
  • 计算机本科毕业设计-智能分类垃圾

    千次阅读 多人点赞 2021-07-17 09:50:51
    详细设计3.1 硬件设计3.1.1 硬件零件型号3.1.2 智能垃圾硬件整体结构3.2 软件设计3.2.1 超声波检测模块3.2.2 UI可视化模块3.2.3 图像预处理模块3.2.4 MobileNetV1图像分类模块3.2.5 舵机驱动模块4. 总结 1. 前言 ...
  • 精准广告预算分桶背景分析

    千次阅读 2019-01-09 13:03:06
    随着业务发展,部分算法策略开始将预算的影响因素也纳入到算法模型之中。预算的设定是广告主行为,日常投放产生的消耗必须严格控制在设定的预算金额内,这给算法实验带来了很大的困扰。 算法实验的最常用方法是对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,596
精华内容 11,838
关键字:

分桶策略

友情链接: mmse.zip