CN112559445B - 数据写入方法及装置 - Google Patents
数据写入方法及装置 Download PDFInfo
- Publication number
- CN112559445B CN112559445B CN202011456750.1A CN202011456750A CN112559445B CN 112559445 B CN112559445 B CN 112559445B CN 202011456750 A CN202011456750 A CN 202011456750A CN 112559445 B CN112559445 B CN 112559445B
- Authority
- CN
- China
- Prior art keywords
- data
- written
- temporary file
- writing
- detection point
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/11—File system administration, e.g. details of archiving or snapshots
- G06F16/128—Details of file system snapshots on the file-level, e.g. snapshot creation, administration, deletion
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
- G06F16/273—Asynchronous replication or reconciliation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请实施例提供了一种数据写入方法,方法包括:从数据源中获取待写入至分布式文件系统HDFS的待写入数据;将待写入数据写入至缓存中的临时文件中,并在临时文件的大小达到预设值时,将临时文件中的数据写入至HDFS的数据节点中;定时触发检测点操作,以暂停将临时文件中的数据写入至数据节点中,并通过快照的方式记录在执行检测点操作时从数据源中获取到的待写入数据在数据源中的第一位置及在执行检测点操作时数据写入至数据节点的第二位置;在执行完检测点操作后,根据第二位置继续将临时文件中的剩余数据写入至数据节点中。本申请可以使得管道中的数据可以被及时写入至HDFS中,避免了管道拥堵。
Description
技术领域
本申请实施例涉及数据处理技术领域,尤其涉及一种数据写入方法及装置。
背景技术
随着网络技术的飞速发展,许多企业和团体通过数据报表的方式来对每一天收集到的数据进行分析。现有技术中,为了生成数据报表,一般是在第二天凌晨采用Flink集群的方式不断从Kafka中获取当天的数据并写入分布式文件系统HDFS中;之后,为了展示每天收集的数据,每天定时通过Spark程序将前一天收集到的HFDS中的数据导入到报表系统(例如,ES)中以便快速查询以及制定数据报表。
然而,发明人发现,现有技术中在将数据写入至HDFS中时,经常会出现写入数据的管道出现拥堵的情况,导致数据写入至报表系统出现延迟,进而导致生成报表的时间发生延迟。
发明内容
本申请实施例的目的是提供一种数据写入方法、装置、计算机设备及计算机可读存储介质,可以用于解决现有技术中在将数据写入至HDFS中时,经常会出现写入数据的管道出现拥堵的情况的问题。
本申请实施例的一个方面提供了一种数据写入方法,所述方法包括:
从数据源中获取待写入至分布式文件系统HDFS的待写入数据;
将所述待写入数据写入至缓存中的临时文件中,并在所述临时文件的大小达到预设值时,将所述临时文件中的数据写入至所述HDFS的数据节点中;
定时触发检测点操作,以暂停将所述临时文件中的数据写入至所述数据节点中,并通过快照的方式记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置;
在执行完所述检测点操作后,根据所述第二位置继续将所述临时文件中的剩余数据写入至所述数据节点中。
可选的,所述在所述临时文件的大小达到预设值的步骤之后,还包括:
通过异步的方式关闭所述临时文件。
可选的,所述通过异步的方式调用close函数关闭所述临时文件包括:
将关闭所述临时文件的消息发送至非主线程中;
通过所述非主线程关闭所述临时文件。
可选的,所述方法还包括:
在将所述临时文件中的数据写入至所述HDFS的数据节点失败时,获取最近一次执行所述检测点操作时所记录的从数据源中获取到的待写入数据在所述数据源中的第一位置;
根据获取到的所述第一位置以及写入至所述数据节点的所有临时文件中的数据的大小确定对所述数据节点中用于存储所述临时文件的数据块的截取长度;
根据所述截取长度对所述数据块进行截取;
在完成数据块的截取后,根据获取到的所述第一位置重新从所述数据源中获取待写入至所述HDFS的待写入数据,并将重新获得的所述待写入数据以数据覆盖的方式写入至所述临时文件中。
可选的,所述临时文件存在多个,将所述待写入数据写入至缓存中的临时文件中包括:
获取所述待写入数据对应的数据流标识;
根据所述数据流标识将所述待写入数据写入至与所述数据流标识相对应的临时文件中。
可选的,所述根据所述数据流标识将所述待写入数据写入至与所述数据流标识相对应的临时文件中的步骤之前,还包括:
判断所述缓存中是否存在与所述数据流标识相对应的临时文件;
若不存在,则在所述缓存中创建与所述数据流标识相对应的临时文件。
可选的,将所述临时文件中的数据写入至所述HDFS的数据节点中包括:
将多个临时文件中的数据通过一个管道写入至所述HDFS的数据节点中;
所述通过快照的方式记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置包括:
采用多线程并行快照的方式记录在执行所述检测点操作时从数据源中获取到的各个临时文件对应的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时各个临时文件中的数据写入至所述数据节点的第二位置。
本申请实施例的再一个方面提供了一种数据写入装置,包括:
获取模块,用于从数据源中获取待写入至分布式文件系统HDFS的待写入数据;
缓存模块,用于将所述待写入数据写入至缓存中的临时文件中,并在所述临时文件的大小达到预设值时,将所述临时文件中的数据写入至所述HDFS的数据节点中;
记录模块,用于定时触发检测点操作,以暂停将所述临时文件中的数据写入至所述数据节点中,并通过快照的方式记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置;
写入模块,用于在执行完所述检测点操作后,根据所述第二位置继续将所述临时文件中的剩余数据写入至所述数据节点中。
本申请实施例的再一个方面提供了一种计算机设备,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,上述处理器执行上述计算机程序时用于实现如上任一项所述的数据写入方法的步骤。
本申请实施例的又一个方面提供了一种计算机可读存储介质,其上存储有计算机程序,上述计算机程序被处理器执行时用于实现如上任一项所述的数据写入方法的步骤。
本申请实施例提供的数据写入方法、系统、计算机设备及计算机可读存储介质,通过从数据源中获取待写入至分布式文件系统HDFS的待写入数据;将所述待写入数据写入至缓存中的临时文件中,并在所述临时文件的大小达到预设值时,将所述临时文件中的数据写入至所述HDFS的数据节点中;定时触发检测点操作,以暂停将所述临时文件中的数据写入至所述数据节点中,并通过快照的方式记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置;在执行完所述检测点操作后,根据所述第二位置继续将所述临时文件中的剩余数据写入至所述数据节点中。本申请通过在执行检测点操作时,不会调用close函数关闭数据写入流,而是直接记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置,这样可以在执行完所述检测点操作后,可以从该第二位置开始继续将数据写入至数据节点中,从而可以无需新建文件来继续写入数据,进而可以节省新建文件的时间,以及节省调用close函数关闭数据写入流的时间。由于节省了上述操作的时间,因此管道中的数据可以被及时写入至HDFS中,避免了管道拥堵。
附图说明
图1示意性示出了实现本申请实施例的数据写入方法的应用环境示意图;
图2示意性示出了根据本申请一实施例的数据写入方法的流程图;
图3为意性示出了通过异步的方式调用close函数关闭所述临时文件的的步骤细化流程图;
图4示意性示出了将所述待写入数据写入至缓存中的临时文件中的步骤细化流程图;
图5示意性示出了根据所述数据流标识将所述待写入数据写入至与所述数据流标识相对应的临时文件中的步骤细化流程图;
图6示意性示出了另一实施例的数据写入方法的流程图;
图7示意性示出了根据本申请实施例的数据写入装置的框图;以及
图8示意性示出了根据本申请实施例的适于实现数据写入方法的计算机设备的硬件架构示意图。
具体实施方式
为了使本申请实施例的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本申请,并不用于限定本申请。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,在本发明中涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。
图1示意性示出了实现本申请实施例的数据写入方法的应用环境示意图,在示例性的实施方式中,该应用环境的系统可以包括以下几部分:数据源1、数据写入层2、数据存储层3和数据分析层4等。
所述数据源1,可以是从客户端采集上来后,并写入至数据存储系统中的数据,比如存储至Kafka集群中的数据。Kafka集群是一种消息分发订阅系统,在存储数据时,可以起到数据削峰填谷的作用。不同重要性、优先级、数据吞吐量的数据流,可以被分流到kafka集群中的不同的Topic(主题)中,以保障不同类型的数据流的价值,避免系统故障影响整体数据。
数据分发层2,可以由Flink集群组成的流量分发系统(Collector)实现,用于内容转换和分发存储,即保障数据流从数据源1中获取并写入到数据存储层3中对应的存储终端中。具体的,所述数据分发层2用于数据的分发落地,支持的分发场景包括HDFS(HadoopDistributed File System,Hadoop分布式文件系统)、Kafka、Hbase、ES(Elasticsearch)等,而在分发的过程中,由于不同存储终端的数据落地时效性要求可能不同,例如,HDFS的数据写入是按天进行任务的计算和应用,Kafka的数据写入一般是按秒进行任务的计算和应用,通常用于诸如实时推荐、实时计算等场景中。
所述数据存储层3,用于存储数据,各个终端可以由不同形式的数据库构成,所述数据库可以ES、Hive、Kafka、HDFS和Hbase等。
所述数据分析层4,用于从数据存储层3中拉取数据进行分析,比如进行数据报表的制作。
为了帮助理解所述数据写入系统的工作原理,下面对其提供的数据写入服务进行介绍:客户端通过HTTP、RPC等协议将这些数据上报存储至数据存储系统中,以形成数据源1,数据源1经过数据分发层2的分发,以将数据源发到数据存储层3中的终端中进行存储,之后,通过数据分析层从数据存储中拉取数据进行分析,得到数据分析结果,比如制作数据报表等。
图2示意性示出了根据本申请实施例一的数据写入方法的流程图。该数据写入方法应用于Flink集群中,可以理解,本方法实施例中的流程图不用于对执行步骤的顺序进行限定。下面以数据写入装置为执行主体进行示例性描述。如图2所示,该数据写入方法可以包括步骤S20~步骤S23,其中:
步骤S20,从数据源中获取待写入至分布式文件系统HDFS的待写入数据。
具体地,所述数据源可以为各种类型的数据存储系统,比如,Kafka集群,HBase等。
数据源以Kafka集群为例,数据写入装置可以从Kafka集群的topic中消费数据,并将该消费出的数据作为写入至分布式文件系统HDFS的待写入数据。
其中,分布式文件系统(Hadoop Distributed File System,HDFS)采用主从(Master/Slave)架构进行文件存储。一个HDFS集群由一个Namenode(名字节点)和多个Datanode(数据节点)组成。Namenode是一个中心服务器,负责文件系统的名字空间的操作,比如打开、关闭、重命名文件或目录,它负责维护文件路径到数据块的映射,数据块到Datanode的映射,以及监控Datanode的心跳和维护数据块副本的个数。而NameNode的元数据信息是放在主内存中的,一条记录大概占150个字节,它的结构主要包括:(1)文件列表信息;(2)每个文件对应的文件块的信息;(3)每个文件块对应的DataNode的信息;(4)文件属性,如创建时间、创建这,副本个数等。Datanode负责处理客户端的读写请求,它在Namenode统一调度下进行数据块的创建、删除和复制,一般一个物理节点(机器)上部署一个。
步骤S21,将所述待写入数据写入至缓存中的临时文件中,并在所述临时文件的大小达到预设值时,将所述临时文件中的数据写入至所述HDFS的数据节点中。
具体地,数据写入装置在将待写入数据写入至HDFS中时,并不会立即将待写入数据写入至HDFS中,而是会将该待写入数据先写入至本地的缓存中。可以理解的是,为了便于将该待写入数据写入至本地的缓存中,需要预先在缓存中建立一个临时文件来存储该待写入的数据。这样,当获取到待写入数据之后,即可以将该待写入数据写入至该临时文件中。
本实施例中,在将待写入文件写入至该临时文件时,会判断写入该临时文件中的数据的大小是否达到预设值,在达到所述预设值时,会触发临时文件滚动操作,以将该临时文件写入至HDFS的数据节点中,实现数据的持久化保存;在判断出写入该临时文件中的数据的大小没有达到预设值时,则可以继续向该临时文件中写入数据。
其中,所述预设值为预先设定的,该预设值的具体值由HDFS中的数据块(block)大大小确定,比如,该数据块的大小为64M,则该预设值也为64M;当该数据块的大小为128M时,则该预设值为128M。
本实施例中,在将临时文件写入至所述HDFS的数据节点时,会执行以下步骤:步骤1、数据写入装置会先通过FileSystem的create函数发出创建文件请求;步骤2,FileSystem通过RPC协议将请求发送给Namenode;步骤3,在Namenode的Namespace里面创建一个新的文件,同时Namenode返回可用的Datanode(数据节点),假设该可用的数据节点为Datanode1、Datanode2及Datanode3;步骤4,FileSystem返回一个FSDataOutputStream给数据写入装置,用于写入数据;步骤5,数据写入装置调用FSDataOutputStream的write函数;步骤6,数据写入装置开始以流式方式将该临时文件中的数据写入Datanode,具体而言,会将该临时文件中的数据按64k的package划分;然后将第一个package发送给第一个Datanode1;Datanode1接收完后,将第一个package发送给Datanode2,同时,向Datanode1发送第二个package;Datanode2接收完第一个package后,发送给Datanode3,同时接收Datanode1发来的第二个package;(5)以此类推,直到将该临时文件中的数据发送完毕;步骤7,Datanode1,Datanode2,Datanode3向NameNode,Datanode1向数据写入装置发送临时文件中的数据发送成功的消息。
在一示例性的实施方式中,为了避免当临时文件中的大小达到预设值时,仍向该临时文件中写入数据,导致该临时文件的大小超过所述预设值,在本实施例中,所述在所述临时文件的大小达到预设值的步骤之后,还包括:
通过异步的方式关闭所述临时文件。
具体地,现有技术中,为了避免该临时文件的大小超过所述预设值,采用的是同步的方式调用close函数关闭所述临时文件,即通过主线程调用close函数关闭所述临时文件。然而,在采用主线程调用close函数关闭所述临时文件时,将使将该临时文件中的数据不能立即写入至HDFS中,可能会导致管道拥堵。因此,在本申请中,在需要对临时文件进行关闭时,可以采用异步的方式调用close函数关闭所述临时文件,以便可以在关闭该临时文件时,还能继续将临时文件中的数据写入至HDFS中。
在一示例性的实施方式中,参照图3,所述通过异步的方式调用close函数关闭所述临时文件包括:
步骤S30,将关闭所述临时文件的消息发送至非主线程中。
步骤S31,通过所述非主线程关闭所述临时文件。
具体地,非主线程为不是用于将临时文件中的数据写入至HDFS中的线程。本实施例中,在检测到该临时文件需要关闭时,可以将关闭所述临时文件的消息发送给非主线程,这样,非主线程可以调用close函数来关闭所述临时文件。
本实施例中,通过非主线程来关系该临时文件,可以降低管道堵塞的风险。
在一示例性的实施方式中,所述待写入数据可以为不同数据流的数据,而不同的数据流中的数据其类型一般不同,因此,本实施例中,为了区分不同数据流中的待写入数据,可以将不同数据流的待写入数据分别写入至不同类型的临时文件中。作为示例,参照图4,将所述待写入数据写入至缓存中的临时文件中包括:
步骤S41,获取所述待写入数据对应的数据流标识。
具体地,每一个待写入数据都携带有数据流标识,该数据流标识为唯一区别不同数据流的数据的标识,该标识可以为logId。
步骤S42,根据所述数据流标识将所述待写入数据写入至与所述数据流标识相对应的临时文件中。
具体地,缓存中存储有各个数据流对应的临时文件,通过数据流标识可以找到与该数据流标识相对应的临时文件。
在一示例性的实施方式中,参照图5,所述根据所述数据流标识将所述待写入数据写入至与所述数据流标识相对应的临时文件中包括:
步骤S50,判断所述缓存中是否存在与所述数据流标识相对应的临时文件;
步骤S51,若不存在,则在所述缓存中创建与所述数据流标识相对应的临时文件。
具体地,当所述待写入数据第一次写入至缓存中时,该缓存中是不存在用于存储该待写入数据的临时文件的。因此,为了可以将该待写入数据文件写入缓存中,可以先根据该待写入数据中的数据流标识判断缓存中是否已经存在与该数据流标识相对应的临时文件,若存在,则可以直接将该待写入数据写入至该临时文件中,若不存在,则需要在缓存中创建一个与所述数据流标识相对应的临时文件,之后,即可以将该待写入数据写入至该临时文件中。
可以理解的是,由于Flink集群在将数据写入至HDFS时,是采用管道pipeline的方式实现的,而管道写入数据时,是支持并行数据写入的,因此,在本实施例中,当临时文件存在多个时,也可以将该多个临时文件中的数据通过一个管道(pipeline)写入至所述HDFS的数据节点中。
步骤S22,定时触发检测点操作,以暂停将所述临时文件中的数据写入至所述数据节点中,并通过快照的方式记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置。
具体地,触发检测点(checkpoint)操作的时间间隔可以由用户预先设定,也可以采用默认值,在本实施例中不作限定。
检测点操作,又称检测点机制,通过该机制可以保证Flink集群在某个算子因为某些原因出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保证应用流图状态的一致性。具体而言,通过该检测点操作可以将正在运行的任务的状态保存下来,这个状态包括任务中每个算子的state(状态),数据源中的消息的offset(偏移量)等。
需要说明的是,检测点是Flink集群实现容错机制最核心的功能,它能够根据配置周期性地基于Stream中各个Operator/task的状态来生成SnapShot(快照),从而将这些状态数据定期持久化存储下来,当Flink程序一旦意外崩溃时,重新运行程序时可以有选择地从这些快照进行恢复,从而修正因为故障带来的程序数据异常。快照的核心概念之一是barrier。这些barrier被注入数据流并与数据流中的数据(或者称为记录)一起作为数据流的一部分向下流动。barriers永远不会超过记录,数据流严格有序,barrier将数据流中的记录隔离成一系列的记录集合,并将一些集合中的数据加入到当前的快照中,而另一些数据加入到下一个快照中。每个barrier都带有快照的ID,并且barrier之前的记录都进入了该快照。
所述第一位置为在执行该检测点操作时,当前从数据源中消费到的数据的位置。作为示例,假设该数据源为kafka集群,且在执行该检测点操作时,刚好消费到Topic0中的partition1中的offset(偏移量)为1000的数据,则该第一位置即为(Topic0,partition1,1000)。
所述第二位置为在执行该检测点操作时,当前将数据写入到数据节点的位置。作为示例,假设在执行该检测点操作时,刚好将数据写入至Datanode1上存储的文件A的第三个数据块的offset(偏移量)为2000的位置,则该第二位置为(文件A,Datanode1,数据块3,2000)。
在一示例性的实施方式中,当通过管道的方式将多个临时文件中的数据写入至HDFS时,则在执行检测点操作时,为了提高快照的速度,可以采用采用多线程并行快照的方式记录在执行所述检测点操作时从数据源中获取到的各个临时文件对应的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时各个临时文件中的数据写入至所述数据节点的第二位置。
其中,所述多线程并行快照的方式指的是针对每一个临时文件的快照,都使用一个线程进行,并且各个线程是通过并行的方式执行快照的,这样,在针对多个临时文件进行快照时,可以花很短的时间就完成对所有的临时文件的快照操作。
本实施例中,通过多线程并行快照的方式记录所述第一位置和所述第二位置,相对于现有技术采用串行的方式记录所述第一位置和第二位置,可以极大的缩短快照的时间,进而可以避免数据在管道中堵塞。
步骤S23,在执行完所述检测点操作后,根据所述第二位置继续将所述临时文件中的剩余数据写入至所述数据节点中。
具体地,在现有技术中,在执行检测点操作时,会将当前待写入数据所属的文件进行斩断,即会调用close函数关闭当前数据所写入的文件,这样,在执行完该检测点操作后,若需要继续将数据写入至HDFS中,则需要新建一个文件,然后,将数据写入至新建的文件中。
然而,本申请在执行完成检测点操作后,并不会将文件进行关闭,而会继续将临时文件中的剩余数据从该第二位置开始继续写入至数据节点中。比如,若在执行检测点操作时,该临时文件中的数据写入至数据节点的第二位置为(文件A,Datanode1,数据块3,2000),则在执行完检测点操作后,会继续将该临时文件中剩余没有写入至数据节点中的数据继续从该Datanode1中的数据块3的偏移量为2000的位置继续写入,而不用新建一个文件来存储该临时文件中剩余没有写入的数据。
通过从数据源中获取待写入至分布式文件系统HDFS的待写入数据;将所述待写入数据写入至缓存中的临时文件中,并在所述临时文件的大小达到预设值时,将所述临时文件中的数据写入至所述HDFS的数据节点中;定时触发检测点操作,以暂停将所述临时文件中的数据写入至所述数据节点中,并通过快照的方式记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置;在执行完所述检测点操作后,根据所述第二位置继续将所述临时文件中的剩余数据写入至所述数据节点中。本申请通过在执行检测点操作时,不会调用close函数关闭数据写入流,而是直接记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置,这样可以在执行完所述检测点操作后,可以从该第二位置开始继续将数据写入至数据节点中,从而可以无需新建文件来继续写入数据,进而可以节省新建文件的时间,以及节省调用close函数关闭数据写入流的时间。由于节省了上述操作的时间,因此管道中的数据可以被及时写入至HDFS中,避免了管道拥堵。
在一示例性的实施方式中,参照图6,所述数据写入方法还包括:
步骤S60,在将所述临时文件中的数据写入至所述HDFS的数据节点失败时,获取最近一次执行所述检测点操作时所记录的从数据源中获取到的待写入数据在所述数据源中的第一位置。
作为示例,假如我们设置了三分钟进行一次检测点操作,在将所述临时文件中的数据写入至所述HDFS的数据节点失败之前,已经执行了100次检测点操作,且在执行第100次检测点操作时所记录的第一位置为(Topic0,partition1,1000),则在写入数据失败时,即可以通过该第一位置来恢复数据的写入。
步骤S61,根据获取到的所述第一位置以及所述数据节点中存储的所有临时文件中的数据的大小确定对所述数据节点中用于存储所述临时文件的数据块的截取长度。
具体地,由于该第一位置记录了已经从数据源中消费的数据的偏移量(offset),根据该偏移量可以计算出已经从数据源中消费的数据的大小。
在确定已经消费的数据的大小之后,即可以将该确定的数据的大小与写入至所述数据节点的所有临时文件中的数据的大小定进行比较,然后根据比较结果来确定数据块的截取长度,其中,所述截取长度为需要截取的数据的大小。
作为示例,假设该确定的数据的大小为150M,在数据节点中每一个数据块的大小最大为64M,在数据节点中共有3个数据块存储了所有临时文件中的数据,且该三个数据块的总大小为180M,则可以确定需要将第三个数据块中后面存储的30M数据截取掉。
步骤S62,根据所述截取长度对所述数据块进行截取。
具体地,可以调用truncate命令对数据块进行截取,所述truncate命令为HDFS中用于对数据块进行截断的命令,通过该命令可以将数据块截断成指定的大小。
在本实施例中,在获取到截取长度后,即可以根据该长度确定待截取的数据块,在确定截取的数据块之后,可以进一步根据该截取长度确定该数据块内部需要移除的偏移量,然后根据该偏移量将该数据块中所有在该偏移量之后的数据进行删除,从而完成数据块的截取。
步骤S63,在完成数据块的截取后,根据获取到的所述第一位置重新从所述数据源中获取待写入至所述HDFS的待写入数据,并将重新获得的所述待写入数据以数据覆盖的方式写入至所述临时文件中。
具体地,所述数据覆盖的方式写入数据至临时文件中指的是将新写入的数据覆盖该临时文件中已经存储的数据。具体而言,在将重新获得的数据写入至临时文件中时,可以先将该临时文件中已经存储的数据都删除掉,然后再将数据写入至该临时文件中;也可以在边写入数据的过程中边擦除该临时文件中已经存储的数据。
本实施例中,在数据写入至数据节点失败时,通过调用truncate命令对所述数据块进行截取,从而将数据节点中存在脏数据删除,以及将重新获得的数据以数据覆盖的方式写入至临时文件中,以将临时文件中存在的脏数据删除,这样,可以避免将数据重复写入至数据节点的情况。
图7示出了根据本申请实施例的数据写入装置的框图,该数据写入装置700可以被分割成一个或多个程序模块,一个或者多个程序模块被存储于存储介质中,并由一个或多个处理器所执行,以完成本申请实施例。本申请实施例所称的程序模块是指能够完成特定功能的一系列计算机程序指令段,以下描述将具体介绍本实施例中各程序模块的功能。如图7所示,数据写入装置700可以包括:获取模块701、缓存模块702、记录模块703及写入模块704。
所述获取模块701,用于从数据源中获取待写入至分布式文件系统HDFS的待写入数据;
缓存模块702,用于将所述待写入数据写入至缓存中的临时文件中,并在所述临时文件的大小达到预设值时,将所述临时文件中的数据写入至所述HDFS的数据节点中;
记录模块703,用于定时触发检测点操作,以暂停将所述临时文件中的数据写入至所述数据节点中,并通过快照的方式记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置;
写入模块704,用于在执行完所述检测点操作后,根据所述第二位置继续将所述临时文件中的剩余数据写入至所述数据节点中。
在一示例性的实施方式中,数据写入装置700还包括调用模块。
所述调用模块,用于通过异步的方式关闭所述临时文件。
在一示例性的实施方式中,所述调用模块,还用于将关闭所述临时文件的消息发送至非主线程中;通过所述非主线程关闭所述临时文件。
在一示例性的实施方式中,数据写入装置700还包括确定模块、截取模块。
所述获取模块701,还用于在将所述临时文件中的数据写入至所述HDFS的数据节点失败时,获取最近一次执行所述检测点操作时所记录的从数据源中获取到的待写入数据在所述数据源中的第一位置。
所述确定模块,用于根据获取到的所述第一位置以及写入至所述数据节点的所有临时文件中的数据的大小确定对所述数据节点中用于存储所述临时文件的数据块的截取长度;
所述截取模块,用于根据所述截取长度对所述数据块进行截取;
所述写入模块704,还用于在完成数据块的截取后,根据获取到的所述第一位置重新从所述数据源中获取待写入至所述HDFS的待写入数据,并将重新获得的所述待写入数据以数据覆盖的方式写入至所述临时文件中。
在一示例性的实施方式中,所述临时文件存在多个,缓存模块702,还用于获取所述待写入数据对应的数据流标识;根据所述数据流标识将所述待写入数据写入至与所述数据流标识相对应的临时文件中。
在一示例性的实施方式中,缓存模块702,还用于判断所述缓存中是否存在与所述数据流标识相对应的临时文件;若不存在,则在所述缓存中创建与所述数据流标识相对应的临时文件。
在一示例性的实施方式中,缓存模块702,还用于将多个临时文件中的数据通过一个管道写入至所述HDFS的数据节点中。
记录模块703,还用于采用多线程并行快照的方式记录在执行所述检测点操作时从数据源中获取到的各个临时文件对应的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时各个临时文件中的数据写入至所述数据节点的第二位置。
图8示意性示出了根据本申请实施例的适于实现数据写入方法的计算机设备的硬件架构示意图。本实施例中,计算机设备20是一种能够按照事先设定或者存储的指令,自动进行数值计算和/或信息处理的设备。例如,可以是网关等数据转发设备。如图8所示,计算机设备20至少包括但不限于:可通过系统总线相互通信连接存储器21、处理器22、网络接口23。其中:
存储器21至少包括一种类型的计算机可读存储介质,可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘等。在一些实施例中,存储器21可以是计算机设备20的内部存储模块,例如该计算机设备20的硬盘或内存。在另一些实施例中,存储器21也可以是计算机设备20的外部存储设备,例如该计算机设备20上配备的插接式硬盘,智能存储卡(Smart Media Card,简称为SMC),安全数字(Secure Digital,简称为SD)卡,闪存卡(FlashCard)等。当然,存储器21还可以既包括计算机设备20的内部存储模块也包括其外部存储设备。本实施例中,存储器21通常用于存储安装于计算机设备20的操作系统和各类应用软件,例如数据写入方法的程序代码等。此外,存储器21还可以用于暂时地存储已经输出或者将要输出的各类数据。
处理器22在一些实施例中可以是中央处理器(Central Processing Unit,简称为CPU)、控制器、微控制器、微处理器、或其他数据处理芯片。该处理器22通常用于控制计算机设备20的总体操作,例如执行与计算机设备20进行数据交互或者通信相关的控制和处理等。本实施例中,处理器22用于运行存储器21中存储的程序代码或者处理数据。
网络接口23可包括无线网络接口或有线网络接口,该网络接口23通常用于在计算机设备20与其他计算机设备之间建立通信连接。例如,网络接口23用于通过网络将计算机设备20与外部终端相连,在计算机设备20与外部终端之间的建立数据写入通道和通信连接等。网络可以是企业内部网(Intranet)、互联网(Internet)、全球移动通讯系统(GlobalSystem of Mobile communication,简称为GSM)、宽带码分多址(Wideband Code DivisionMultiple Access,简称为WCDMA)、4G网络、5G网络、蓝牙(Bluetooth)、Wi-Fi等无线或有线网络。
需要指出的是,图8仅示出了具有部件21-23的计算机设备,但是应理解的是,并不要求实施所有示出的部件,可以替代的实施更多或者更少的部件。
在本实施例中,存储于存储器21中的数据写入方法还可以被分割为一个或者多个程序模块,并由一个或多个处理器(本实施例为处理器22)所执行,以完成本发明。
本实施例还提供一种计算机可读存储介质,计算机可读存储介质其上存储有计算机程序,计算机程序被处理器执行时实现实施例中的数据写入方法的步骤。
本实施例中,计算机可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘等。在一些实施例中,计算机可读存储介质可以是计算机设备的内部存储单元,例如该计算机设备的硬盘或内存。在另一些实施例中,计算机可读存储介质也可以是计算机设备的外部存储设备,例如该计算机设备上配备的插接式硬盘,智能存储卡(Smart Media Card,简称为SMC),安全数字(Secure Digital,简称为SD)卡,闪存卡(Flash Card)等。当然,计算机可读存储介质还可以既包括计算机设备的内部存储单元也包括其外部存储设备。本实施例中,计算机可读存储介质通常用于存储安装于计算机设备的操作系统和各类应用软件,例如实施例中的数据写入方法的程序代码等。此外,计算机可读存储介质还可以用于暂时地存储已经输出或者将要输出的各类数据。
显然,本领域的技术人员应该明白,上述的本发明实施例的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明实施例不限制于任何特定的硬件和软件结合。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (10)
1.一种数据写入方法,其特征在于,所述方法包括:
从数据源中获取待写入至分布式文件系统HDFS的待写入数据;
将所述待写入数据写入至缓存中的临时文件中,并在所述临时文件的大小达到预设值时,将所述临时文件中的数据写入至所述HDFS的数据节点中;
定时触发检测点操作,以暂停将所述临时文件中的数据写入至所述数据节点中,并通过快照的方式记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置,所述第二位置包括数据写入至数据节点的文件名、数据块名及数据块的偏移量;
在执行完所述检测点操作后,根据所述第二位置继续将所述临时文件中的剩余数据写入至所述数据节点中。
2.根据权利要求1所述的数据写入方法,其特征在于,所述在所述临时文件的大小达到预设值的步骤之后,还包括:
通过异步的方式关闭所述临时文件。
3.根据权利要求2所述的数据写入方法,其特征在于,所述通过异步的方式关闭所述临时文件包括:
将关闭所述临时文件的消息发送至非主线程中;
通过所述非主线程关闭所述临时文件。
4.根据权利要求1所述的数据写入方法,其特征在于,所述方法还包括:
在将所述临时文件中的数据写入至所述HDFS的数据节点失败时,获取最近一次执行所述检测点操作时所记录的从数据源中获取到的待写入数据在所述数据源中的第一位置;
根据获取到的所述第一位置以及写入至所述数据节点的所有临时文件中的数据的大小确定对所述数据节点中用于存储所述临时文件的数据块的截取长度;
根据所述截取长度对所述数据块进行截取;
在完成数据块的截取后,根据获取到的所述第一位置重新从所述数据源中获取待写入至所述HDFS的待写入数据,并将重新获得的所述待写入数据以数据覆盖的方式写入至所述临时文件中。
5.根据权利要求1至4任一项所述的数据写入方法,其特征在于,所述临时文件存在多个,所述将所述待写入数据写入至缓存中的临时文件中包括:
获取所述待写入数据对应的数据流标识;
根据所述数据流标识将所述待写入数据写入至与所述数据流标识相对应的临时文件中。
6.根据权利要求5所述的数据写入方法,其特征在于,所述根据所述数据流标识将所述待写入数据写入至与所述数据流标识相对应的临时文件中的步骤之前,还包括:
判断所述缓存中是否存在与所述数据流标识相对应的临时文件;
若不存在,则在所述缓存中创建与所述数据流标识相对应的临时文件。
7.根据权利要求5所述的数据写入方法,其特征在于,将所述临时文件中的数据写入至所述HDFS的数据节点中包括:
将多个临时文件中的数据通过一个管道写入至所述HDFS的数据节点中;
所述通过快照的方式记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置包括:
采用多线程并行快照的方式记录在执行所述检测点操作时从数据源中获取到的各个临时文件对应的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时各个临时文件中的数据写入至所述数据节点的第二位置。
8.一种数据写入装置,其特征在于,包括:
获取模块,用于从数据源中获取待写入至分布式文件系统HDFS的待写入数据;
缓存模块,用于将所述待写入数据写入至缓存中的临时文件中,并在所述临时文件的大小达到预设值时,将所述临时文件中的数据写入至所述HDFS的数据节点中;
记录模块,用于定时触发检测点操作,以暂停将所述临时文件中的数据写入至所述数据节点中,并通过快照的方式记录在执行所述检测点操作时从数据源中获取到的待写入数据在所述数据源中的第一位置及在执行所述检测点操作时数据写入至所述数据节点的第二位置,所述第二位置包括数据写入至数据节点的文件名、数据块名及数据块的偏移量;
写入模块,用于在执行完所述检测点操作后,根据所述第二位置继续将所述临时文件中的剩余数据写入至所述数据节点中。
9.一种计算机设备,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时用于实现权利要求1至7任一项所述数据写入方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时用于实现权利要求1至7任一项所述数据写入方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011456750.1A CN112559445B (zh) | 2020-12-11 | 2020-12-11 | 数据写入方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011456750.1A CN112559445B (zh) | 2020-12-11 | 2020-12-11 | 数据写入方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112559445A CN112559445A (zh) | 2021-03-26 |
CN112559445B true CN112559445B (zh) | 2022-12-27 |
Family
ID=75061229
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011456750.1A Active CN112559445B (zh) | 2020-12-11 | 2020-12-11 | 数据写入方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112559445B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113568883B (zh) * | 2021-07-29 | 2024-06-04 | 上海哔哩哔哩科技有限公司 | 数据写入方法及装置 |
Citations (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102088490A (zh) * | 2011-01-19 | 2011-06-08 | 华为技术有限公司 | 数据存储方法、设备和系统 |
CN106254161A (zh) * | 2016-09-28 | 2016-12-21 | 上海爱数信息技术股份有限公司 | 基于hdfs的节点失效的快速检测与恢复方法及系统 |
US9679040B1 (en) * | 2010-05-03 | 2017-06-13 | Panzura, Inc. | Performing deduplication in a distributed filesystem |
CN107741947A (zh) * | 2017-08-30 | 2018-02-27 | 浙江九州量子信息技术股份有限公司 | 基于hdfs文件系统的随机数密钥的存储与获取方法 |
CN108984779A (zh) * | 2018-07-25 | 2018-12-11 | 郑州云海信息技术有限公司 | 分布式文件系统快照回滚元数据处理方法、装置及设备 |
CN109445955A (zh) * | 2018-09-13 | 2019-03-08 | 武汉斗鱼网络科技有限公司 | 一种计数方法及计数系统 |
CN109977090A (zh) * | 2019-01-25 | 2019-07-05 | 福建天泉教育科技有限公司 | 一种向hdfs写入数据的方法及终端 |
CN110928906A (zh) * | 2019-11-08 | 2020-03-27 | 杭州安恒信息技术股份有限公司 | 基于flink仅一次写入carbonData的方法 |
CN111125013A (zh) * | 2019-12-26 | 2020-05-08 | 北京锐安科技有限公司 | 一种数据入库方法、装置、设备及介质 |
CN111427851A (zh) * | 2020-03-13 | 2020-07-17 | 苏州浪潮智能科技有限公司 | 一种hdfs跨外部存储系统多层级存储效率优化的方法和设备 |
CN111694864A (zh) * | 2020-05-15 | 2020-09-22 | 苏宁云计算有限公司 | 单一进程的流式数据计算执行调度任务并避免数据丢失的方法、系统及计算机设备 |
CN111752545A (zh) * | 2020-06-25 | 2020-10-09 | 武汉众邦银行股份有限公司 | 一种支持数据重放的流计算方法 |
CN112000636A (zh) * | 2020-08-31 | 2020-11-27 | 民生科技有限责任公司 | 基于Flink流式处理的用户行为统计分析方法 |
-
2020
- 2020-12-11 CN CN202011456750.1A patent/CN112559445B/zh active Active
Patent Citations (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9679040B1 (en) * | 2010-05-03 | 2017-06-13 | Panzura, Inc. | Performing deduplication in a distributed filesystem |
CN102088490A (zh) * | 2011-01-19 | 2011-06-08 | 华为技术有限公司 | 数据存储方法、设备和系统 |
CN106254161A (zh) * | 2016-09-28 | 2016-12-21 | 上海爱数信息技术股份有限公司 | 基于hdfs的节点失效的快速检测与恢复方法及系统 |
CN107741947A (zh) * | 2017-08-30 | 2018-02-27 | 浙江九州量子信息技术股份有限公司 | 基于hdfs文件系统的随机数密钥的存储与获取方法 |
CN108984779A (zh) * | 2018-07-25 | 2018-12-11 | 郑州云海信息技术有限公司 | 分布式文件系统快照回滚元数据处理方法、装置及设备 |
CN109445955A (zh) * | 2018-09-13 | 2019-03-08 | 武汉斗鱼网络科技有限公司 | 一种计数方法及计数系统 |
CN109977090A (zh) * | 2019-01-25 | 2019-07-05 | 福建天泉教育科技有限公司 | 一种向hdfs写入数据的方法及终端 |
CN110928906A (zh) * | 2019-11-08 | 2020-03-27 | 杭州安恒信息技术股份有限公司 | 基于flink仅一次写入carbonData的方法 |
CN111125013A (zh) * | 2019-12-26 | 2020-05-08 | 北京锐安科技有限公司 | 一种数据入库方法、装置、设备及介质 |
CN111427851A (zh) * | 2020-03-13 | 2020-07-17 | 苏州浪潮智能科技有限公司 | 一种hdfs跨外部存储系统多层级存储效率优化的方法和设备 |
CN111694864A (zh) * | 2020-05-15 | 2020-09-22 | 苏宁云计算有限公司 | 单一进程的流式数据计算执行调度任务并避免数据丢失的方法、系统及计算机设备 |
CN111752545A (zh) * | 2020-06-25 | 2020-10-09 | 武汉众邦银行股份有限公司 | 一种支持数据重放的流计算方法 |
CN112000636A (zh) * | 2020-08-31 | 2020-11-27 | 民生科技有限责任公司 | 基于Flink流式处理的用户行为统计分析方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112559445A (zh) | 2021-03-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11086725B2 (en) | Orchestration of heterogeneous multi-role applications | |
US10831614B2 (en) | Visualizing restoration operation granularity for a database | |
US20190213085A1 (en) | Implementing Fault Domain And Latency Requirements In A Virtualized Distributed Storage System | |
US10817386B2 (en) | Virtual machine recovery method and virtual machine management device | |
US11907561B2 (en) | Data backup method and apparatus | |
CN113111129B (zh) | 数据同步方法、装置、设备及存储介质 | |
US11347684B2 (en) | Rolling back KUBERNETES applications including custom resources | |
CN109697112B (zh) | 分布式集约化一站式作业系统和实现方法 | |
CN110895488B (zh) | 任务调度方法及装置 | |
CN112506710B (zh) | 分布式文件系统数据修复方法、装置、设备及存储介质 | |
CN111177159B (zh) | 一种数据处理的系统、方法和数据更新设备 | |
CN114064414A (zh) | 一种高可用的集群状态监控方法及系统 | |
US10620871B1 (en) | Storage scheme for a distributed storage system | |
CN103716384A (zh) | 跨数据中心实现云存储数据同步的方法和装置 | |
CN112019605A (zh) | 数据流的数据分发方法和系统 | |
US20240129251A1 (en) | Data processing method and apparatus, computer device, and readable storage medium | |
CN112559445B (zh) | 数据写入方法及装置 | |
CN111666260A (zh) | 数据处理方法及装置 | |
CN112749142A (zh) | 句柄管理方法和系统 | |
CN111913927A (zh) | 一种数据写入方法、装置及计算机设备 | |
CN115473858A (zh) | 数据传输方法和流式数据传输系统 | |
CN114500289B (zh) | 控制平面恢复方法、装置、控制节点及存储介质 | |
US11036439B2 (en) | Automated management of bundled applications | |
KR20180132292A (ko) | 실시간 병목 자동 분석 방법 및 이러한 방법을 수행하는 장치 | |
CN113568883B (zh) | 数据写入方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |