发明内容
本发明的目的在于提供一种限制消息消费速率的方法、装置、设备及存储介质,能够根据各个分区的积压数据量确定出各个分区的消息消费速率,并将所有分区的消息消费速率的总和控制在设定的消息消费总速率之内。
根据本发明的一个方面,提供了一种限制消息消费速率的方法,应用于Spark中的驱动节点,所述方法包括:
当所述驱动节点按照设定时间间隔定期创建多个消息任务时,获取Kafka的各个分区的消息积压量;其中,一个消息任务对应一个分区,所述消息积压量为分区中未处理的消息数量;
获取预先配置的消息消费总速率;
根据所述消息消费总速率以及每个分区的消息积压量,按照比例计算出每个分区的消息消费速率;其中,所有分区的消息消费速率的总和小于等于所述消息消费总速率;
分别将每个分区的消息消费速率添加到对应的消息任务中,并将所述多个消息任务发送至Spark中对应的执行节点,以供执行节点按照消息任务中的消息消费速率从对应的分区中获取消息。
可选的,所述获取Kafka的各个分区的消息积压量的步骤,具体包括:
针对一个分区,获取所述分区的总消息偏移量和已消费消息偏移量;
将所述总消息偏移量与所述已消费消息偏移量的差值作为所述分区的消息积压量。
可选的,所述根据所述消息消费总速率以及每个分区的消息积压量,按照比例计算出每个分区的消息消费速率的步骤,具体包括:
将所有分区的消息积压量相加以得到消息积压总量;
针对一个分区,将所述分区的消息积压量与所述消息积压总量的比值乘以所述消息消费总速率以得到所述分区的消息消费速率。
可选的,所述分别将每个分区的消息消费速率添加到对应的消息任务中的步骤,具体包括:
针对一个消息任务,确定出与所述消息任务对应的分区的消息消费速率,并确定出与所述消息任务对应的执行节点的反压消费速率;其中,所述反压消费速率是利用Spark的反压机制计算出的所述执行节点的最大消费速率;
获取预先为所有分区配置的统一的最大消费速率;
从与所述消息任务对应的消息消费速率、反压消费速率和所述最大消费速率中确定出最小消费速率,并将所述最小消费速率添加到所述消息任务中。
可选的,所述分别将每个分区的消息消费速率添加到对应的消息任务中,具体包括:
将每个分区的消息消费速率乘以所述设定时间间隔以得到每个分区的消息消费量;
分别将每个分区的消息消费量添加到对应的消息任务中。
为了实现上述目的,本发明还提供一种限制消息消费速率的装置,应用于Spark中的驱动节点,所述装置包括:
创建模块,用于当所述驱动节点按照设定时间间隔定期创建多个消息任务时,获取Kafka的各个分区的消息积压量;其中,一个消息任务对应一个分区,所述消息积压量为分区中未处理的消息数量;
获取模块,用于获取预先配置的消息消费总速率;
计算模块,用于根据所述消息消费总速率以及每个分区的消息积压量,按照比例计算出每个分区的消息消费速率;其中,所有分区的消息消费速率的总和小于等于所述消息消费总速率;
发送模块,用于分别将每个分区的消息消费速率添加到对应的消息任务中,并将所述多个消息任务发送至Spark中对应的执行节点,以供执行节点按照消息任务中的消息消费速率从对应的分区中获取消息。
可选的,所述创建模块,具体用于:
针对一个分区,获取所述分区的总消息偏移量和已消费消息偏移量;将所述总消息偏移量与所述已消费消息偏移量的差值作为所述分区的消息积压量。
可选的,所述计算模块,具体用于:
将所有分区的消息积压量相加以得到消息积压总量;针对一个分区,将所述分区的消息积压量与所述消息积压总量的比值乘以所述消息消费总速率以得到所述分区的消息消费速率。
为了实现上述目的,本发明还提供一种计算机设备,该计算机设备具体包括:存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述介绍的限制消息消费速率的方法的步骤。
为了实现上述目的,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述介绍的限制消息消费速率的方法的步骤。
本发明提供的限制消息消费速率的方法、装置、设备及存储介质,在设定Kafka的消息消费总速率的情况下,动态的根据Kafka中的各个分区的积压消息量,按照比例计算出各个分区的消息消费率,从而避免了部分分区的积压消费量过大的情况出现;此外,还可以限制所有分区的消息消费率的总和不超过设定的消息消费总速率;本发明能够根据各个分区的积压数据量确定出各个分区的消息消费速率,并将所有分区的消息消费速率的总和控制在设定的消息消费总速率之内。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面结合附图对本发明提供的限制消息消费速率的方法、装置、设备及存储介质。
实施例一
本发明实施例提供了一种限制消息消费速率的方法,所述方法应用于如图1所示的Spark Streaming框架中,其中,在Spark Streaming框架中包括:Kafka和Spark,Kafka包括多个Partition分区,Spark包括Driver驱动节点和多个Executor执行节点;具体的,所述方法应用于Spark中的驱动节点;图2为本发明实施例提供的限制消息消费速率的方法的一种可选的流程示意图,如图2所示,所述方法具体包括以下步骤:
步骤S201:当所述驱动节点按照设定时间间隔定期创建多个消息任务(Task)时,获取Kafka的各个分区的消息积压量(Lag);其中,一个消息任务对应一个分区,所述消息积压量为分区中未处理的消息数量。
具体的,驱动节点是Spark中的调度中心,驱动节点会按照设定时间间隔批量的为多个分区创建对应的多个消息任务。消息任务用于指示Spark中的执行节点从Kafka中对应的分区中消费消息。
进一步的,所述获取Kafka的各个分区的消息积压量的步骤,具体包括:
针对一个分区,获取所述分区的总消息偏移量(offset)和已消费消息偏移量(offset);
将所述总消息偏移量与所述已消费消息偏移量的差值作为所述分区的消息积压量。
需要说明的是,一个分区的总消息偏移量用于表征所述分区产生的消息的总数量;一个分区的已消费消息偏移量用于表征Spark中的执行节点已从所述分区中获取的消息的总数量。在实际应用中,Kafka会记录每个分区的总消息偏移量和已消费消息偏移量,Spark的驱动节点可以直接从Kafka中获取一个分区的总消息偏移量和已消费消息偏移量。
步骤S202:获取预先配置的消息消费总速率。
其中,所述消息消费总速率用于表征在单位时间内可以从Kafka的各个分区中获取的最大消息数量;例如,每秒十万条消息。
步骤S203:根据所述消息消费总速率以及每个分区的消息积压量,按照比例计算出每个分区的消息消费速率;其中,所有分区的消息消费速率的总和小于等于所述消息消费总速率。
具体的,步骤S203,包括:
步骤A1:将所有分区的消息积压量相加以得到消息积压总量;
步骤A2:针对一个分区,将所述分区的消息积压量与所述消息积压总量的比值乘以所述消息消费总速率以得到所述分区的消息消费速率。
在本实施例中,会事先配置Kafka的消息消费总速率;当Spark中的各个执行节点执行一个批次中的多个消息任务时,Kafka中的各个分区的消息消费速率的总和不能大于所述消息消费总速率。
所述消息消费速率用于表征Spark中的执行节点在单位时间内可以从Kafka中对应的分区上获取的最大消息数量。
步骤S204:分别将每个分区的消息消费速率添加到对应的消息任务中,并将所述多个消息任务发送至Spark中对应的执行节点,以供执行节点按照消息任务中的消息消费速率从对应的分区中获取消息。
在本实施例中,Spark中的驱动节点分别为Kafka中的每个分区创建对应的消息任务,并将创建的消息任务发送至对应的执行节点;需要说明的是,驱动节点可以将多个消息任务发送至一个执行节点中,执行节点可以多线程分布式的执行多个消息任务;执行节点在执行消息任务时,从对应的分区中按照消息任务中的消息消费速率拉取消息。
具体的,所述分别将每个分区的消息消费速率添加到对应的消息任务中的步骤,具体包括:
步骤B1:针对一个消息任务,确定出与所述消息任务对应的分区的消息消费速率,并确定出与所述消息任务对应的执行节点的反压消费速率;其中,所述反压消费速率是利用Spark的反压机制(Backpressure)计算出的所述执行节点的最大消费速率;
其中,Spark Streaming从V1.5开始使用反压机制,反压机制是通过速率控制器RateController来监听“批量完成OnBatchCompleted”事件,并从中获取处理延迟信息processingDelay及调度延迟信息schedulingDelay,最终由估算节点Estimator依据这些信息估算出最大消费速率(rate)。
步骤B2:获取预先为所有分区配置的统一的最大消费速率;
在本实施例中,还可以为Kafka的各个分区统一的设置最大消费速率,以用于限制各个分区的消息消费速率不能超过所述最大消费速率。
步骤B3:从与所述消息任务对应的消息消费速率、反压消费速率和所述最大消费速率中确定出最小消费速率,并将所述最小消费速率添加到所述消息任务中。
进一步的,所述分别将每个分区的消息消费速率添加到对应的消息任务中,具体包括:
步骤C1:将每个分区的消息消费速率乘以所述设定时间间隔以得到每个分区的消息消费量;
步骤C2:分别将每个分区的消息消费量添加到对应的消息任务中。
在本实施例中,Spark的驱动节点按照所述设定时间间隔定期生成一批消息任务,每个消息任务包含根据对应分区的积压消息量生成的消息消费量,并将一批次的各个消息任务分别发送至对应的执行节点中。
此外,所述消息消费量也可以是根据步骤B3中的最小消费速率乘以所述设定时间间隔得到的。
更进一步的,在所述分别将每个分区的消息消费量添加到对应的消息任务中的步骤之前,所述方法还包括:
判断所述消息消费量的值是否为0,若是,则将所述消息消费量的值修改为设定值;其中,所述设定值为正正数。
优选的,所述设定值为1;在本实施例中,为了避免某一分区不会被消费消息的情况出现,若某个分区的消息消费量的值为0,则强制将消息消费量的值修改为1,以从该分区中至少消费1条消息。
通过上述方法,在设定Kafka的消息消费总速率的情况下,动态的根据Kafka中的各个分区的积压消息量,按照比例计算出各个分区的消息消费率,从而避免了部分分区的积压消费量过大的情况出现;此外,还可以限制所有分区的消息消费率的总和不超过设定的消息消费总速率。
实施例二
本发明实施例提供了一种限制消息消费速率的装置,所述装置具体的应用于如图1所示的Spark中的驱动节点;图3为本发明实施例二提供的限制消息消费速率的装置的一种可选的组成结构示意图,如图3所示,该装置具体包括以下组成部分:
创建模块301,用于当所述驱动节点按照设定时间间隔定期创建多个消息任务时,获取Kafka的各个分区的消息积压量;其中,一个消息任务对应一个分区,所述消息积压量为分区中未处理的消息数量;
获取模块302,用于获取预先配置的消息消费总速率;
计算模块303,用于根据所述消息消费总速率以及每个分区的消息积压量,按照比例计算出每个分区的消息消费速率;其中,所有分区的消息消费速率的总和小于等于所述消息消费总速率;
发送模块304,用于分别将每个分区的消息消费速率添加到对应的消息任务中,并将所述多个消息任务发送至Spark中对应的执行节点,以供执行节点按照消息任务中的消息消费速率从对应的分区中获取消息。
具体的,创建模块301,用于:
针对一个分区,获取所述分区的总消息偏移量和已消费消息偏移量;将所述总消息偏移量与所述已消费消息偏移量的差值作为所述分区的消息积压量。
需要说明的是,一个分区的总消息偏移量用于表征所述分区产生的消息的总数量;一个分区的已消费消息偏移量用于表征Spark中的执行节点已从所述分区中获取的消息的总数量。在实际应用中,Kafka会记录每个分区的总消息偏移量和已消费消息偏移量,Spark的驱动节点可以直接从Kafka中获取一个分区的总消息偏移量和已消费消息偏移量。
计算模块303,用于:
将所有分区的消息积压量相加以得到消息积压总量;针对一个分区,将所述分区的消息积压量与所述消息积压总量的比值乘以所述消息消费总速率以得到所述分区的消息消费速率。
其中,所述消息消费总速率用于表征在单位时间内可以从Kafka的各个分区中获取的最大消息数量;例如,每秒十万条消息。所述消息消费速率用于表征Spark中的执行节点在单位时间内可以从Kafka中对应的分区上获取的最大消息数量。
发送模块304,用于:
针对一个消息任务,确定出与所述消息任务对应的分区的消息消费速率,并确定出与所述消息任务对应的执行节点的反压消费速率;其中,所述反压消费速率是利用Spark的反压机制计算出的所述执行节点的最大消费速率;获取预先为所有分区配置的统一的最大消费速率;从与所述消息任务对应的消息消费速率、反压消费速率和所述最大消费速率中确定出最小消费速率,并将所述最小消费速率添加到所述消息任务中。
进一步的,发送模块304,还用于:
将每个分区的消息消费速率乘以所述设定时间间隔以得到每个分区的消息消费量;分别将每个分区的消息消费量添加到对应的消息任务中。
更进一步的,所述装置还包括:
判断模块,用于在所述分别将每个分区的消息消费量添加到对应的消息任务中之前,判断所述消息消费量的值是否为0,若是,则将所述消息消费量的值修改为设定值;其中,所述设定值为正正数。
优选的,所述设定值为1;在本实施例中,为了避免某一分区不会被消费消息的情况出现,若某个分区的消息消费量的值为0,则强制将消息消费量的值修改为1,以从该分区中至少消费1条消息。
通过上述装置,在设定Kafka的消息消费总速率的情况下,动态的根据Kafka中的各个分区的积压消息量,按照比例计算出各个分区的消息消费率,从而避免了部分分区的积压消费量过大的情况出现;此外,还可以限制所有分区的消息消费率的总和不超过设定的消息消费总速率。
实施例三
本实施例还提供一种计算机设备,如可以执行程序的智能手机、平板电脑、笔记本电脑、台式计算机、机架式服务器、刀片式服务器、塔式服务器或机柜式服务器(包括独立的服务器,或者多个服务器所组成的服务器集群)等。如图4所示,本实施例的计算机设备40至少包括但不限于:可通过***总线相互通信连接的存储器401、处理器402。需要指出的是,图4仅示出了具有组件401-402的计算机设备40,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。
本实施例中,存储器401(即可读存储介质)包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘等。在一些实施例中,存储器401可以是计算机设备40的内部存储单元,例如该计算机设备40的硬盘或内存。在另一些实施例中,存储器401也可以是计算机设备40的外部存储设备,例如该计算机设备40上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。当然,存储器401还可以既包括计算机设备40的内部存储单元也包括其外部存储设备。在本实施例中,存储器401通常用于存储安装于计算机设备40的操作***和各类应用软件。此外,存储器401还可以用于暂时地存储已经输出或者将要输出的各类数据。
处理器402在一些实施例中可以是中央处理器(Central Processing Unit,CPU)、控制器、微控制器、微处理器、或其他数据处理芯片。该处理器402通常用于控制计算机设备40的总体操作。
具体的,在本实施例中,处理器402用于执行处理器402中存储的限制消息消费速率的方法的程序,所述限制消息消费速率的方法的程序被执行时可以实现如下步骤:
当所述驱动节点按照设定时间间隔定期创建多个消息任务时,获取Kafka的各个分区的消息积压量;其中,一个消息任务对应一个分区,所述消息积压量为分区中未处理的消息数量;
获取预先配置的消息消费总速率;
根据所述消息消费总速率以及每个分区的消息积压量,按照比例计算出每个分区的消息消费速率;其中,所有分区的消息消费速率的总和小于等于所述消息消费总速率;
分别将每个分区的消息消费速率添加到对应的消息任务中,并将所述多个消息任务发送至Spark中对应的执行节点,以供执行节点按照消息任务中的消息消费速率从对应的分区中获取消息。
上述方法步骤的具体实施例过程可参见第一实施例,本实施例在此不再重复赘述。
实施例四
本实施例还提供一种计算机可读存储介质,如闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘、服务器、App应用商城等等,其上存储有计算机程序,所述计算机程序被处理器执行时可以实现如下方法步骤:
当所述驱动节点按照设定时间间隔定期创建多个消息任务时,获取Kafka的各个分区的消息积压量;其中,一个消息任务对应一个分区,所述消息积压量为分区中未处理的消息数量;
获取预先配置的消息消费总速率;
根据所述消息消费总速率以及每个分区的消息积压量,按照比例计算出每个分区的消息消费速率;其中,所有分区的消息消费速率的总和小于等于所述消息消费总速率;
分别将每个分区的消息消费速率添加到对应的消息任务中,并将所述多个消息任务发送至Spark中对应的执行节点,以供执行节点按照消息任务中的消息消费速率从对应的分区中获取消息。
上述方法步骤的具体实施例过程可参见第一实施例,本实施例在此不再重复赘述。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。