本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,具體而言,涉及一種公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法及裝置、電子設(shè)備。
背景技術(shù):
公安卡口中車輛數(shù)據(jù)具有如下的典型特點(diǎn):
1、車輛數(shù)據(jù)中包含結(jié)構(gòu)化數(shù)據(jù)與圖像數(shù)據(jù)兩個(gè)部分。
2、數(shù)據(jù)檢索維度多,要求在3秒內(nèi)響應(yīng)查詢結(jié)果。
3、數(shù)據(jù)寫入時(shí)間段比較集中。數(shù)據(jù)寫入的吞吐時(shí)間段主要集中在早、中、晚高峰時(shí)段。
4、車輛原始圖像存儲(chǔ)需要支持快速的隨機(jī)讀取操作。需要在查詢得到結(jié)構(gòu)化數(shù)據(jù)時(shí),同時(shí)顯示出圖像數(shù)據(jù)。
5、不同類型數(shù)據(jù)的存儲(chǔ)時(shí)長(zhǎng)不同。一般地,結(jié)構(gòu)化數(shù)據(jù)要求長(zhǎng)期保持;而圖像數(shù)據(jù)要求保存1-3個(gè)月,并希望能夠支持自動(dòng)回滾。
6、數(shù)據(jù)量大。
通常地,地級(jí)市每天的數(shù)據(jù)量大約為200-800萬(wàn)左右;二線城市每天的數(shù)據(jù)量大約為1000-1500萬(wàn)左右;一線城市每天的數(shù)據(jù)量通常在3000萬(wàn)以上。
目前在公安卡口車輛數(shù)據(jù)存儲(chǔ)的建設(shè)中常用的技術(shù)主要是通過(guò)ftp/集中存儲(chǔ)+關(guān)系數(shù)據(jù)庫(kù)或者通過(guò)hadoop+hbase等nosql(notonlysql,非關(guān)系型數(shù)據(jù)庫(kù))方案來(lái)進(jìn)行存儲(chǔ)。雖然通過(guò)集中存儲(chǔ)的方案車輛數(shù)據(jù)寫入的能力能夠滿足,但無(wú)法滿足對(duì)圖像數(shù)據(jù)的隨機(jī)讀取的需要。而hadoop存儲(chǔ)小文件本身是一個(gè)缺陷。
因此需要一種新的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法及裝置、電子設(shè)備。
需要說(shuō)明的是,在上述背景技術(shù)部分公開(kāi)的信息僅用于加強(qiáng)對(duì)本發(fā)明的背景的理解,因此可以包括不構(gòu)成對(duì)本領(lǐng)域普通技術(shù)人員已知的現(xiàn)有技術(shù)的信息。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法及裝置、電子設(shè)備,進(jìn)而至少在一定程度上克服由于相關(guān)技術(shù)的限制和缺陷而導(dǎo)致的一個(gè)或者多個(gè)問(wèn)題。
本發(fā)明的其他特性和優(yōu)點(diǎn)將通過(guò)下面的詳細(xì)描述變得顯然,或部分地通過(guò)本發(fā)明的實(shí)踐而習(xí)得。
根據(jù)本公開(kāi)的一個(gè)方面,提供一種公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法,包括:接收車輛數(shù)據(jù),根據(jù)所述車輛數(shù)據(jù)生成對(duì)應(yīng)的索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)并分別分發(fā)至索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù);分別通過(guò)所述索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)將所述索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)存儲(chǔ)至elasticsearch、hbase和內(nèi)存中;當(dāng)所述內(nèi)存中存儲(chǔ)的圖像數(shù)據(jù)達(dá)到預(yù)設(shè)閾值時(shí),生成hbase的hfile文件,將所述圖像數(shù)據(jù)寫入磁盤中;利用hbase和elasticsearch實(shí)現(xiàn)所述車輛數(shù)據(jù)的檢索。
在本公開(kāi)的一種示例性實(shí)施例中,接收車輛數(shù)據(jù),根據(jù)所述車輛數(shù)據(jù)生成對(duì)應(yīng)的索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)并分別分發(fā)至索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)包括:采集終端采集的所述車輛數(shù)據(jù)通過(guò)kafka的接口進(jìn)行數(shù)據(jù)寫入時(shí),利用kafka的partition的分區(qū),將所述車輛數(shù)據(jù)分發(fā)到不同的kafka節(jié)點(diǎn);使用kafka的consumerapi分批次從kafka中讀取數(shù)據(jù);解析讀取到的kafka數(shù)據(jù)生成數(shù)據(jù)的key、索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù),并對(duì)所述車輛數(shù)據(jù)中的車牌進(jìn)行重新編碼。
在本公開(kāi)的一種示例性實(shí)施例中,對(duì)所述車輛數(shù)據(jù)中的車牌進(jìn)行重新編碼包括:將所述車牌的前兩位從0-65535中進(jìn)行編碼;將所述車牌的中間4位中的字母采用一字節(jié)的負(fù)數(shù)表示;將所述車牌最后一位中的字母與漢字采用一字節(jié)的負(fù)數(shù)表示。
在本公開(kāi)的一種示例性實(shí)施例中,分別通過(guò)所述索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)將所述索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)存儲(chǔ)至elasticsearch、hbase和內(nèi)存中包括:對(duì)當(dāng)前批次中解析完成的所述索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)分別調(diào)用對(duì)應(yīng)的elasticsearch、hbase和圖像存儲(chǔ)服務(wù)對(duì)應(yīng)的rpc接口對(duì)數(shù)據(jù)進(jìn)行寫入;以及記錄下當(dāng)前最后一條處理成功的數(shù)據(jù)的偏移量。
在本公開(kāi)的一種示例性實(shí)施例中,當(dāng)所述內(nèi)存中存儲(chǔ)的圖像數(shù)據(jù)達(dá)到預(yù)設(shè)閾值時(shí),生成hbase的hfile文件,將所述圖像數(shù)據(jù)寫入磁盤中包括:當(dāng)所述圖像存儲(chǔ)服務(wù)接收到圖像數(shù)據(jù)添加的rpc請(qǐng)求時(shí),把所述圖像數(shù)據(jù)寫入到日志文件中;在日志文件寫入成功后,把所述圖像數(shù)據(jù)添加到雙隊(duì)列的主內(nèi)存塊中;當(dāng)所述主內(nèi)存塊中存儲(chǔ)的數(shù)據(jù)達(dá)到所述預(yù)設(shè)閾值且雙隊(duì)列的備用內(nèi)存塊已經(jīng)完成flush動(dòng)作時(shí),對(duì)所述主內(nèi)存塊和所述備用內(nèi)存塊進(jìn)行切換;當(dāng)達(dá)到所述備用內(nèi)存塊的內(nèi)存限制大小時(shí),生成flush磁盤的線程用于讀取所述備用內(nèi)存塊中的圖像數(shù)據(jù)并生成hfile文件,把hfile文件寫入到磁盤。
在本公開(kāi)的一種示例性實(shí)施例中,所述方法還包括:把hfile文件寫入到磁盤時(shí),將所述磁盤中的目錄分為兩個(gè)層級(jí),第一級(jí)為當(dāng)前內(nèi)存塊的分區(qū)值,第二級(jí)為日期目錄。
在本公開(kāi)的一種示例性實(shí)施例中,利用所述hbase和elasticsearch實(shí)現(xiàn)所述車輛數(shù)據(jù)的檢索包括:當(dāng)接收到數(shù)據(jù)檢索請(qǐng)求時(shí),開(kāi)啟數(shù)據(jù)檢索服務(wù)用于監(jiān)聽(tīng)http/rpc請(qǐng)求;當(dāng)接收到http/rpc請(qǐng)求后,所述數(shù)據(jù)檢索服務(wù)對(duì)其進(jìn)行解析生成索引檢索條件,向所述索引服務(wù)發(fā)起檢索請(qǐng)求并獲得響應(yīng)結(jié)果;根據(jù)所述響應(yīng)結(jié)果對(duì)應(yīng)的數(shù)據(jù)的key,向hbase和所述圖像存儲(chǔ)服務(wù)中讀取key對(duì)應(yīng)的結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù);對(duì)所述結(jié)構(gòu)化數(shù)據(jù)和所述圖像數(shù)據(jù)進(jìn)行合并并返回檢索結(jié)果。
在本公開(kāi)的一種示例性實(shí)施例中,所述方法還包括:定時(shí)根據(jù)配置的數(shù)據(jù)熱度進(jìn)行所述圖像存儲(chǔ)服務(wù)中存儲(chǔ)的圖像數(shù)據(jù)的遷移和/或清理操作。
根據(jù)本公開(kāi)的一個(gè)方面,提供一種公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索裝置,包括:數(shù)據(jù)接入與分發(fā)模塊,用于接收車輛數(shù)據(jù),根據(jù)所述車輛數(shù)據(jù)生成對(duì)應(yīng)的索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)并分別分發(fā)至索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù);數(shù)據(jù)存儲(chǔ)模塊,用于分別通過(guò)所述索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)將所述索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)存儲(chǔ)至elasticsearch、hbase和內(nèi)存中;圖像數(shù)據(jù)存取模塊,用于當(dāng)所述內(nèi)存中存儲(chǔ)的圖像數(shù)據(jù)達(dá)到預(yù)設(shè)閾值時(shí),生成hbase的hfile文件,將所述圖像數(shù)據(jù)寫入磁盤中;數(shù)據(jù)檢索模塊,用于利用hbase和elasticsearch實(shí)現(xiàn)所述車輛數(shù)據(jù)的檢索。
根據(jù)本公開(kāi)的一個(gè)方面,提供一種電子設(shè)備,包括:處理器;以及存儲(chǔ)器,用于存儲(chǔ)所述處理器的可執(zhí)行指令;其中,所述處理器被配置為執(zhí)行上述的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法。
在本發(fā)明的一些實(shí)施例所提供的技術(shù)方案中,一方面,通過(guò)所述索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)將所述索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)存儲(chǔ)至elasticsearch、hbase和內(nèi)存中,當(dāng)所述內(nèi)存中存儲(chǔ)的圖像數(shù)據(jù)達(dá)到預(yù)設(shè)閾值時(shí),生成hbase的hfile文件,將所述圖像數(shù)據(jù)寫入磁盤中,可以實(shí)現(xiàn)圖像數(shù)據(jù)的快速寫入與圖像數(shù)據(jù)的快速隨機(jī)存取。另一方面,利用hbase和elasticsearch實(shí)現(xiàn)所述車輛數(shù)據(jù)的檢索,能夠?qū)崿F(xiàn)結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)的快速檢索。
應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本發(fā)明。
附圖說(shuō)明
此處的附圖被并入說(shuō)明書中并構(gòu)成本說(shuō)明書的一部分,示出了符合本發(fā)明的實(shí)施例,并與說(shuō)明書一起用于解釋本發(fā)明的原理。顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。在附圖中:
圖1示意性示出了根據(jù)本發(fā)明實(shí)施例的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法的流程圖;
圖2示意性示出了根據(jù)本發(fā)明實(shí)施例的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法的整體結(jié)構(gòu)圖;
圖3示意性示出了根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)接入和分發(fā)服務(wù)的工作流程圖;
圖4示意性示出了根據(jù)本發(fā)明實(shí)施例的圖像存儲(chǔ)服務(wù)的工作流程圖;
圖5示意性示出了根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)檢索服務(wù)的工作流程圖;
圖6示意性示出了根據(jù)本發(fā)明實(shí)施例的圖像數(shù)據(jù)回滾服務(wù)的工作流程圖;
圖7示意性示出了根據(jù)本發(fā)明實(shí)施例的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索裝置的框圖。
具體實(shí)施方式
現(xiàn)在將參考附圖更全面地描述示例實(shí)施方式。然而,示例實(shí)施方式能夠以多種形式實(shí)施,且不應(yīng)被理解為限于在此闡述的范例;相反,提供這些實(shí)施方式使得本發(fā)明將更加全面和完整,并將示例實(shí)施方式的構(gòu)思全面地傳達(dá)給本領(lǐng)域的技術(shù)人員。
此外,所描述的特征、結(jié)構(gòu)或特性可以以任何合適的方式結(jié)合在一個(gè)或更多實(shí)施例中。在下面的描述中,提供許多具體細(xì)節(jié)從而給出對(duì)本發(fā)明的實(shí)施例的充分理解。然而,本領(lǐng)域技術(shù)人員將意識(shí)到,可以實(shí)踐本發(fā)明的技術(shù)方案而沒(méi)有特定細(xì)節(jié)中的一個(gè)或更多,或者可以采用其它的方法、組元、裝置、步驟等。在其它情況下,不詳細(xì)示出或描述公知方法、裝置、實(shí)現(xiàn)或者操作以避免模糊本發(fā)明的各方面。
附圖中所示的方框圖僅僅是功能實(shí)體,不一定必須與物理上獨(dú)立的實(shí)體相對(duì)應(yīng)。即,可以采用軟件形式來(lái)實(shí)現(xiàn)這些功能實(shí)體,或在一個(gè)或多個(gè)硬件模塊或集成電路中實(shí)現(xiàn)這些功能實(shí)體,或在不同網(wǎng)絡(luò)和/或處理器裝置和/或微控制器裝置中實(shí)現(xiàn)這些功能實(shí)體。
附圖中所示的流程圖僅是示例性說(shuō)明,不是必須包括所有的內(nèi)容和操作/步驟,也不是必須按所描述的順序執(zhí)行。例如,有的操作/步驟還可以分解,而有的操作/步驟可以合并或部分合并,因此實(shí)際執(zhí)行的順序有可能根據(jù)實(shí)際情況改變。
圖1示意性示出了根據(jù)本發(fā)明實(shí)施例的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法的流程圖。如圖1所示,該公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法可以包括以下步驟。
在步驟s110中,接收車輛數(shù)據(jù),根據(jù)所述車輛數(shù)據(jù)生成對(duì)應(yīng)的索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)并分別分發(fā)至索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)。
本發(fā)明實(shí)施例中的結(jié)構(gòu)化數(shù)據(jù)即行數(shù)據(jù),存儲(chǔ)在數(shù)據(jù)庫(kù)里,可以用二維表結(jié)構(gòu)來(lái)邏輯表達(dá)實(shí)現(xiàn)的數(shù)據(jù)。相對(duì)于結(jié)構(gòu)化數(shù)據(jù)而言,不方便用數(shù)據(jù)庫(kù)二維邏輯表來(lái)表現(xiàn)的數(shù)據(jù)即稱為非結(jié)構(gòu)化數(shù)據(jù),包括所有格式的圖像數(shù)據(jù)等。
本發(fā)明實(shí)施例中的結(jié)構(gòu)化數(shù)據(jù)每條大約占2kb左右,而高清卡口原始車圖像數(shù)據(jù)大約占300-500kb。
在示例性實(shí)施例中,接收車輛數(shù)據(jù),根據(jù)所述車輛數(shù)據(jù)生成對(duì)應(yīng)的索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)并分別分發(fā)至索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)可以進(jìn)一步包括:采集終端采集的所述車輛數(shù)據(jù)通過(guò)kafka的接口進(jìn)行數(shù)據(jù)寫入時(shí),利用kafka的partition的分區(qū),將所述車輛數(shù)據(jù)分發(fā)到不同的kafka節(jié)點(diǎn);使用kafka的consumerapi分批次從kafka中讀取數(shù)據(jù);解析讀取到的kafka數(shù)據(jù)生成數(shù)據(jù)的key、索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù),并對(duì)所述車輛數(shù)據(jù)中的車牌進(jìn)行重新編碼。
在示例性實(shí)施例中,對(duì)所述車輛數(shù)據(jù)中的車牌進(jìn)行重新編碼包括:將所述車牌的前兩位從0-65535中進(jìn)行編碼;將所述車牌的中間4位中的字母采用一字節(jié)的負(fù)數(shù)表示;將所述車牌最后一位中的字母與漢字采用一字節(jié)的負(fù)數(shù)表示。本發(fā)明實(shí)施例中對(duì)車牌進(jìn)行重新編碼的作用在于實(shí)現(xiàn)對(duì)車牌存儲(chǔ)的壓縮與車牌的模糊匹配算法的性能的提升。
在步驟s120中,分別通過(guò)所述索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)將所述索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)存儲(chǔ)至elasticsearch、hbase和內(nèi)存中。
在示例性實(shí)施例中,分別通過(guò)所述索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)將所述索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)存儲(chǔ)至elasticsearch、hbase和內(nèi)存中可以進(jìn)一步包括:對(duì)當(dāng)前批次中解析完成的所述索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)分別調(diào)用對(duì)應(yīng)的elasticsearch、hbase和圖像存儲(chǔ)服務(wù)對(duì)應(yīng)的rpc接口對(duì)數(shù)據(jù)進(jìn)行寫入;以及記錄下當(dāng)前最后一條處理成功的數(shù)據(jù)的偏移量。這里是為了實(shí)現(xiàn)從接入數(shù)據(jù)的讀取、索引創(chuàng)建、結(jié)構(gòu)化數(shù)據(jù)與圖像數(shù)據(jù)存儲(chǔ)的一致性的保證。
在步驟s130中,當(dāng)所述內(nèi)存中存儲(chǔ)的圖像數(shù)據(jù)達(dá)到預(yù)設(shè)閾值時(shí),生成hbase的hfile文件,將所述圖像數(shù)據(jù)寫入磁盤中。
在示例性實(shí)施例中,當(dāng)所述內(nèi)存中存儲(chǔ)的圖像數(shù)據(jù)達(dá)到預(yù)設(shè)閾值時(shí),生成hbase的hfile文件,將所述圖像數(shù)據(jù)寫入磁盤中可以進(jìn)一步包括:當(dāng)所述圖像存儲(chǔ)服務(wù)接收到圖像數(shù)據(jù)添加的rpc請(qǐng)求時(shí),把所述圖像數(shù)據(jù)寫入到日志文件中;在日志文件寫入成功后,把所述圖像數(shù)據(jù)添加到雙隊(duì)列的主內(nèi)存塊中;當(dāng)所述主內(nèi)存塊中存儲(chǔ)的數(shù)據(jù)達(dá)到所述預(yù)設(shè)閾值且雙隊(duì)列的備用內(nèi)存塊已經(jīng)完成flush動(dòng)作時(shí),對(duì)所述主內(nèi)存塊和所述備用內(nèi)存塊進(jìn)行切換;當(dāng)達(dá)到所述備用內(nèi)存塊的內(nèi)存限制大小時(shí),生成flush磁盤的線程用于讀取所述備用內(nèi)存塊中的圖像數(shù)據(jù)并生成hfile文件,把hfile文件寫入到磁盤。本發(fā)明實(shí)施例采用雙隊(duì)列內(nèi)存的作用在于實(shí)現(xiàn)圖像數(shù)據(jù)寫入的無(wú)鎖控制,從而提高整體寫入性能。
在示例性實(shí)施例中,所述方法還可以包括:把hfile文件寫入到磁盤時(shí),將所述磁盤中的目錄分為兩個(gè)層級(jí),第一級(jí)為當(dāng)前內(nèi)存塊的分區(qū)值,第二級(jí)為日期目錄。hfile文件本身的命名根據(jù)當(dāng)次flush到磁盤的內(nèi)存中數(shù)據(jù)的第一條數(shù)據(jù)的時(shí)間加最后一條數(shù)據(jù)的時(shí)間組成,內(nèi)存塊的分區(qū)值通過(guò)對(duì)車牌進(jìn)行hash后得到,這樣存儲(chǔ)的目的有利于在對(duì)圖像數(shù)據(jù)進(jìn)行讀取時(shí),根據(jù)選擇的車牌與時(shí)間范圍能夠快速的定位到數(shù)據(jù)所在的hfile文件,從而減少hfile文件的讀取個(gè)數(shù)。
在步驟s140中,利用hbase和elasticsearch實(shí)現(xiàn)所述車輛數(shù)據(jù)的檢索。
在示例性實(shí)施例中,利用所述hbase和elasticsearch實(shí)現(xiàn)所述車輛數(shù)據(jù)的檢索可以進(jìn)一步包括:當(dāng)接收到數(shù)據(jù)檢索請(qǐng)求時(shí),開(kāi)啟數(shù)據(jù)檢索服務(wù)用于監(jiān)聽(tīng)http/rpc請(qǐng)求;當(dāng)接收到http/rpc請(qǐng)求后,所述數(shù)據(jù)檢索服務(wù)對(duì)其進(jìn)行解析生成索引檢索條件,向所述索引服務(wù)發(fā)起檢索請(qǐng)求并獲得響應(yīng)結(jié)果;根據(jù)所述響應(yīng)結(jié)果對(duì)應(yīng)的數(shù)據(jù)的key,向hbase和所述圖像存儲(chǔ)服務(wù)中讀取key對(duì)應(yīng)的結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù);對(duì)所述結(jié)構(gòu)化數(shù)據(jù)和所述圖像數(shù)據(jù)進(jìn)行合并并返回檢索結(jié)果。
在示例性實(shí)施例中,可以利用elasticsearch的空間檢索算法實(shí)現(xiàn)結(jié)構(gòu)化數(shù)據(jù)多維度檢索并結(jié)合hbase的batchget與hfile的bloomfilter算法實(shí)現(xiàn)卡口結(jié)構(gòu)化數(shù)據(jù)與圖像數(shù)據(jù)的快速定位與查找。
在示例性實(shí)施例中,所述方法還可以包括:定時(shí)根據(jù)配置的數(shù)據(jù)熱度進(jìn)行所述圖像存儲(chǔ)服務(wù)中存儲(chǔ)的圖像數(shù)據(jù)的遷移和/或清理操作。
本發(fā)明實(shí)施方式提供的一種公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法,在滿足數(shù)據(jù)的快速存儲(chǔ)需要的同時(shí)滿足數(shù)據(jù)快速檢索與圖像數(shù)據(jù)隨機(jī)讀取的功能。
下面通過(guò)圖2-6對(duì)本發(fā)明實(shí)施例的方法進(jìn)行詳細(xì)描述。
本發(fā)明實(shí)施例提供了一種基于hadoop生態(tài)系統(tǒng)為底層技術(shù)的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法,針對(duì)公安卡口車輛數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)、圖像數(shù)據(jù)的快速存儲(chǔ)與檢索,尤其是針對(duì)海量圖像數(shù)據(jù)的大并發(fā)隨機(jī)讀取。
本發(fā)明實(shí)施例在基于hadoop生態(tài)系統(tǒng)為底層技術(shù)的基礎(chǔ)上提供了從數(shù)據(jù)采集終端、數(shù)據(jù)分發(fā)管理、數(shù)據(jù)接入處理、存儲(chǔ)與數(shù)據(jù)檢索的整套技術(shù)方案來(lái)解決車輛數(shù)據(jù)的海量存儲(chǔ)與檢索難題,可以包括:(1)定義用于與數(shù)據(jù)采集終端通信的socket接口;(2)擴(kuò)展實(shí)現(xiàn)hadoop生態(tài)系統(tǒng)中kafka中的分區(qū)接口;(3)實(shí)現(xiàn)用于處理數(shù)據(jù)采集終端傳入的車輛數(shù)據(jù)的分布式處理程序,實(shí)現(xiàn)對(duì)數(shù)據(jù)的分解與入庫(kù);(4)實(shí)現(xiàn)專用的圖像存儲(chǔ)服務(wù);(5)實(shí)現(xiàn)多維度數(shù)據(jù)檢索服務(wù);(6)圖像數(shù)據(jù)回滾分析服務(wù)。
具體的,上述(1)中定義用于與數(shù)據(jù)采集終端通信的socket接口,此部分在kafka的基礎(chǔ)上進(jìn)行接口的擴(kuò)展,可以進(jìn)一步包括:采用avro協(xié)議定義數(shù)據(jù)采集終端的數(shù)據(jù)接入標(biāo)準(zhǔn),包裝kafka的通信接口,對(duì)外隱藏掉接口細(xì)節(jié),直接提供指定的數(shù)據(jù)格式,實(shí)現(xiàn)解析請(qǐng)求數(shù)據(jù)并對(duì)數(shù)據(jù)進(jìn)行編號(hào),實(shí)現(xiàn)數(shù)據(jù)路由方法并向指定的集群節(jié)點(diǎn)寫入數(shù)據(jù)。
其中avro是hadoop的一個(gè)子項(xiàng)目。avro是一個(gè)數(shù)據(jù)序列化系統(tǒng),設(shè)計(jì)用于支持大批量數(shù)據(jù)交換的應(yīng)用。它的主要特點(diǎn)有:支持二進(jìn)制序列化方式,可以便捷,快速地處理大量數(shù)據(jù);動(dòng)態(tài)語(yǔ)言友好,avro提供的機(jī)制使動(dòng)態(tài)語(yǔ)言可以方便地處理avro數(shù)據(jù)。
具體的,上述(2)中擴(kuò)展實(shí)現(xiàn)hadoop生態(tài)系統(tǒng)中kafka中的分區(qū)接口,可以進(jìn)一步包括:對(duì)車牌進(jìn)行hash并把數(shù)據(jù)對(duì)應(yīng)到指定的分區(qū)、實(shí)現(xiàn)kafka的分區(qū)接口函數(shù)、根據(jù)車牌與時(shí)間分區(qū)值生成數(shù)據(jù)的唯一key(16字節(jié),車牌+分區(qū)+時(shí)間),并結(jié)合上述(1)中定義的接口對(duì)數(shù)據(jù)進(jìn)行分發(fā)。
其中hash就是把任意長(zhǎng)度的輸入(又叫做預(yù)映射,pre-image),通過(guò)散列算法,變換成固定長(zhǎng)度的輸出,該輸出就是散列值。簡(jiǎn)單的說(shuō)就是一種將任意長(zhǎng)度的消息壓縮到某一固定長(zhǎng)度的消息摘要的函數(shù)。
具體的,上述(3)中實(shí)現(xiàn)用于處理數(shù)據(jù)采集終端傳入的車輛數(shù)據(jù)的分布式處理程序,實(shí)現(xiàn)對(duì)數(shù)據(jù)的分解與入庫(kù),可以進(jìn)一步包括:根據(jù)kafka的分區(qū)個(gè)數(shù)生成接入實(shí)時(shí)任務(wù)進(jìn)程,保證一個(gè)kafka的節(jié)點(diǎn)中對(duì)應(yīng)一個(gè)或多個(gè)處理程序(按分區(qū)數(shù)生成進(jìn)程);對(duì)數(shù)據(jù)采集終端接入的車輛數(shù)據(jù)進(jìn)行解析并入庫(kù),可以進(jìn)一步包括:解析avro協(xié)議中的車輛數(shù)據(jù),根據(jù)車輛的結(jié)構(gòu)化數(shù)據(jù)生成多維索引,分別對(duì)索引、結(jié)構(gòu)化數(shù)據(jù)、圖像數(shù)據(jù)進(jìn)行存儲(chǔ),把索引存儲(chǔ)到elasticsearch,結(jié)構(gòu)化數(shù)據(jù)生成二進(jìn)制存儲(chǔ)到hbase,圖像數(shù)據(jù)寫入圖像服務(wù)的內(nèi)存中并記錄wal(預(yù)寫日志),即在將所述圖像數(shù)據(jù)存儲(chǔ)進(jìn)內(nèi)存前,圖像數(shù)據(jù)可能會(huì)丟失,可以先把圖像數(shù)據(jù)寫入到一個(gè)日志文件中。其中數(shù)據(jù)統(tǒng)一采用在kafka分區(qū)接口中實(shí)現(xiàn)的16字節(jié)唯一key進(jìn)行存儲(chǔ)。
其中,elasticsearch是一個(gè)基于lucene的搜索服務(wù)器。它提供了一個(gè)分布式多用戶能力的全文搜索引擎,基于restfulweb接口。hbase是一個(gè)分布式的、面向列的開(kāi)源數(shù)據(jù)庫(kù)。hbase是apache的hadoop項(xiàng)目的子項(xiàng)目。
具體的,上述(4)中圖像存儲(chǔ)服務(wù),可以進(jìn)一步包括:實(shí)現(xiàn)用于與接入程序、數(shù)據(jù)訪問(wèn)服務(wù)進(jìn)行通信的rpc接口;實(shí)現(xiàn)圖像處理服務(wù),包括:內(nèi)存分區(qū)(與kafka分區(qū)相同,例如每個(gè)分區(qū)1gb內(nèi)存)與wal日志、根據(jù)跳表數(shù)據(jù)結(jié)構(gòu)生成圖像內(nèi)存存儲(chǔ)的內(nèi)存塊、借鑒hbase中hfile的存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)內(nèi)存數(shù)據(jù)溢寫磁盤(例如,可以按天對(duì)圖像數(shù)據(jù)進(jìn)行目錄區(qū)分)。
本發(fā)明實(shí)施例中,一方面,通過(guò)利用hbase的hfile隨機(jī)讀取特性以及內(nèi)存的高效寫入特性,能夠?qū)崿F(xiàn)圖像數(shù)據(jù)的快速寫入與圖像數(shù)據(jù)的隨機(jī)讀取能力??梢韵葘D像數(shù)據(jù)存儲(chǔ)于內(nèi)存中,當(dāng)內(nèi)存中存儲(chǔ)的圖像數(shù)據(jù)達(dá)到閾值時(shí)例如達(dá)到1gb時(shí),生成hbase的hfile文件,然后寫入hadoop中。這里針對(duì)圖像服務(wù)來(lái)講,hadoop就是底層存儲(chǔ),因此假定hadoop就是物理磁盤。另一方面,可以利用hbase+elasticsearch來(lái)實(shí)現(xiàn)結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)的快速檢索。
具體的,上述(5)中多維度數(shù)據(jù)檢索服務(wù),由于在卡口系統(tǒng)中車輛數(shù)據(jù)可能被檢索的維度太多,本發(fā)明實(shí)施例為實(shí)現(xiàn)高性能查詢,會(huì)實(shí)現(xiàn)一個(gè)專用的數(shù)據(jù)檢索服務(wù)對(duì)外接口例如http/rpc的通信接口,并統(tǒng)一接收json的請(qǐng)求消息,客戶端程序把需要檢索的數(shù)據(jù)維度請(qǐng)求文件交由此數(shù)據(jù)檢索服務(wù),此數(shù)據(jù)檢索服務(wù)根據(jù)請(qǐng)求維度生成對(duì)應(yīng)的索引計(jì)劃從索引服務(wù)中讀取對(duì)應(yīng)的索引信息的topn并通過(guò)hbase高效的隨機(jī)讀取能力讀取車輛數(shù)據(jù)的原始結(jié)構(gòu)化數(shù)據(jù),同時(shí)并行向圖像存儲(chǔ)服務(wù)發(fā)起批量圖像讀取請(qǐng)求快速的得到車輛信息對(duì)應(yīng)的圖像數(shù)據(jù)。
具體的,上述(6)中圖像數(shù)據(jù)回滾分析服務(wù),其中圖像數(shù)據(jù)回滾服務(wù)作用于根據(jù)圖像的存儲(chǔ)時(shí)間配置對(duì)圖像進(jìn)行磁盤歸檔與定時(shí)的清理操作,圖像數(shù)據(jù)回滾服務(wù)可配置例如近一個(gè)月內(nèi)的數(shù)據(jù)為熱數(shù)據(jù)存儲(chǔ)到磁盤,超過(guò)一個(gè)月的數(shù)據(jù)存儲(chǔ)到歸檔磁盤,超過(guò)三個(gè)月數(shù)據(jù)需要清理。圖像數(shù)據(jù)回滾服務(wù)根據(jù)配置對(duì)圖像數(shù)據(jù)存儲(chǔ)目錄進(jìn)行掃描,當(dāng)目錄達(dá)到指定的天數(shù)配置時(shí),對(duì)圖像目錄進(jìn)行整體的遷移或者刪除,從而解決磁盤的清理操作,從而解決傳統(tǒng)的圖像存儲(chǔ)系統(tǒng)中海量小文件的清理問(wèn)題。圖像數(shù)據(jù)回滾用于對(duì)數(shù)據(jù)空間進(jìn)行清理,也就是圖像存儲(chǔ)服務(wù)本身并不具體管理磁盤,由hadoop來(lái)管理。
這里的小文件指的是那些size比hdfs的blocksize(默認(rèn)128mb)小的多的文件。如果在hdfs中存儲(chǔ)小文件,那么在hdfs中肯定會(huì)含有許許多多這樣的小文件。而hdfs的問(wèn)題在于無(wú)法很有效的處理大量小文件。任何一個(gè)文件,目錄和block,在hdfs中都會(huì)被表示為一個(gè)object存儲(chǔ)在namenode的內(nèi)存中,每一個(gè)object占用1024bytes的內(nèi)存空間。所以,如果有10million個(gè)文件,每一個(gè)文件對(duì)應(yīng)一個(gè)block,那么就將要消耗namenode10gb+的內(nèi)存來(lái)保存這些block的信息。如果規(guī)模再大一些,那么將會(huì)超出現(xiàn)階段計(jì)算機(jī)硬件所能滿足的極限。不僅如此,hdfs并不是為了有效的處理大量小文件而存在的。它主要是為了流式的訪問(wèn)大文件而設(shè)計(jì)的。對(duì)小文件的讀取通常會(huì)造成大量從datanode到datanode的seeks和hopping來(lái)retrieve文件,而這樣是非常的低效的一種訪問(wèn)方式。
圖2示意性示出了根據(jù)本發(fā)明實(shí)施例的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法的整體結(jié)構(gòu)圖。
本發(fā)明實(shí)施例的整體架構(gòu)如圖2所示,卡口車輛數(shù)據(jù)采集終端通過(guò)本發(fā)明實(shí)施例提供的數(shù)據(jù)接入接口對(duì)數(shù)據(jù)進(jìn)行接入,并由實(shí)時(shí)入庫(kù)服務(wù)接收到接入的車輛結(jié)構(gòu)化數(shù)據(jù)與圖像數(shù)據(jù)進(jìn)行編碼轉(zhuǎn)換與存儲(chǔ)(根據(jù)數(shù)據(jù)的維度生成索引與結(jié)構(gòu)化數(shù)據(jù)、圖像數(shù)據(jù)),通過(guò)統(tǒng)一的數(shù)據(jù)檢索服務(wù)對(duì)外提供數(shù)據(jù)的訪問(wèn)服務(wù)。
本發(fā)明實(shí)施例是基于hadoop生態(tài)系統(tǒng)相關(guān)組件的基礎(chǔ)上進(jìn)行的技術(shù)架構(gòu),因此在部署前首先需要部署hadoop生態(tài)系統(tǒng),可以包含的組件包括:jdk1.7_67或以上版本、ambari、hadoop、hbase、elasticsearch、kafka、zookeeper、圖像存儲(chǔ)組件。
按每天3000w卡口數(shù)據(jù)量圖像存儲(chǔ)一個(gè)月的服務(wù)器配置說(shuō)明:
1、元數(shù)據(jù)服務(wù)器
3臺(tái),建議配置256gb內(nèi)存+500gbssd盤+cpu*2(2.0ghz+8core超線程),部署zookeeper+namenode+hbasemaster+圖像數(shù)據(jù)回滾服務(wù)。
2、索引服務(wù)器
3-5臺(tái),建議配置256gb內(nèi)存+ssd盤*2(500gb)+cpu*2(2.0ghz+8core超線程),部署elasticsearch服務(wù)組件。
3、結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)服務(wù)器
10-16臺(tái),建議配置96gb內(nèi)存+1塊ssd盤(500gb)+3tb磁盤4塊+cpu*2(2.0ghz+8core超線程)+雙網(wǎng)卡,部署hbase服務(wù)數(shù)據(jù)組件+kafka服務(wù)組件+數(shù)據(jù)接入處理服務(wù)。
其中,結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)雙副本。
4、圖像存儲(chǔ)服務(wù)器
60臺(tái),建議配置64gb內(nèi)存+1塊ssd盤(500gb)+3tb磁盤12塊+cpu*2(2.0ghz+8core超線程),部署圖像存儲(chǔ)服務(wù)組件。
圖像存儲(chǔ)服務(wù)器可選配集中式存儲(chǔ)(如果需要在清理磁盤前的數(shù)據(jù)進(jìn)行一定時(shí)間長(zhǎng)度的保留),用于存儲(chǔ)數(shù)據(jù)時(shí)效在一個(gè)月到三個(gè)月之間的數(shù)據(jù)。
其中,圖像數(shù)據(jù)存儲(chǔ)單副本。
5.數(shù)據(jù)檢索服務(wù)器
1-2臺(tái),建議配置16gb內(nèi)存+500gb磁盤+1cpu(2.0ghz+8core超線程),部署數(shù)據(jù)檢索服務(wù)
在本發(fā)明實(shí)施例中,數(shù)據(jù)采集終端數(shù)據(jù)寫入的接口通過(guò)使用kafka提供的socket通信接口來(lái)進(jìn)行數(shù)據(jù)的傳輸與網(wǎng)絡(luò)帶寬的負(fù)載均衡,并結(jié)合kafka的partition的功能編寫分布式的consumer端,來(lái)實(shí)現(xiàn)具體的數(shù)據(jù)接入處理,部署kafka服務(wù)組件的節(jié)點(diǎn)與hbase的存儲(chǔ)節(jié)點(diǎn)共用(這塊是利用kafka的高吞吐能力與hbase提供的數(shù)據(jù)本地化能力,讓數(shù)據(jù)接收與寫入能在一臺(tái)機(jī)器上完成。當(dāng)數(shù)據(jù)采集終端,也就是前端的拍照的設(shè)備,通過(guò)kafka的接口進(jìn)行數(shù)據(jù)寫入時(shí),把數(shù)據(jù)隨機(jī)分發(fā)給某一個(gè)hbase節(jié)點(diǎn),hbase節(jié)點(diǎn)部署的kafka節(jié)點(diǎn)接收到這個(gè)寫入的數(shù)據(jù)后,直接生成數(shù)據(jù)寫入內(nèi)存與hbase,避免二次網(wǎng)絡(luò)通信)。但必須配置雙網(wǎng)卡對(duì)數(shù)據(jù)采集終端提供a網(wǎng)卡用于數(shù)據(jù)的寫入,接入處理程序通過(guò)b網(wǎng)卡把數(shù)據(jù)寫入到對(duì)應(yīng)的索引、hbase、與圖像存儲(chǔ)服務(wù)中,通過(guò)hbase高效的隨機(jī)讀取能力來(lái)提供對(duì)數(shù)據(jù)的快速讀取操作,圖像存儲(chǔ)服務(wù)借用hbase的hfile文件數(shù)據(jù)結(jié)構(gòu)對(duì)數(shù)據(jù)進(jìn)行合并并存儲(chǔ)到磁盤,因此對(duì)于圖像的隨機(jī)讀取能力在本發(fā)明實(shí)施例中將會(huì)得到大大的提升。
圖3示意性示出了根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)接入和分發(fā)服務(wù)的工作流程圖。
圖3是本發(fā)明實(shí)施例的數(shù)據(jù)接入處理服務(wù)在接收到數(shù)據(jù)采集終端傳輸?shù)能囕v數(shù)據(jù)后,批量讀取接入的數(shù)據(jù)生成對(duì)應(yīng)的索引、結(jié)構(gòu)化數(shù)據(jù)、圖像數(shù)據(jù)并分發(fā)到不同的服務(wù)的流程。
kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費(fèi)者規(guī)模的網(wǎng)站中的所有動(dòng)作流數(shù)據(jù)。這些數(shù)據(jù)通常是由于吞吐量的要求而通過(guò)處理日志和日志聚合來(lái)解決。對(duì)于像hadoop的一樣的日志數(shù)據(jù)和離線分析系統(tǒng),但又要求實(shí)時(shí)處理的限制,這是一個(gè)可行的解決方案。kafka的目的是通過(guò)hadoop的并行加載機(jī)制來(lái)統(tǒng)一線上和離線的消息處理,也是為了通過(guò)集群來(lái)提供實(shí)時(shí)的消費(fèi)。
其中,kafka集群包含一個(gè)或多個(gè)服務(wù)器,這種服務(wù)器被稱為broker。每條發(fā)布到kafka集群的消息都有一個(gè)類別,這個(gè)類別被稱為topic。partition是物理上的概念,每個(gè)topic包含一個(gè)或多個(gè)partition。producer是負(fù)責(zé)發(fā)布消息到kafkabroker。consumer消息消費(fèi)者向kafkabroker讀取消息的客戶端。
如圖3所示,數(shù)據(jù)接入處理服務(wù)在接收到數(shù)據(jù)采集終端傳輸?shù)能囕v數(shù)據(jù)后,批量讀取接入的數(shù)據(jù)生成對(duì)應(yīng)的索引、結(jié)構(gòu)化數(shù)據(jù)、圖像數(shù)據(jù)并分發(fā)到不同的服務(wù)中,具體可以包括:
步驟1,使用kafka的consumerapi編寫數(shù)據(jù)接入處理程序。
本發(fā)明實(shí)施例使用的數(shù)據(jù)接入采用的是hadoop生態(tài)系統(tǒng)中的kafka組件來(lái)處理數(shù)據(jù)采集終端到卡口車輛數(shù)據(jù)存儲(chǔ)系統(tǒng)之間的數(shù)據(jù)橋梁,這樣做可以有效的預(yù)防數(shù)據(jù)處理過(guò)程中出現(xiàn)的異常情況,同時(shí)kafka本身提供不同語(yǔ)言的api接口,這樣針對(duì)數(shù)據(jù)采集終端的接入會(huì)更加友好。
在本步驟1中,具體可以包括:
步驟1.1,數(shù)據(jù)采集終端連接kafka的producer的api來(lái)充當(dāng)數(shù)據(jù)的生產(chǎn)者,在producer的接口內(nèi)部為考慮網(wǎng)絡(luò)的負(fù)載,kafka的partition的選擇采用輪詢的方法保證每一條數(shù)據(jù)都分發(fā)到不同的kafka節(jié)點(diǎn)中。
步驟1.2,數(shù)據(jù)接入處理程序連接kafka的consumer的api,分批次從kafka中讀取數(shù)據(jù),每個(gè)partition單獨(dú)對(duì)應(yīng)一個(gè)kafka的consumer進(jìn)行消費(fèi),每個(gè)批次讀取例如10-50mb的數(shù)據(jù)進(jìn)行處理。
步驟2,解析讀取到的kafka數(shù)據(jù),并對(duì)車牌進(jìn)行重新編碼,在車牌中一般包含三個(gè)部分的數(shù)據(jù):前兩位(省+地區(qū))+中間4位(一個(gè)字母加數(shù)值的值)+最后一位(根據(jù)含義會(huì)有不同,比如警、學(xué)、出租車、掛車等),由于這些里面包含有部分中文,而中文對(duì)于存儲(chǔ)來(lái)講需要占用3個(gè)字節(jié),所以要重新編碼。其中,前兩位編碼可以從0-65535,中間4位中的字母采用一字節(jié)的負(fù)數(shù)表示,最后一位中的字母與漢字采用一字節(jié)的負(fù)數(shù)表示。這是車牌的重新編碼規(guī)則,其目的是為了減少單個(gè)車牌所占用的字節(jié)數(shù),從而減少數(shù)據(jù)整體的存儲(chǔ)空間,并可以更高效的提升數(shù)據(jù)檢索的能力。
步驟3,對(duì)數(shù)據(jù)進(jìn)行解析提取并生成數(shù)據(jù)的key、索引、結(jié)構(gòu)化數(shù)據(jù)、圖像數(shù)據(jù)。在本步驟中,通過(guò)對(duì)車輛數(shù)據(jù)結(jié)構(gòu)化字段的配置信息,此配置信息可以通過(guò)一個(gè)hbase的表單獨(dú)來(lái)進(jìn)行存儲(chǔ),配置包含字段信息與需要用于索引的字段的描述。本發(fā)明實(shí)施例中通過(guò)配置的索引字段對(duì)解析出來(lái)的結(jié)構(gòu)化數(shù)據(jù)生成對(duì)應(yīng)的索引信息。
步驟4,對(duì)當(dāng)前處理批次中解析完成的索引、結(jié)構(gòu)化數(shù)據(jù)、圖像數(shù)據(jù)分別調(diào)用對(duì)應(yīng)的elasticsearch、hbase、圖像存儲(chǔ)服務(wù)對(duì)應(yīng)的rpc接口對(duì)數(shù)據(jù)進(jìn)行寫入并同時(shí)對(duì)kafka進(jìn)行手動(dòng)的commit操作,記錄下當(dāng)前最后一條處理成功的數(shù)據(jù)的offset,保證數(shù)據(jù)處理過(guò)程中不丟失。
圖4示意性示出了根據(jù)本發(fā)明實(shí)施例的圖像存儲(chǔ)服務(wù)的工作流程圖。
如圖4所示,是本發(fā)明實(shí)施例圖像存儲(chǔ)服務(wù)在接收到接入的圖像數(shù)據(jù)后具體的處理過(guò)程的流程圖。圖像存儲(chǔ)服務(wù)在接收到傳入的圖像數(shù)據(jù)后具體的處理過(guò)程的流程圖,具體可以包括:
步驟1,當(dāng)圖像存儲(chǔ)服務(wù)接收到一個(gè)圖像數(shù)據(jù)添加的rpc(remoteprocedurecalls,遠(yuǎn)程過(guò)程調(diào)用)請(qǐng)求后,通過(guò)執(zhí)行對(duì)應(yīng)的數(shù)據(jù)添加操作來(lái)進(jìn)行添加,此步驟中為了考慮到圖像數(shù)據(jù)寫入的吞吐量,數(shù)據(jù)添加操作首先把圖像數(shù)據(jù)向?qū)?yīng)的內(nèi)存隊(duì)列中進(jìn)行添加。
rpc是一種協(xié)議,程序可使用這種協(xié)議向網(wǎng)絡(luò)中的另一臺(tái)計(jì)算機(jī)上的程序請(qǐng)求服務(wù)。由于使用rpc的程序不必了解支持通信的網(wǎng)絡(luò)協(xié)議的情況,因此rpc提高了程序的互操作性。rpc是一項(xiàng)廣泛用于支持分布式應(yīng)用程序(不同組件分布在不同計(jì)算機(jī)上的應(yīng)用程序)的技術(shù)。rpc的主要目的是為組件提供一種相互通信的方式,使這些組件之間能夠相互發(fā)出請(qǐng)求并傳遞這些請(qǐng)求的結(jié)果。沒(méi)有語(yǔ)言限制。
步驟2,此步驟主要用于在圖像添加過(guò)程中的處理,由于為了考慮數(shù)據(jù)添加的處理能力,數(shù)據(jù)優(yōu)先寫入到內(nèi)存。為了考慮到機(jī)器可能出現(xiàn)的異常情況,在數(shù)據(jù)添加前首先把圖像數(shù)據(jù)寫入到一個(gè)固定大小的wal日志文件中,wal日志文件的大小與內(nèi)存塊的大小相同,在此過(guò)程中把圖像數(shù)據(jù)append寫入到wal日志文件,在日志文件寫入成功后找到雙隊(duì)列的內(nèi)存塊的主內(nèi)存塊(內(nèi)存塊中的主內(nèi)存塊表示這是一塊活動(dòng)的內(nèi)存,用于處理數(shù)據(jù)的添加),此內(nèi)存塊是一個(gè)跳躍表的數(shù)據(jù)結(jié)構(gòu),把圖像數(shù)據(jù)寫入到內(nèi)存塊中。本發(fā)明實(shí)施例中,主備內(nèi)存采用雙緩沖內(nèi)存塊,當(dāng)a塊滿后換到b塊開(kāi)始寫,同時(shí)a塊開(kāi)始寫磁盤。
步驟3,此步驟作用于對(duì)圖像數(shù)據(jù)添加到圖像存儲(chǔ)服務(wù)的內(nèi)存塊后需要處理的后續(xù)動(dòng)作,具體可以包括:
步驟3.1,如果主內(nèi)存塊的寫內(nèi)容還沒(méi)有達(dá)到配置的內(nèi)存塊閾值時(shí),或者說(shuō)主內(nèi)存塊中剩余的大小大于已經(jīng)寫入的數(shù)據(jù)的平均大小時(shí),表示主內(nèi)存塊還可以執(zhí)行寫入動(dòng)作,流程不作操作,直接結(jié)束整個(gè)添加操作。
步驟3.2,如果主內(nèi)存塊剩余的空間大小已經(jīng)無(wú)法再寫入新的數(shù)據(jù),說(shuō)明此主內(nèi)存塊已經(jīng)達(dá)到了閾值大小,主內(nèi)存塊的數(shù)據(jù)可以寫入到磁盤,判斷備用內(nèi)存塊是否已經(jīng)完成了flush的動(dòng)作,如果完成表示備用內(nèi)存塊可以切換成主內(nèi)存塊進(jìn)行寫操作,對(duì)主備內(nèi)存塊進(jìn)行切換。
步驟3.3,此時(shí)內(nèi)存塊中備用內(nèi)存塊已經(jīng)達(dá)到了內(nèi)存限制的大小,生成一個(gè)flush磁盤的線程,讀取備用內(nèi)存塊的數(shù)據(jù)并生成hfile文件,生成hfile文件時(shí)通過(guò)數(shù)據(jù)的key生成bloomfilter。當(dāng)文件生成完成后,把文件寫入到磁盤,并標(biāo)記備用內(nèi)存塊為空內(nèi)存塊,可以被切換成主內(nèi)存塊。此步驟中在生成hfile文件并寫入磁盤時(shí),磁盤中的目錄分為兩個(gè)層級(jí),第一級(jí)為當(dāng)前內(nèi)存塊的分區(qū)值,第二層為日期目錄,hfile的文件名稱通過(guò)這個(gè)hfile中數(shù)據(jù)的最小時(shí)間數(shù)據(jù)(第一條數(shù)據(jù)寫入的時(shí)間)加上最大時(shí)間數(shù)據(jù)(最后一條數(shù)據(jù)的寫入時(shí)間)的時(shí)間值為文件的名稱。
例如,在將內(nèi)存塊中的數(shù)據(jù)寫入磁盤時(shí),當(dāng)1gb的內(nèi)存塊寫滿時(shí),這個(gè)內(nèi)存塊里面存儲(chǔ)有很多數(shù)據(jù),在數(shù)據(jù)隨機(jī)讀取時(shí),就可以根據(jù)要檢索的時(shí)間范圍,判斷需要讀取的文件個(gè)數(shù),從而減少讀取文件的總個(gè)數(shù)。
步驟3.4,hfile文件flush到磁盤結(jié)束,此時(shí)對(duì)應(yīng)的內(nèi)存塊的wal日志需要被清理掉,對(duì)wal日志文件執(zhí)行delete操作。
本發(fā)明實(shí)施例中,使用雙緩沖隊(duì)列比單緩沖阻塞隊(duì)列和單緩存隊(duì)列的效果都要好。在處理線程同步的時(shí)候,是要花費(fèi)時(shí)間的,通過(guò)雙緩存隊(duì)列可以更大限度地提高程序的運(yùn)行效率。尤其是在大的程序里面,這樣的效果體現(xiàn)得更明顯。而往往越大的系統(tǒng),對(duì)性能的要求也就越高。
本發(fā)明實(shí)施例中充分的利用了hbase的hfile文件結(jié)構(gòu)與kafka的partition的分區(qū)功能,其中利用partition的分區(qū),把數(shù)據(jù)分發(fā)到不同的處理節(jié)點(diǎn)上,從而提高數(shù)據(jù)的寫入能力,更好的利用網(wǎng)絡(luò)帶寬。例如,一個(gè)10mb的數(shù)據(jù)包過(guò)來(lái),后面的處理節(jié)點(diǎn)有10個(gè),就可以通過(guò)partition設(shè)置為10,讓每個(gè)處理節(jié)點(diǎn)接收1mb的數(shù)據(jù)。這里所說(shuō)的不同的處理節(jié)點(diǎn)是總的部署有kafka的多個(gè)節(jié)點(diǎn),每次把數(shù)據(jù)發(fā)給某一個(gè),當(dāng)下一次數(shù)據(jù)過(guò)來(lái)的時(shí)候,把數(shù)據(jù)再發(fā)給另一個(gè)kafka節(jié)點(diǎn),類似于輪詢,保證每一個(gè)接收數(shù)據(jù)的節(jié)點(diǎn)都能平等對(duì)待。
圖5示意性示出了根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)檢索服務(wù)的工作流程圖。
如圖5所示,是本發(fā)明實(shí)施例數(shù)據(jù)檢索服務(wù)在接收到對(duì)卡口車輛數(shù)據(jù)的查詢請(qǐng)求后的處理流程。數(shù)據(jù)檢索服務(wù)在接收到對(duì)卡口車輛數(shù)據(jù)的查詢請(qǐng)求后的處理流程,具體可以包括:
步驟1,當(dāng)應(yīng)用端發(fā)起一個(gè)數(shù)據(jù)檢索的請(qǐng)求時(shí),本發(fā)明實(shí)施例會(huì)開(kāi)啟一個(gè)專用的數(shù)據(jù)檢索服務(wù),此數(shù)據(jù)檢索服務(wù)可以監(jiān)聽(tīng)http/rpc的請(qǐng)求,當(dāng)請(qǐng)求被接收到后,數(shù)據(jù)檢索服務(wù)開(kāi)始對(duì)請(qǐng)求進(jìn)行解析,生成請(qǐng)求需要的維度的索引檢索條件或者說(shuō)按請(qǐng)求維度生成索引的優(yōu)化條件,向索引服務(wù)發(fā)起檢索請(qǐng)求,并得到topn的結(jié)果。
步驟2,索引服務(wù)在響應(yīng)完成索引的search結(jié)果后,此時(shí)根據(jù)響應(yīng)的結(jié)果對(duì)應(yīng)的數(shù)據(jù)的唯一key值,從線程池中拿出兩個(gè)線程并行向hbase與圖像存儲(chǔ)服務(wù)中批量讀取key的信息,此部分利用了hbase高效的隨機(jī)讀取能力。
步驟3,對(duì)圖像存儲(chǔ)服務(wù)與hbase中返回的原始圖像數(shù)據(jù)和結(jié)構(gòu)化數(shù)據(jù)的消息進(jìn)行合并,并轉(zhuǎn)換成應(yīng)用端可接受的例如json數(shù)據(jù)格式,向應(yīng)用端響應(yīng)結(jié)果。
圖6示意性示出了根據(jù)本發(fā)明實(shí)施例的圖像數(shù)據(jù)回滾服務(wù)的工作流程圖。
如圖6所示,圖像數(shù)據(jù)本身是一個(gè)占用存儲(chǔ)空間非常大的服務(wù),因此圖像存儲(chǔ)服務(wù)本身需要的圖像數(shù)據(jù)回滾服務(wù)用于定時(shí)根據(jù)配置的數(shù)據(jù)熱度與后續(xù)動(dòng)作進(jìn)行數(shù)據(jù)的遷移和/或清理動(dòng)作,其中數(shù)據(jù)熱度根據(jù)時(shí)間來(lái)進(jìn)行表示,具體可以包括:
步驟1,當(dāng)圖像存儲(chǔ)服務(wù)啟動(dòng)時(shí),首先會(huì)把當(dāng)前圖像存儲(chǔ)服務(wù)的rpc相關(guān)的連接信息向圖像數(shù)據(jù)回滾服務(wù)發(fā)起連接進(jìn)行注冊(cè),圖像數(shù)據(jù)回滾服務(wù)記錄各個(gè)圖像存儲(chǔ)服務(wù)的rpc連接信息到內(nèi)存表中。
步驟2,此步驟在圖像數(shù)據(jù)回滾服務(wù)啟動(dòng)后的定時(shí)器中定時(shí)觸發(fā)數(shù)據(jù)判斷請(qǐng)求,具體可以包括:
步驟2.1,數(shù)據(jù)熱度配置表信息,此信息記錄兩個(gè)關(guān)鍵動(dòng)作,熱度時(shí)間范圍(如最近一個(gè)月內(nèi)),存儲(chǔ)策略(例如可配置高性能磁盤、歸檔存儲(chǔ)、清理),在本步驟中讀取數(shù)據(jù)的熱度配置。
步驟2.2,向已經(jīng)在圖像數(shù)據(jù)回滾服務(wù)中注冊(cè)的所有的圖像存儲(chǔ)服務(wù)發(fā)起rpc請(qǐng)求,得到各服務(wù)中當(dāng)前的存儲(chǔ)目錄信息,這些存儲(chǔ)目錄就是數(shù)據(jù)寫入的日期值。
步驟2.3,根據(jù)步驟2.2中得到的各服務(wù)中記錄的圖像存儲(chǔ)日期與當(dāng)前配置的熱度規(guī)則,計(jì)算當(dāng)前的目錄是否需要執(zhí)行相應(yīng)的回滾操作。
步驟3,此步驟在根據(jù)熱度配置計(jì)算各圖像存儲(chǔ)服務(wù)的數(shù)據(jù)后,向各圖像服務(wù)器發(fā)起具體的操作處理動(dòng)作,具體可以包括:
步驟3.1,如果某個(gè)圖像存儲(chǔ)服務(wù)中有高性能磁盤的數(shù)據(jù)時(shí)間已經(jīng)達(dá)到了需要遷移到集中存儲(chǔ)的數(shù)據(jù)時(shí)(前提是圖像存儲(chǔ)服務(wù)節(jié)點(diǎn)中配置有可選的集中式存儲(chǔ)),向這個(gè)圖像存儲(chǔ)服務(wù)發(fā)起一個(gè)rpc請(qǐng)求,通知其對(duì)指定的目錄進(jìn)行遷移。這里的數(shù)據(jù)遷移是對(duì)高性能磁盤數(shù)據(jù)超過(guò)時(shí)間的數(shù)據(jù)遷移到集中存儲(chǔ)。
步驟3.2,如果某個(gè)圖像存儲(chǔ)服務(wù)中存儲(chǔ)的目錄日期已經(jīng)達(dá)到了需要從磁盤中清理出去的要求時(shí),向圖像存儲(chǔ)服務(wù)發(fā)起清理數(shù)據(jù)的rpc請(qǐng)求,在圖像存儲(chǔ)服務(wù)內(nèi)部接收到該請(qǐng)求后,判斷數(shù)據(jù)所在的磁盤存儲(chǔ)類型,并在指定的存儲(chǔ)磁盤中delete掉這部分目錄。這里的數(shù)據(jù)清理表示磁盤數(shù)據(jù)不再需要,可直接刪除,刪除前的數(shù)據(jù)可能在集中存儲(chǔ)也有可能在高性能磁盤。
本發(fā)明實(shí)施方式提供的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法,通過(guò)hadoop生態(tài)系統(tǒng)的相關(guān)組件與自研圖像存儲(chǔ)服務(wù)并采用hfile文件結(jié)構(gòu)的方法,能夠更好的解決海量卡口車輛數(shù)據(jù)的存儲(chǔ)能力、大批量圖像數(shù)據(jù)寫入的吞吐能力與在海量圖像數(shù)據(jù)中進(jìn)行快速隨機(jī)讀取的性能。
與現(xiàn)有技術(shù)相比,本發(fā)明實(shí)施例在提供一個(gè)海量的圖像數(shù)據(jù)與結(jié)構(gòu)化數(shù)據(jù)的混合存儲(chǔ)能力的同時(shí),還解決了如下幾個(gè)大的技術(shù)難點(diǎn):
解決了hadoop原生系統(tǒng)不支持海量小文件存儲(chǔ)問(wèn)題。本發(fā)明實(shí)施例通過(guò)圖像存儲(chǔ)服務(wù),圖像數(shù)據(jù)寫入時(shí)先寫入內(nèi)存,當(dāng)內(nèi)存達(dá)到閾值例如1gb后,生成hbase的hfile文件。在hadoop的原生系統(tǒng)中,一個(gè)圖像就是一個(gè)文件,而圖像本身只有300~500kb。還解決了高性能的圖像隨機(jī)讀取問(wèn)題和多維度結(jié)構(gòu)化數(shù)據(jù)的快速檢索問(wèn)題以及圖像存儲(chǔ)區(qū)域磁盤空間回滾難、回滾慢問(wèn)題。
圖7示意性示出了根據(jù)本發(fā)明實(shí)施例的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索裝置的框圖。
如圖7所示,該公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索裝置100可以包括數(shù)據(jù)接入與分發(fā)模塊110、數(shù)據(jù)存儲(chǔ)模塊120、圖像數(shù)據(jù)存取模塊130以及數(shù)據(jù)檢索模塊140。
其中數(shù)據(jù)接入與分發(fā)模塊110可以用于接收車輛數(shù)據(jù),根據(jù)所述車輛數(shù)據(jù)生成對(duì)應(yīng)的索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)并分別分發(fā)至索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)。
數(shù)據(jù)存儲(chǔ)模塊120可以用于分別通過(guò)所述索引服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)和圖像存儲(chǔ)服務(wù)將所述索引信息、結(jié)構(gòu)化數(shù)據(jù)和圖像數(shù)據(jù)存儲(chǔ)至elasticsearch、hbase和內(nèi)存中。
圖像數(shù)據(jù)存取模塊130可以用于當(dāng)所述內(nèi)存中存儲(chǔ)的圖像數(shù)據(jù)達(dá)到預(yù)設(shè)閾值時(shí),生成hbase的hfile文件,將所述圖像數(shù)據(jù)寫入磁盤中。
數(shù)據(jù)檢索模塊140可以用于利用所述hbase和elasticsearch實(shí)現(xiàn)所述車輛數(shù)據(jù)的檢索。
從另一方面上講,本發(fā)明實(shí)施例為了解決公安卡口的海量結(jié)構(gòu)化數(shù)據(jù)與圖像數(shù)據(jù)的存儲(chǔ)與檢索提供了一整套的處理裝置,可以包括:采集接入接口定義單元,作用于對(duì)數(shù)據(jù)采集終端的數(shù)據(jù)的寫入提供海量寫入的吞吐能力;數(shù)據(jù)分區(qū)規(guī)則與數(shù)據(jù)key的生成策略單元,作用于生成數(shù)據(jù)的全局唯一key與網(wǎng)絡(luò)帶寬的分配;數(shù)據(jù)接入處理單元,作用于對(duì)實(shí)時(shí)接入的車輛數(shù)據(jù)進(jìn)行分析生成索引、結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)與圖像數(shù)據(jù)存儲(chǔ)分發(fā)的服務(wù);圖像存儲(chǔ)單元,作用于把一個(gè)個(gè)小的圖像文件進(jìn)行合并并生成圖像的索引進(jìn)行存儲(chǔ)的服務(wù);數(shù)據(jù)檢索單元,作用于針對(duì)client端程序?qū)A繑?shù)據(jù)進(jìn)行快速檢索的服務(wù);圖像數(shù)據(jù)回滾單元,作用于對(duì)圖像數(shù)據(jù)按時(shí)間熱度進(jìn)行遷移與清理動(dòng)作來(lái)釋放高性能磁盤的空間。
本發(fā)明實(shí)施例中的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索裝置中的各組成模塊和/或單元具體實(shí)現(xiàn)可參考上述方法實(shí)施例,在此不再贅述。
進(jìn)一步的,本公開(kāi)實(shí)施例還提供一種電子設(shè)備,可以包括處理器以及存儲(chǔ)器。所述存儲(chǔ)器可以用于存儲(chǔ)所述處理器的可執(zhí)行指令。其中,所述處理器被配置為執(zhí)行上述任意一實(shí)施例所述的公安卡口海量車輛數(shù)據(jù)存儲(chǔ)與檢索方法。
應(yīng)當(dāng)注意,盡管在上文詳細(xì)描述中提及了用于動(dòng)作執(zhí)行的設(shè)備的若干模塊或者單元,但是這種劃分并非強(qiáng)制性的。實(shí)際上,根據(jù)本發(fā)明的實(shí)施方式,上文描述的兩個(gè)或更多模塊或者單元的特征和功能可以在一個(gè)模塊或者單元中具體化。反之,上文描述的一個(gè)模塊或者單元的特征和功能可以進(jìn)一步劃分為由多個(gè)模塊或者單元來(lái)具體化。
通過(guò)以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員易于理解,這里描述的示例實(shí)施方式可以通過(guò)軟件實(shí)現(xiàn),也可以通過(guò)軟件結(jié)合必要的硬件的方式來(lái)實(shí)現(xiàn)。因此,根據(jù)本發(fā)明實(shí)施方式的技術(shù)方案可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該軟件產(chǎn)品可以存儲(chǔ)在一個(gè)非易失性存儲(chǔ)介質(zhì)(可以是cd-rom,u盤,移動(dòng)硬盤等)中或網(wǎng)絡(luò)上,包括若干指令以使得一臺(tái)計(jì)算設(shè)備(可以是個(gè)人計(jì)算機(jī)、服務(wù)器、觸控終端、或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行根據(jù)本發(fā)明實(shí)施方式的方法。
本領(lǐng)域技術(shù)人員在考慮說(shuō)明書及實(shí)踐這里公開(kāi)的發(fā)明后,將容易想到本發(fā)明的其它實(shí)施方案。本申請(qǐng)旨在涵蓋本發(fā)明的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本發(fā)明的一般性原理并包括本發(fā)明未公開(kāi)的本技術(shù)領(lǐng)域中的公知常識(shí)或慣用技術(shù)手段。說(shuō)明書和實(shí)施例僅被視為示例性的,本發(fā)明的真正范圍和精神由下面的權(quán)利要求指出。
應(yīng)當(dāng)理解的是,本發(fā)明并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并且可以在不脫離其范圍進(jìn)行各種修改和改變。本發(fā)明的范圍僅由所附的權(quán)利要求來(lái)限制。