国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

MongoDB在氣象傳感器數(shù)據(jù)處理中的應(yīng)用

2016-01-12 07:59:59白長清劉敏
軟件 2015年11期
關(guān)鍵詞:海量數(shù)據(jù)

白長清++劉敏

摘 要:海量規(guī)模數(shù)據(jù)不斷涌現(xiàn),對非結(jié)構(gòu)型數(shù)據(jù)的存儲和處理需求日益增長,傳統(tǒng)的關(guān)系數(shù)據(jù)庫很難對其高效處理,NoSQL技術(shù)則能比較好的解決這類問題。本文將介紹NoSQL,MongoDB,以及MongoDB在處理海量氣象參數(shù)的傳感器數(shù)據(jù)時的應(yīng)用。實踐證明,以MongoDB為代表的NoSQL數(shù)據(jù)庫在存儲和訪問海量的非結(jié)構(gòu)化數(shù)據(jù)時,有著良好的性能。

關(guān)鍵詞:NoSQL;MongoDB;海量數(shù)據(jù);面向文檔

中圖分類號:TP311

文獻(xiàn)標(biāo)識碼:A

DOI: 10.3969/j.issn.1003-6970.2015.11.010

0 引言

隨著云計算時代的到來,web2.0的快速發(fā)展,非關(guān)系型、分布式數(shù)據(jù)存儲得到了快速的發(fā)展,它們具有非常高的讀寫性能,尤其在大數(shù)據(jù)量下。而且NoSQL具有靈活的數(shù)據(jù)模型,即無需事先為要存儲的數(shù)據(jù)建立字段,隨時可以存儲白定義的數(shù)據(jù)格式。在不太影響性能的情況下,就可以方便的實現(xiàn)高可用的架構(gòu)。面向文檔的MongoDB,其數(shù)據(jù)結(jié)構(gòu)非常松散,可以存儲比較復(fù)雜的數(shù)據(jù)類型,保證海量數(shù)據(jù)存儲的同時,具有良好的查詢性能,擁有廣泛應(yīng)用。

在本實驗室氣象局項目中,需要存儲、查詢大量氣象參數(shù)測量傳感器數(shù)據(jù),每次測量的數(shù)據(jù)通道并不都是一致,即測量數(shù)據(jù)是弱一致性的,還要求保持可擴(kuò)展性,并且能夠便捷的獲取數(shù)據(jù),而MongoDB能很好的滿足這些需求,本文將以實驗室氣象參數(shù)測量傳感器數(shù)據(jù)的處理為背景,介紹MongoDB在實際生產(chǎn)中的運用。

1 NoSQL

1.1 概述

NoSQL是對非關(guān)系型數(shù)據(jù)庫系統(tǒng)的總稱,意思是No SQL(沒有SQL語言)。它與關(guān)系型數(shù)據(jù)庫最重要的不同是:NoSQL不使用SQL作為查詢語言。其數(shù)據(jù)存儲可以不需要固定的表格模式,也經(jīng)常會避免使用SQL的JOIN操作,一般具有水平可擴(kuò)展的特征。在大量數(shù)據(jù)存取上具備關(guān)系型數(shù)據(jù)庫無法比擬的性能優(yōu)勢。NoSQL數(shù)據(jù)庫憑借著其非關(guān)系型、分布式、開源和橫向擴(kuò)展等優(yōu)勢,被認(rèn)為是下一代數(shù)據(jù)庫產(chǎn)品。

1.2 NoSQL分類

NoSQL可以大體上分為4個種類:Key-value(鍵值存儲)、Document-Oriented(面向文檔)、Column-Family Databases(面向表列)以及Graph-Oriented Databases(面向圖論)。下面就一覽這些類型的特性:

鍵值數(shù)據(jù)庫:通過key快速查詢到其value,存儲并不關(guān)心值的格式,比如通過國際標(biāo)準(zhǔn)書號ISBN找一本書,在這里,ISBN是鍵,書籍的其他信息就是值。必須知道鍵才能查詢。

文檔存儲數(shù)據(jù)庫:面向文檔數(shù)據(jù)庫會將數(shù)據(jù)以文檔的形式儲存。每個文檔都是白包含的數(shù)據(jù)單元,是一系列數(shù)據(jù)項的集合。每個數(shù)據(jù)項都有一個名稱與對應(yīng)的值,值既可以是簡單的數(shù)據(jù)類型,如字符串、數(shù)字和日期等;也可以是復(fù)雜的類型,如有序列表和關(guān)聯(lián)對象。

列式數(shù)據(jù)庫:也被稱為列式存儲或?qū)捔写鎯?,對?shù)據(jù)進(jìn)行列式存儲。最大的特點是方便存儲結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便做數(shù)據(jù)壓縮,對針對某一列或者某幾列的查詢有非常大的10優(yōu)勢。

圖型數(shù)據(jù)庫:圖型數(shù)據(jù)庫關(guān)注值與值之間的關(guān)系,用圖型的數(shù)學(xué)概念存儲數(shù)據(jù)。圖型數(shù)據(jù)庫用帶有點、邊緣和屬性的圖的結(jié)構(gòu)表示和存儲數(shù)據(jù)。在圖型數(shù)據(jù)庫中,每一個元素都包含一個直接的指向它毗鄰元素的點,所以也就不需要索引查找。

1.3 優(yōu)缺點

NoSQL數(shù)據(jù)庫最大的優(yōu)點在于它的去中心化、可擴(kuò)展、容錯能力等屬性。用NoSQL數(shù)據(jù)庫,你可以為每一個特殊的用例定制化你的數(shù)據(jù)管理解決方案。另外,大多數(shù)NoSQL產(chǎn)品都是輕量級的,因此花費比較少。自從NoSQL產(chǎn)品被設(shè)計用來滿足特殊的用例和解決特殊的問題,它的功能也就比大多數(shù)關(guān)系型數(shù)據(jù)庫少,因為后者要應(yīng)用于更廣泛的領(lǐng)域。因此,NoSQL數(shù)據(jù)庫需要的代碼更少,這也是和復(fù)雜的關(guān)系型數(shù)據(jù)庫相比具備的一項優(yōu)勢。

當(dāng)然,NoSQL也有它的缺點。ACID協(xié)議是關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn),但很多NoSQL數(shù)據(jù)庫做不到。如果ACID支持很關(guān)鍵,你必須要確定你選的NoSQL數(shù)據(jù)庫是否提供ACID。NoSQL數(shù)據(jù)庫的另一個缺點是不支持SQL語言。經(jīng)過40多年的發(fā)展,SQL已經(jīng)成為訪問數(shù)據(jù)的通用語言。一套數(shù)據(jù)庫系統(tǒng)不支持SQL語言就意味著要求開發(fā)者學(xué)習(xí)不同的訪問數(shù)據(jù)的語言。

NoSQL數(shù)據(jù)庫在網(wǎng)頁擴(kuò)展、大數(shù)據(jù)和分析部署等方面越來越流行。每一個種類的NoSQL數(shù)據(jù)庫都有適用的不同類型的應(yīng)用程序和用例,這就涉及到一個NoSQL社區(qū)常用的一個話題,即多樣持久性,或者說根據(jù)數(shù)據(jù)庫處理應(yīng)用程序需求的不同,使用不同的數(shù)據(jù)庫系統(tǒng),用于不同的應(yīng)用程序和用例。因此,使用NoSQL最重要的是使用正確的數(shù)據(jù)庫,滿足具體的需求,哪怕是要引入一種新的數(shù)據(jù)庫系統(tǒng)。

2 MongoDB

2.1 簡述

MongoDB是一個高性能,開源,可擴(kuò)展,無模式的文檔型數(shù)據(jù)庫,由C++語言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案,是當(dāng)前NoSql數(shù)據(jù)庫中比較熱門的一種。它是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點是他支持的查詢語言非常強(qiáng)大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。

傳統(tǒng)的關(guān)系數(shù)據(jù)庫一般由數(shù)據(jù)庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由數(shù)據(jù)庫(database)、集合(collection)、文檔對象(document)三個層次組成。集合對應(yīng)于關(guān)系型數(shù)據(jù)庫里的表,但是集合中沒有列、行和關(guān)系概念,這體現(xiàn)了其模式自由的特點。

它的特點是高性能、易部署、易使用,存儲數(shù)據(jù)非常方便。主要功能特性有:

1)面向集合存儲,易存儲對象類型的數(shù)據(jù)。

2)模式自由。

3)支持動態(tài)查詢。

4)支持完全索引,包含內(nèi)部對象。

5)支持查詢。

6)支持復(fù)制和故障恢復(fù)。

7)使用高效的二進(jìn)制數(shù)據(jù)存儲,包括大型對象(如視頻等)。

8)自動處理碎片,以支持云計算層次的擴(kuò)展性。

9)支持RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。

10)文件存儲格式為BSON(一種JSON的擴(kuò)展)。

11)可通過網(wǎng)絡(luò)訪問。

所謂“面向集合”(Collenction-Oriented),意思是數(shù)據(jù)被分組存儲在數(shù)據(jù)集中,被稱為一個集合(Collenction)。每個集合在數(shù)據(jù)庫中都有一個唯一的標(biāo)識名,并且可以包含無限數(shù)目的文檔。集合的概念類似關(guān)系型數(shù)據(jù)庫(RDBMS)里的表(table),不同的是它不需要定義任何模式(schema)。

模式自由(schema-free),意味著對于存儲在mongodb數(shù)據(jù)庫中的文件,我們不需要知道它的任何結(jié)構(gòu)定義。如果需要的話,你完全可以把不同結(jié)構(gòu)的文件存儲在同一個數(shù)據(jù)庫里。

存儲在集合中的文檔,被存儲為鍵一值對的形式。鍵用于唯一標(biāo)識一個文檔,為字符串類型,而值則可以是各種復(fù)雜的文件類型。我們稱這種存儲形式為BSON(Binary JSON)。

2.2 Mongodb安裝配置

根據(jù)自己的實際系統(tǒng)環(huán)境,下載所要的文件,我的是RHEL 7 Linux 64-bit。下載:

# wget https: //fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhe170-3.0.7.tgz解壓至/usr/local/mongodb/,創(chuàng)建數(shù)據(jù)目錄/data/mongodb,創(chuàng)建配置文件mongodb.conf。配置文件mongodb.conf如下,其中dbpath指定數(shù)據(jù)庫目錄,logpath指定日志路徑,logappend=true使日志累加,fork=true使MongoDB以守護(hù)進(jìn)程運行,port指定端口號,默認(rèn)27017。

dbpath=/data/mongo/

logpath=/data/mongo/mongo.log

logappend=true

fork=true

port=27017

MongoDB有兩種啟動方式,配置文件啟動和參數(shù)啟動,如下:

1.配置文件方式啟動mongo

#/usr/local/mongodb/bin/mongod -f/data/mongo/mongodb.conf

2.參數(shù)啟動mongo

/usr/local/mongodb/bin/mongod -logpath /data/mongo/mongo.log -logappend -fork -dbpath /data/mongo/-port 27017

3.設(shè)置開機(jī)啟動:

#echo“/usr/local/mongodb/bin/mongod—f/data/mongo/mongodb.conf”>>/etc/rc.local

3 氣象傳感器數(shù)據(jù)在mongo系統(tǒng)中的存儲

3.1 數(shù)據(jù)的插入

使用Python創(chuàng)建數(shù)據(jù)庫的方法如下:

client=MongoClient()

db=client.meteor_data

collection=db.res

連接到mongo數(shù)據(jù)庫metor_data,并選中集合(cellection) res,注意:這里并沒有創(chuàng)建集合,mongo采用延時創(chuàng)建的方法,當(dāng)有document插入時才真正創(chuàng)建相應(yīng)的數(shù)據(jù)庫和集合。

如下所示是一條測量數(shù)據(jù),‘CHIO代表通道10的測量數(shù)據(jù),102941.437對應(yīng)氣象參數(shù)的傳感器測量值。每條測量數(shù)據(jù)中通道數(shù)并不固定,可以根據(jù)測量需要選擇?!甌IME則代表測量的時刻。

{u'CHl0':102941.437,u'TIME':'2015-09-22 20:33: 10',u'CH5': 918.236714, u'CH6':270.424495,u'CH7': 328.123456, u'CH8':465.627787,u'CH9':386.63469}

我們通過把多條測量數(shù)據(jù)作為document插入集合res中,來存儲測量數(shù)據(jù),python插入document的方法為:collection.insert_one(data),其中date代表要插入的測量數(shù)據(jù)。插入后的document如下。其中,'_id'域為mongo為我們自動添加的,作為主鍵。

{u'CHl0':102941.437,u'TIME':u'2015-09-22 20:33:10', u'CH5': 918.236714, u'CH6':270.424495, u'CH7':328.123456,u'CH8':465.627787,u'CH9':386.63469, u'_id': Objectld('563afebee138233a73b2at20')}

3.2 數(shù)據(jù)的查詢

測量數(shù)據(jù)存儲后,我們可以很方便的去查詢,有相等匹配(equality matching)和條件匹配。相等匹配格式為:{, ,…},如cursor=collection.find({'TIME':'2015-09-2220:33:10'}),會查詢出TIME域為‘2015-09-22 20:33:10的document。而條件匹配會用到比較運算符,比較運算符主要有“$lt”、“$gt”、“$in”等。條件匹配格式為:{:{}},如cursor=collection.find({‘CH1:{“$lt”:4633}}),會查找出‘CH1域值小于4633的記錄。

3.3 更新

集合更新的python接口有update_one()和update_many(),更新時需指定過濾條件和匹配的document要執(zhí)行的動作。如result=collection.update_one({'TIME': '2015-09-22 20:33:10'},{“$set”:{"discription":“measure resistance”}}),會先匹配‘TIME域為‘2015-09-22 20: 33: 10的記錄,然后更新其”discription”域的值為”measure resistance”,若沒有該域,則會添加該域。其中,”$set”為設(shè)定域值運算符,其他更新運算符:”$inc”為指定域的值增加指定值,”$rename”用于重命名域名,”$push”向域值列表中添加元素。更新后的document為:

{u'CH10':102941.437, u'TIME': u'2015-09-22 20: 33: 10,u'discription': u'measure resistance',u'CH5': 918.236714, u'CH6': 270.424495, u'CH7':328.123456, u'CH8': 465.627787, u'CH9': 386.63469,u'_id':Objectld('563afebee138233a73b2af20')

3.4 聚合

MongoDB提供了一個聚合框架,其中包括常用功能,比如”$match”用于過濾記錄、“$unwind”用于解綁列表、“$group”用于根據(jù)指定域聚合。其聚合是基于階段( stage)來進(jìn)行的,其參數(shù)為一個個階段組成的列表,格式如下:db.collection.aggregate([,,…]),各階段通過管道順序執(zhí)行,以此實現(xiàn)輸入數(shù)據(jù)的過濾、分組、求和等聚合操作。通過聚合框架,還可對返回的結(jié)果進(jìn)行處理,實現(xiàn)一些特殊需求,例如別名顯示、增加字段、提取子字段等。例如在處理測量數(shù)據(jù)時需要統(tǒng)計某通道未被測量的次數(shù),方法如下:

cursor=collection.aggregate(

[

{“$match”:{“CH5”:None}},

{“$group”:{“_id”:“$CH5”,“count”:{“$sum”:1}}}

]

此聚合首先在第一階段匹配”CH5”域不存在的記錄,第二階段以”CH5”域的值分組,并以“id”作為key,統(tǒng)計各組記錄的數(shù)量,由于第一階段只匹配”CH5”域不存在的組,所以該聚合統(tǒng)計的是集合中”CH5”域不存在的記錄數(shù)。結(jié)果如下:

然而更多的高級聚合函數(shù),比如sum、average、max、min、variance方差)和standard deviation(標(biāo)準(zhǔn)差)等需要通過MapReduce來實現(xiàn)。

4 結(jié)論

MongoDB提供了面向文檔的存儲結(jié)構(gòu),其模式十分自由,這很大程度增加了document的靈活性,可以很容易擴(kuò)展支持TB級數(shù)據(jù)。同時其插入、查詢、更新、聚合等操作也十分方便簡易,支持C++、Python、Java等多種語言。本文結(jié)合實驗室氣象局研究項目,介紹了MongoDB的安裝,以及它在氣象傳感器數(shù)據(jù)存儲時的應(yīng)用,項目實踐證明了其靈活、易用等優(yōu)點。相信在不久的將來以MongoDB為代表的Nosql將有更加廣泛的應(yīng)用。

猜你喜歡
海量數(shù)據(jù)
云存儲服務(wù)端海量數(shù)據(jù)安全存儲的加密解決方案
基于HADOOP集群的數(shù)據(jù)采集和清洗
軟件工程(2016年11期)2017-01-17 17:05:51
商業(yè)銀行海量金融數(shù)據(jù)分析中數(shù)據(jù)分析技術(shù)的實踐探究
海量數(shù)據(jù)庫的設(shè)計與優(yōu)化
基于hadoop平臺海量數(shù)據(jù)的快速查詢與實現(xiàn)
基于Hadoop的海量電信數(shù)據(jù)云計算平臺研究
一種基于HBase的交通旅行時間計算方法
基于MapReduce的海量數(shù)據(jù)動態(tài)裝箱算法研究
分析面向云計算的數(shù)據(jù)安全保護(hù)關(guān)鍵技術(shù)
基于遺傳算法的多中心海量數(shù)據(jù)布局研究
溧阳市| 浦城县| 永福县| 陇南市| 元谋县| 嵊泗县| 清涧县| 巢湖市| 西安市| 浮梁县| 炉霍县| 黄山市| 凭祥市| 巴南区| 子洲县| 洮南市| 长兴县| 高邮市| 勃利县| 静安区| 游戏| 板桥市| 岚皋县| 平南县| 淮滨县| 海宁市| 报价| 叙永县| 九龙县| 盱眙县| 图木舒克市| 乐山市| 平遥县| 襄樊市| 伊吾县| 准格尔旗| 德保县| 永福县| 英山县| 莱西市| 长汀县|