本發明涉及大數據、數據庫
技術領域:
:,尤其涉及一種基于memcached的大數據緩存交互式查詢方法。
背景技術:
::隨著網絡的發展和普及,應用生產和需要處理的數據量越來越大。數據的爆炸式增長,使得現在數據庫系統的工作負載日益增大,不斷增長的數據量要求越來越多的應用程序能夠擴展到更大的集群里去計算,因此大數據分布式計算是處理海量數據的必由之路。在信息技術高速發展的今天,各種大數據處理和分析工具及框架應運而生,其中典型的處理框架如hadoop、spark、storm等。以伯克利大學推出的apachespark為例,它是目前非常強大的分布式計算框架。spark使用了內存內運算技術,能在數據尚未寫入硬盤時即在內存內分析運算,在某種程度上是對mapreduce模型的一種擴展。spark解決了mapreduce不擅長的計算工作,比如迭代式、交互式和流式。雖然spark在操作大數據集上很有優勢,但是它仍然需要數據的持久化存儲,hdfs是比較通用的選擇,其和spark結合使用,然而它基于磁盤的特點,導致在實時應用程序中會影響性能。參與大數據計算的數據來自流、內存以及磁盤,后者包括關系數據庫管理系統(rdbms)、hbase數據庫、mongodb數據庫以及hdfs文件系統。在大數據處理框架中,待處理的數據格式需要滿足諸如可分塊、不可修改等規范,因此,人們定義了類似于rdd(resilientdistributeddatasets,彈性分布式數據集)以及hiveql、sparksql等類sql的接口,并且針對常用的數據源提供了相應的驅動程序。如:借助于apachespark的sparksql組件,可以將hbase、mongodb、hdfs文件系統等存儲映射成數據庫表,并提供高效的sql查詢能力。hbase、mongodb、hdfs文件系統將數據存儲在磁盤中,盡管它們采用了cache結構,但仍具有較大的讀寫延遲。在大數據應用場景中,為了實現更高效的數據訪問性能,很多高頻數據(如:熱門商品、實時統計變量等)往往需要借助于memcached這一類緩存系統進行存儲。memcached是以livejournal公司里的bradfitzpatric為首開發的一款軟件,是一套分布式的高速緩存系統,由于它基于內存緩存的特性,使得在應用中有比較高的性能與可擴展性。由于memcached與hbase、關系型數據庫等系統采用了不同的存儲模型即key-value模型,因此需要針對memcached開發支持大數據計算框架的sql查詢驅動。另一方面,現有的應用程序,只能通過api方式調用memcached服務(這些api往往對應著memcached協議的不同命令,https://github.com/memcached/memcached/wiki/commands),這種api的使用方式缺乏與大數據處理框架的集成能力。以一個weblog(web日志)統計系統為例,為了高效的統計網站的用戶數,網站的日志記錄會依次流經大數據消息系統kafka、大數據存儲系統hbase、在線緩存系統memcached,以及傳統的關系型數據庫mysql等。然而由于memcached采用api而非sql語言,程序開發人員無法采用一種通用的、適用于大數據計算框架的方法來操作memcached,這種緊耦合性會影響系統部署的靈活性。已存在一些針對hbase、hdfs、solr、mongodb的大數據交互式查詢接口的方案,如:華為開源的astro(https://github.com/huaweibigdata/astro)就是這樣一款針對hbase的sql查詢驅動。類似的軟件還包括solr-sql(https://github.com/bluejoe2008/solr-sql)、elasticsearch-sql(https://github.com/nlpchina/elasticsearch-sql)等。然而,目前還不存在一種基于memcached的大數據緩存交互式查詢的方法。技術實現要素:本發明的目的在于提供一種基于memcached的大數據緩存交互式查詢方法,該方法有效實現了針對大數據緩存進行交互式查詢的能力,同時改善了現有hadoop/spark生態中各大數據管理系統(hbase、impala等)無法滿足實時緩存數據高效讀寫的現狀。針對上述目的,本發明所采用的技術方案為:一種基于memcached的大數據緩存交互式查詢方法,其步驟包括:1)將memcached驅動程序放入sparksql的類路徑中,并引入到sparksql的sqlcontext(sql環境)中;所述memcached驅動程序包括defaultsource、memcachedrelation和memcachedrdd,其中所述defaultsource實現了spark中的relationprovider,用于創建sparksql數據源中的memcachedrelation;所述memcachedrelation繼承并實現了spark中的baserelation和tablescan,用于根據用戶需求實現sparksql與memcached服務器之間的交互;所述memcachedrdd為spark處理memcached服務器中的數據提供接口;2)根據memcached服務器中緩存數據的結構指定表的數據模式(schema),調用sqlcontext的sql()方法,提交createtable語句創建sparksql數據源中的表;3)調用sqlcontext的sql()方法,提交sqlinsert語句,在sparksql中根據上述創建的表并調用memcachedapi將數據寫入memcached服務器中;4)調用sqlcontext的sql()方法,提交sqlselect語句,在sparksql中根據上述創建的表并調用memcachedapi查詢memcached服務器中的緩存數據。進一步地,步驟1)中所述memcached驅動程序表現為一個java程序包(jar)的形式。進一步地,步驟1)中所述memcachedrelation還用于存放數據模式的映射和scan數據的規則。進一步地,步驟1)中所述memcachedrdd還定義了數據在模式定義下類型的強制轉換。進一步地,步驟2)中所述數據模式包括數據表的表名及所屬類型、列的列名,且每一列需要指定列名以及值類型。進一步地,步驟2)中在創建sparksql數據源中的表時,通過using參數指定采用的memcached驅動。進一步地,步驟2)中在創建sparksql數據源中的表時,通過options參數指定memcached服務器的參數;所述memcached服務器的參數包括服務器地址、主機列表和數據列存儲在memcached中key的前綴。本發明的有益效果在于:本發明提供一種基于memcached的大數據緩存交互式查詢方法,該方法利用緩存在內存讀寫的高效性,提高了交互式查詢的效率;基于sparksql實現了針對memcached做交互式查詢和存儲的驅動程序。本發明根據sparksql的實現原理,將memcached驅動作為外部數據源,對外提供api的同時,還可以支持ddl(數據定義語言)方式進行的交互式查詢。本發明方法的優點具體為:(1)使用memcached服務器來實現行數據的存儲和查詢。目前很多大數據管理系統如:hbase、impala等,由于采用磁盤存儲,為保證持久性和最終一致性,仍具有一定的延時,因此不適合處理在線緩存數據。另一方面,盡管很多應用采取memcached來存儲數據,但一般用來存儲離散的數據(如某個統計結果等),還缺乏一種存儲查詢行數據的方案。本發明方法將分布式數據庫memcached作為數據存儲端,充分利用memcached基于內存存儲優勢和良好的讀寫性能,并實現了行數據的存儲、查詢。(2)提供了一種非api的方式實現對memcached系統的操作。目前基于memcached的應用,主要通過c++/java等api的方式實現對memcached的讀、寫操作,這種方式對開發人員要求較高,且很容易受到api客戶端版本的影響。采用本發明方法,則可以采用標準的sql語言實現對memcached緩存數據的操作,開發人員甚至不需要編寫程序,通過常用的sql語言,即可完成需求。(3)實現了與流行的大數據計算框架的完美結合:本發明方法完美實現了與sparksql框架的集成,并可實現與hive、impala的數據流集成。從目前的技術調研情況來看,大數據計算框架往往忽略了與memcached等緩存系統的集成,傳統的在線應用則很難遷移到大數據計算框架中來。附圖說明圖1為本發明方法實現memcached驅動作為sparksql外部數據源的內部結構示意圖;圖2為本發明一種基于memcached的大數據緩存交互式查詢方法的流程圖;圖3為本發明一實施例的創建數據表的操作流程圖。具體實施方式為使本發明的上述特征和優點能更明顯易懂,下文特舉實施例,并配合所附圖作詳細說明如下。本發明提供一種基于memcached的大數據緩存交互式查詢方法,該方法基于sparksql提供的構建外部數據源的方式,結合memcached緩存的內存讀寫特點,對特定應用場景下的大數據存儲介質作了重新的定義。同時實現了大數據處理過程中中間計算結果在memcached服務器中的緩存,通過memcached良好的讀寫性能,結合sparksql強大的交互式查詢分析能力,有效的提高了系統的性能。請參考圖1,該圖為本發明方法實現memcached驅動作為sparksql外部數據源的內部結構示意圖,其中baserelation、relationprovider和tablescan為spark中提供的接口抽象類。本發明方法主要實現了defaultsource、memcachedrelation和memcachedrdd三大類(對象),下面為各個類(對象)的具體描述:1、defaultsource:實現了spark中的relationprovider,用于創建sparksql數據源中的baserelation(本發明具體為memcachedrelation);2、relationprovider:一種抽象類,對某種特定的數據源生成對應的baserelation;3、baserelation:一種抽象類,表示一種已知模式的元組集合,是對外部數據源的抽象,繼承baserelation的類必須提供它們數據中基于structtype的模式;4、tablescan:一種抽象類接口,用于把baserelation中的元組生成row對象集合的rdd;5、memcachedrelation:繼承并實現了baserelation和tablescan,根據用戶需求實現sparksql與memcached服務器之間的交互;6、memcachedrdd:rdd是spark中的核心編程模型,為spark處理memcached中的數據提供了重要的接口。對于實現一個外部數據源,需要定義對應的relation(本發明為memcachedrelation)來繼承baserelation,作為外部數據源抽象的一種實現,存放數據模式的映射和scan數據的規則(即buildscan)。而memcachedrelation的生成需要通過datasource的apply方法創建,本發明為defaultsource,它實現了sparksql提供的抽象接口relationprovider,提供createrelation方法生成對應的memcachedrelation。除此之外,本發明定義了對象memcachedrdd,它具體實現了sparksql與memcached服務器交互的一系列操作,比如將數據寫入memcached服務器,從memcached服務器中讀取數據,還定義了數據在模式定義下類型的強制轉換等。本發明提供了一種memcached驅動作為sparksql外部數據源,該驅動基于sparksql提供對memcached服務器的操作,用戶可將數據分布式存儲在memcached服務器中,數據在經過spark處理前需要提供數據模式;該驅動支持常規的數據操作(數據的增刪改查),基于高性能的spark和內存數據庫memcached,為用戶提供更高效的服務。請參考圖2,該圖為本發明一種基于memcached的大數據緩存交互式查詢方法的流程圖,其步驟包括:(1)根據memcached服務器中緩存數據的結構指定表的數據模式,調用sqlcontext的sql()方法,提交createtable語句創建sparksql數據源中的表。所述數據模式包括數據表的表名及所屬類型、列的列名,且每一列需要指定列名以及值類型。在創建sparksql數據源中的表時,通過using參數指定采用的memcached驅動;并通過options參數指定memcached服務器的參數,所述memcached服務器的參數包括服務器地址、主機列表和數據列存儲在memcached中key的前綴等。(2)將數據寫入memcached服務器。調用sqlcontext的sql()方法,提交sqlinsert語句,在sparksql中根據上述創建的sparksql數據源中的表并調用memcachedapi進行寫入操作,即可將數據插入到memcached服務器中;sparksql客戶端通過調用sqlcontext的sql()方法來實現向sparksql提交sqlinsert語句,當sparksql客戶端提交sqlinsert語句后,該語句被分為sparksql創建defaultsource與memcachedrelation和調用insert方法以實現數據的寫入。除此之外,本發明在提供數據寫入memcached服務器的接口中給出了寫操作的模式,根據用戶需求來定義是否對memcached服務器中的數據進行覆蓋寫。(3)從memcached服務器中查詢數據。調用sqlcontext的sql()方法,提交sqlselect語句,在sparksql中根據上述創建的sparksql數據源中的表并調用memcachedapi進行查詢操作,即可讀取到memcached服務器中的緩存數據。sparksql客戶端通過調用sqlcontext的sql()方法來實現向sparksql提交sqlselect語句,當sparksql客戶端提交sqlselect語句后,該語句被分為sparksql創建defaultsource與memcachedrelation和調用buildscan方法以實現數據的讀取。下面為一具體實施例來解釋說明本發明。本發明支持常用的數據操作,通過sparksql對memcached服務器中的緩存數據進行查詢與修改,同時也支持常規的sql分析操作,這里以創建數據表為例,具體流程示意圖如圖3所示,通過給出該實施例進一步說明本發明提供實現memcached驅動作為外部數據源的過程。該實施例的步驟包括:step1:準備好memcached服務器以及sparksql環境;step2:將本發明完成的主要內容,即memcached驅動程序,放在sparksql的類路徑中;step3:將上述memcached驅動程序引入到sparksql的sqlcontext中,使用ddl創建表,如本例中createtemporarytablepersons(namestring,agestring,heightstring,bornstring)usingcn.cnic.bigdatalab.spark.memcachedoptions(memcached_servers"10.0.20.47:11211",key_prefix"persons")step4:sparksql對上述sql進行解析,封裝成一個createtableusing類的對象,該類根據“cn.cnic.bigdatalab.spark.memcached”通過反射機制創建defaultsource,options中的內容為memcached服務器地址和key前綴,作為參數傳入該類,然后通過createrelation()生成memcachedrelation;step5:得到memcachedrelation后,直接調用sqlcontext的baserelationtoschemardd轉化為schemardd,最后注冊registertemptable(tablename)生成表,可以基于用戶需求進行sql查詢。以上實施僅用以說明本發明的技術方案而非對其進行限制,本領域的普通技術人員可以對本發明的技術方案進行修改或者等同替換,而不脫離本發明的精神和范圍,本發明的保護范圍應以權利要求書所述為準。當前第1頁12當前第1頁12