<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ivaneeo's blog

    自由的力量,自由的生活。

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

    #

    DBUS_SESSION_BUS_ADDRESS="tcp:host=localhost,port=732"
    posted @ 2011-02-18 15:32 ivaneeo 閱讀(1620) | 評(píng)論 (2)編輯 收藏

    這個(gè)話題來自: Nutz的issue 361

    在考慮這個(gè)issue時(shí), 我一直傾向于使用系統(tǒng)變量file.encoding來改變JVM的默認(rèn)編碼.

    今天,我想到, 這個(gè)系統(tǒng)變量,對(duì)JVM的影響到底有多大呢?
    我使用最簡(jiǎn)單的方法看看這個(gè)變量的影響–在JDK 1.6.0_20的src.zip文件中,查找包含file.encoding字眼的文件.
    共找到4個(gè), 分別是:
    先上重頭戲 java.nio.Charset類:

    View Code JAVA
        public static Charset defaultCharset() {
                if (defaultCharset == null) {
                synchronized (Charset.class) {
                java.security.PrivilegedAction pa =
                new GetPropertyAction("file.encoding");
                String csn = (String)AccessController.doPrivileged(pa);
                Charset cs = lookup(csn);
                if (cs != null)
                defaultCharset = cs;
                else
                defaultCharset = forName("UTF-8");
                }
                }
                return defaultCharset;
                }

    java.net.URLEncoder的靜態(tài)構(gòu)造方法,影響到的方法 java.net.URLEncoder.encode(String)

    View Code JAVA

    com.sun.org.apache.xml.internal.serializer.Encoding的getMimeEncoding方法(209行起)

    View Code JAVA

    最后一個(gè)javax.print.DocFlavor類的靜態(tài)構(gòu)造方法:

    View Code JAVA

    可以看到,系統(tǒng)變量file.encoding影響到
    1. Charset.defaultCharset() Java環(huán)境中最關(guān)鍵的編碼設(shè)置
    2. URLEncoder.encode(String) Web環(huán)境中最常遇到的編碼使用
    3. com.sun.org.apache.xml.internal.serializer.Encoding 影響對(duì)無編碼設(shè)置的xml文件的讀取
    4. javax.print.DocFlavor 影響打印的編碼

    故,影響還是很大的哦, 可以說是Java中編碼的一個(gè)關(guān)鍵鑰匙!

    posted @ 2011-01-31 14:28 ivaneeo 閱讀(4041) | 評(píng)論 (0)編輯 收藏

    我們大家在做J2EE項(xiàng)目開發(fā)的時(shí)候,都會(huì)用到Application Server,然后配置Connection Pool,Data Source,但不知道大家有沒有留意到,其實(shí)我們絕大部分的應(yīng)用用的都是Apache的DBCP機(jī)制。
     
    JES,Weblogic,JBoss等等的大型App Server,其中一個(gè)好處就是提供了Admin Console,讓配置做起來就像傻瓜式的,Step By Step就可以了,下面舉個(gè)用Tomcat的應(yīng)用例子,深入一點(diǎn)探討DBCP的配置都做了些什么。(當(dāng)然得配置Server.xml了,但是其實(shí)JES和Weblogic等等的大型App Server,也是可以同樣修改Server.xml或這Domain.xml來達(dá)到同一目的的,只不過有了Admin Console,大家容易避免犯錯(cuò),但其實(shí)我覺得,要深入了解一個(gè)App Server,避免不了深入了解配置文件里面的內(nèi)容)。
     
    當(dāng)使用DBCP(通常我們都是用Oracle的了)時(shí)候,不知道大家有沒有遇到一個(gè)情況,當(dāng)數(shù)據(jù)庫連接因?yàn)槟撤N原因斷掉(有可能時(shí)網(wǎng)絡(luò)問題,導(dǎo)致App Server跑了一天后,第二天再跑馬上爆錯(cuò)誤),再從Connection Pool中獲取連接而又不做Validate,這時(shí)候取得的Connection實(shí)際上已經(jīng)是無效的了,從而導(dǎo)致程序一跑,馬上爆Connect Reset錯(cuò)誤。
     
    其實(shí)只要你了解一下DBCP的運(yùn)作機(jī)制和相關(guān)屬性的話,這個(gè)問題就很容易避免了。
     
    DBCP使用Apache的ObjectPool作為Connection Pool的實(shí)現(xiàn),在構(gòu)造GenericObjectPool的時(shí)候,會(huì)生成一個(gè)Inner Class Evictor,實(shí)現(xiàn)Runnable的接口。如果屬性_timeBetweenEvictionRunsMillis > 0,每過_timeBetweenEvictionRunsMillis毫秒后Evictor會(huì)調(diào)用evict method,檢查Object的idle time是否大于屬性_minEvictableIdleTimeMillis毫秒(如果_minEvictableIdleTimeMillis設(shè)置為<=0則忽略,使用default value 30分鐘),如果是則銷毀該Object,否則就激活并進(jìn)行Validate,然后調(diào)用ensureMinIdle method檢查確保Connection Pool中的Object個(gè)數(shù)不小于屬性_minIdle。在調(diào)用returnObject method把Object放回ObjectPool時(shí)候,需要檢查該Object是否有效,然后調(diào)用PoolableObjectFactory的passivateObject method使Object處于inactive狀態(tài),再檢查ObjectPool中的對(duì)象個(gè)數(shù)是否小于屬性_maxIdle,是則可以把該Object放回到ObjectPool,否則銷毀此Object。
     
    除此之外,還有幾個(gè)比較重要的屬性,_testOnBorrow,_testOnReturn,_testWhileIdle,這些屬性的意思是取得,返回對(duì)象,空閑時(shí)候是否進(jìn)行Valiadte,檢查對(duì)象是否有效。默認(rèn)都為False,只有把這些屬性設(shè)為True,再提供_validationQuery語句就可以保證DBCP始終有效了,例如,Oracle中就完全可以使用select 1 from dual來進(jìn)行驗(yàn)證,這里要注意的是,DBCP要求_validationQuery語句查詢的Result Set必須為非空。
     
    在Tomcat的Server.xml,我們可以看看下面的這個(gè)例子:
     
    <Resource name="lda/raw"
                  type="javax.sql.DataSource"
                   password="lda_master"
                   driverClassName="oracle.jdbc.driver.OracleDriver"
                   maxIdle="30" minIdle="2" maxWait="60000" maxActive="1000" 
                   testOnBorrow="true" testWhileIdle="true" validationQuery="select 1 from dual"
                   username="lda_master" url="jdbc:oracle:thin:@192.160.100.107:15537:lcststd"/>
     
    這樣一來,就能夠解決Connect Reset的問題了。剛才說了,其實(shí)很多App Server都會(huì)有相應(yīng)的配置地方,只是大型的服務(wù)器正好提供了Admin Console,上面可以顯式的配置Connection Pool,也有明顯的屬性選擇,這里就不一一詳述了,都是眼見的功夫。

    本文出自 “jayenho” 博客,轉(zhuǎn)載請(qǐng)與作者聯(lián)系!

    posted @ 2011-01-29 11:30 ivaneeo 閱讀(412) | 評(píng)論 (0)編輯 收藏

    摘要: 公共安全管理的一般過程分為監(jiān)測(cè)、預(yù)警、決策和處置,前兩者屬于安全事故發(fā)生前的防范,后兩者屬于事故發(fā)生后的緊急處理.公共安全事件發(fā)生的隱患越早被識(shí)別,處理就可以越及時(shí),損失就越小. 
    關(guān)鍵詞: 物聯(lián)網(wǎng)

      公共安全是指多數(shù)人的生命、健康和公私財(cái)產(chǎn)安全,其涵蓋范圍包括自然災(zāi)害,如地震、洪澇等;技術(shù)災(zāi)害,如交通事故、火災(zāi)、爆炸等;社會(huì)災(zāi)害,如騷亂、恐怖主義襲擊等;公共衛(wèi)生事件,如食品、藥品安全和突發(fā)疫情等。我國的公共安全形勢(shì)嚴(yán)峻,每年死亡人數(shù)超過20萬,傷殘人數(shù)超過200萬;每年經(jīng)濟(jì)損失近9000億元,相當(dāng)于GDP的3.5%,遠(yuǎn)高于中等發(fā)達(dá)國家1%??2%左右的水平。

      公共安全重在預(yù)先感知

      公共安全管理的一般過程分為監(jiān)測(cè)、預(yù)警、決策和處置,前兩者屬于安全事故發(fā)生前的防范,后兩者屬于事故發(fā)生后的緊急處理。公共安全事件發(fā)生的隱患越早被識(shí)別,處理就可以越及時(shí),損失就越小。管理公共安全事故的重點(diǎn)應(yīng)該在發(fā)生前,而不只是在發(fā)生之后。但目前的情況是,安全的防范技術(shù)難度大,同時(shí)也往往容易被人們所忽視。

      物聯(lián)網(wǎng)是安防的重要技術(shù)手段,目前公眾所說的物聯(lián)網(wǎng)就是帶有傳感/標(biāo)識(shí)器的智能感知信息網(wǎng)絡(luò)系統(tǒng),涵蓋了當(dāng)初的物聯(lián)網(wǎng)、傳感網(wǎng)等概念,是在傳感、識(shí)別、接入網(wǎng)、無線通信網(wǎng)、互聯(lián)網(wǎng)、計(jì)算技術(shù)、信息處理和應(yīng)用軟件、智能控制等信息集成基礎(chǔ)上的新發(fā)展。

      公共安全管理的關(guān)鍵是預(yù)先感知。感知的對(duì)象很多,例如地表、堤壩、道路交通、公共區(qū)域、?;?、周界、水資源、食品藥品生產(chǎn)環(huán)節(jié)以及疫情等容易引起公共安全事故發(fā)生的源頭、場(chǎng)所和環(huán)節(jié);感知的內(nèi)容包括震動(dòng)、壓力、流量、圖像、聲音、光線、氣體、溫濕度、濃度、化學(xué)成分、標(biāo)簽信息、生物信息等;感知的目的就是要準(zhǔn)確獲取管理對(duì)象的異常變化。

      公共安全中需要感知的對(duì)象、內(nèi)容和數(shù)量非常巨大,感知之間的關(guān)聯(lián)關(guān)系也錯(cuò)綜復(fù)雜,要做到準(zhǔn)確、及時(shí)和無遺漏,光靠人工識(shí)別基本無法做到、也不現(xiàn)實(shí)。物聯(lián)網(wǎng)的智能化應(yīng)用將轉(zhuǎn)變傳統(tǒng)管理模式,大幅度提高公共管理水平。

      求解技術(shù)局限

      物聯(lián)網(wǎng)基本層次結(jié)構(gòu)按照普遍的理解劃分為感知層、網(wǎng)絡(luò)層和應(yīng)用層。感知層由傳感器、RFID和傳感網(wǎng)絡(luò)組成,負(fù)責(zé)數(shù)據(jù)采集;網(wǎng)絡(luò)層一般指三大電信公司的寬帶網(wǎng)、Wi-Fi、GPRS/CDMA、3G/4G等,負(fù)責(zé)數(shù)據(jù)傳輸;應(yīng)用層是基于信息數(shù)據(jù)匯集之上的各類應(yīng)用。

      感知層上的局限是:目前的傳感器在較為復(fù)雜的環(huán)境下,難以做到準(zhǔn)確、快速感知;高性能傳感器的成本過高,對(duì)使用環(huán)境要求苛刻,限制了推廣;傳感器標(biāo)準(zhǔn)不統(tǒng)一,大家各自為政。

      網(wǎng)絡(luò)層比傳感層和應(yīng)用層要成熟,幾大電信公司不遺余力地?cái)U(kuò)展網(wǎng)絡(luò)能力;三網(wǎng)合一的推進(jìn)將進(jìn)一步擴(kuò)大覆蓋面、提高傳輸能力。

      應(yīng)用層上,專業(yè)系統(tǒng)條塊分割,形成“信息孤島”,限制了應(yīng)用進(jìn)一步提升和發(fā)展;各專業(yè)系統(tǒng)之間技術(shù)體系標(biāo)準(zhǔn)不統(tǒng)一,存在互聯(lián)互通的技術(shù)障礙。

      另外,在管理層面,也存在條塊分割、難以形成統(tǒng)一指揮的局面;而且創(chuàng)新和產(chǎn)業(yè)體系不成熟,創(chuàng)新能力不夠,存在較多簡(jiǎn)單模仿和貼牌,不利于形成產(chǎn)業(yè)持續(xù)、健康發(fā)展的局面。

      不過,目前安防行業(yè)也出現(xiàn)了一些新的趨勢(shì),將會(huì)影響到整個(gè)公共安全領(lǐng)域。

      IP化

      安防系統(tǒng)的數(shù)字化及網(wǎng)絡(luò)的普及為IP化提供了條件;安防系統(tǒng)從分散的單點(diǎn)系統(tǒng)朝分布式監(jiān)控、集中管理方向發(fā)展,聯(lián)網(wǎng)監(jiān)控報(bào)警是大勢(shì)所趨,“平安城市”等項(xiàng)目的大規(guī)模建設(shè)也加快了聯(lián)網(wǎng)監(jiān)控的步伐。

      IT化

      傳統(tǒng)IT廠商及電信運(yùn)營(yíng)商全面進(jìn)入安防行業(yè),安防行業(yè)面臨重大洗牌;IT行業(yè)成熟的結(jié)構(gòu)化、標(biāo)準(zhǔn)化體系架構(gòu)設(shè)計(jì)和理念將應(yīng)用于安防領(lǐng)域,推動(dòng)安防行業(yè)升級(jí)。

      網(wǎng)管化

      安防系統(tǒng)規(guī)模越來越大、監(jiān)控范圍越來越廣、監(jiān)控對(duì)象越來越多,海量存儲(chǔ)對(duì)系統(tǒng)的管理和維護(hù)提出了更高要求,需要做到電信級(jí)可管可控。

      面對(duì)這些新的趨勢(shì),公共安全的信息系統(tǒng)建設(shè)需要邁上一個(gè)智能化綜合管理的階梯。

      系統(tǒng)的融合性

      物聯(lián)網(wǎng)將橫向整合各個(gè)孤立的安防系統(tǒng),實(shí)現(xiàn)信息互通和聯(lián)動(dòng),形成立體化決策支撐體系,使決策更智能、更科學(xué)。

      平臺(tái)的開放性

      物聯(lián)網(wǎng)采用標(biāo)準(zhǔn)化的開放平臺(tái),帶動(dòng)整個(gè)安防產(chǎn)業(yè)鏈發(fā)展,形成安防行業(yè)規(guī)?;膽B(tài)勢(shì)。

      應(yīng)用的靈活性

      采用安防通用平臺(tái)+應(yīng)用子集的頂層設(shè)計(jì)架構(gòu),在保證系統(tǒng)標(biāo)準(zhǔn)化、可重用的同時(shí),滿足應(yīng)用的多樣性和不同應(yīng)用的個(gè)性化要求。

      系統(tǒng)的智能性

      智能感知通過多感知協(xié)同,在感知階段就完成信息的智能處理,濾除無效、冗余信息,保證信息獲取的真實(shí)、全面和有效;智能分析對(duì)感知信息進(jìn)行分析,對(duì)數(shù)據(jù)特征進(jìn)行準(zhǔn)確地識(shí)別和判斷;智能決策通過專家系統(tǒng)等形成最優(yōu)的決策建議;智能處置對(duì)異常情況和突發(fā)事件進(jìn)行有效的處置,如結(jié)合特定業(yè)務(wù)和應(yīng)用的報(bào)警聯(lián)動(dòng);智能管理系統(tǒng)具有智能的自動(dòng)配置管理、自動(dòng)診斷和告警、故障自動(dòng)愈合和多種接入方式的遠(yuǎn)程維護(hù)功能,盡量減輕人工負(fù)擔(dān)。

      政策科研雙管齊下

      正如物聯(lián)網(wǎng)是信息化發(fā)展的更高階段,基于物聯(lián)網(wǎng)的智能安防、安監(jiān)系統(tǒng)也是公共安全行業(yè)發(fā)展的大勢(shì)所趨。

      在政策與管理層面,需要將公共安全信息科技列入國家戰(zhàn)略性發(fā)展規(guī)劃范圍;整合現(xiàn)有相關(guān)資源,引導(dǎo)資源投入和技術(shù)、產(chǎn)品創(chuàng)新;推進(jìn)產(chǎn)學(xué)研結(jié)合,在有條件的地方開展示范項(xiàng)目建設(shè)。

      在技術(shù)層面,公共安全中的物聯(lián)網(wǎng)關(guān)鍵技術(shù)研究包括5大方面:

      1. 物聯(lián)網(wǎng)智能安防、安監(jiān)通用平臺(tái)的建設(shè),設(shè)備的接入和管理,中間件、體系結(jié)構(gòu)和標(biāo)準(zhǔn)的確立。

      2. 高性能傳感器和傳感設(shè)備的研發(fā),例如新型材料、納米材料、生物技術(shù)、仿生技術(shù)、極低功耗、MEMS。

      3. 云計(jì)算的利用,包括異構(gòu)數(shù)據(jù)海量存儲(chǔ)和管理、智能信息處理、主動(dòng)決策等。

      4. 基礎(chǔ)資源管理,包括萬億量級(jí)節(jié)點(diǎn)的標(biāo)識(shí)、異構(gòu)網(wǎng)絡(luò)融合、自治認(rèn)知。

      5. 物聯(lián)網(wǎng)的安全,涉及物的真實(shí)性、聯(lián)的可靠性、網(wǎng)的健壯性。

      物聯(lián)網(wǎng)的發(fā)展將極大地拓寬安防、安監(jiān)的范圍和內(nèi)涵,未來的安防、安監(jiān)將會(huì)滲透進(jìn)人們生活的方方面面,成為物聯(lián)網(wǎng)的一個(gè)基本功能;物聯(lián)網(wǎng)對(duì)安防、安監(jiān)行業(yè)的推動(dòng)不僅體現(xiàn)在提升傳統(tǒng)安防、安監(jiān)的技術(shù)上,還將對(duì)整個(gè)行業(yè)的產(chǎn)業(yè)格局、業(yè)務(wù)模式產(chǎn)生重大影響,今后新的安防、安監(jiān)應(yīng)用、運(yùn)營(yíng)模式也將會(huì)層出不窮。

    \
    圖注:物聯(lián)網(wǎng)智能安防共性平臺(tái)總體架構(gòu)

    (責(zé)編:邱文峰)

    posted @ 2011-01-28 15:49 ivaneeo 閱讀(463) | 評(píng)論 (0)編輯 收藏

    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    posted @ 2011-01-26 11:25 ivaneeo 閱讀(248) | 評(píng)論 (0)編輯 收藏

    一個(gè)圖片太大了,只好分割成為兩部分。根據(jù)流程圖來說一下具體一個(gè)任務(wù)執(zhí)行的情況。

    1. 在分布式環(huán)境中客戶端創(chuàng)建任務(wù)并提交。
    2. InputFormat做Map前的預(yù)處理,主要負(fù)責(zé)以下工作:
      1. 驗(yàn)證輸入的格式是否符合JobConfig的輸入定義,這個(gè)在實(shí)現(xiàn)Map和構(gòu)建Conf的時(shí)候就會(huì)知道,不定義可以是Writable的任意子類。
      2. 將input的文件切分為邏輯上的輸入InputSplit,其實(shí)這就是在上面提到的在分布式文件系統(tǒng)中blocksize是有大小限制的,因此大文件會(huì)被劃分為多個(gè)block。
      3. 通過RecordReader來再次處理inputsplit為一組records,輸出給Map。(inputsplit只是邏輯切分的第一步,但是如何根據(jù)文件中的信息來切分還需要RecordReader來實(shí)現(xiàn),例如最簡(jiǎn)單的默認(rèn)方式就是回車換行的切分)
    3. RecordReader處理后的結(jié)果作為Map的輸入,Map執(zhí)行定義的Map邏輯,輸出處理后的key和value對(duì)應(yīng)到臨時(shí)中間文件。
    4. Combiner可選擇配置,主要作用是在每一個(gè)Map執(zhí)行完分析以后,在本地優(yōu)先作Reduce的工作,減少在Reduce過程中的數(shù)據(jù)傳輸量。
    5. Partitioner可選擇配置,主要作用是在多個(gè)Reduce的情況下,指定Map的結(jié)果由某一個(gè)Reduce處理,每一個(gè)Reduce都會(huì)有單獨(dú)的輸出文件。(后面的代碼實(shí)例中有介紹使用場(chǎng)景)
    6. Reduce執(zhí)行具體的業(yè)務(wù)邏輯,并且將處理結(jié)果輸出給OutputFormat。
    7. OutputFormat的職責(zé)是,驗(yàn)證輸出目錄是否已經(jīng)存在,同時(shí)驗(yàn)證輸出結(jié)果類型是否如Config中配置,最后輸出Reduce匯總后的結(jié)果。

    業(yè)務(wù)場(chǎng)景和代碼范例

    業(yè)務(wù)場(chǎng)景描述:可設(shè)定輸入和輸出路徑(操作系統(tǒng)的路徑非HDFS路徑),根據(jù)訪問日志分析某一個(gè)應(yīng)用訪問某一個(gè)API的總次數(shù)和總流量,統(tǒng)計(jì)后分別輸出到兩個(gè)文件中。這里僅僅為了測(cè)試,沒有去細(xì)分很多類,將所有的類都?xì)w并于一個(gè)類便于說明問題。


    測(cè)試代碼類圖

    LogAnalysiser就是主類,主要負(fù)責(zé)創(chuàng)建、提交任務(wù),并且輸出部分信息。內(nèi)部的幾個(gè)子類用途可以參看流程中提到的角色職責(zé)。具體地看看幾個(gè)類和方法的代碼片斷:

    LogAnalysiser::MapClass

        public static class MapClass extends MapReduceBase
            implements Mapper<LongWritable, Text, Text, LongWritable>
        {
            public void map(LongWritable key, Text value, OutputCollector<Text, LongWritable> output, Reporter reporter)
                    throws IOException
            {   
                String line = value.toString();//沒有配置RecordReader,所以默認(rèn)采用line的實(shí)現(xiàn),key就是行號(hào),value就是行內(nèi)容
                if (line == null || line.equals(""))
                    return;
                String[] words = line.split(",");
                if (words == null || words.length < 8)
                    return;
                String appid = words[1];
                String apiName = words[2];
                LongWritable recbytes = new LongWritable(Long.parseLong(words[7]));
                Text record = new Text();
                record.set(new StringBuffer("flow::").append(appid)
                                .append("::").append(apiName).toString());
                reporter.progress();
                output.collect(record, recbytes);//輸出流量的統(tǒng)計(jì)結(jié)果,通過flow::作為前綴來標(biāo)示。
                record.clear();
                record.set(new StringBuffer("count::").append(appid).append("::").append(apiName).toString());
                output.collect(record, new LongWritable(1));//輸出次數(shù)的統(tǒng)計(jì)結(jié)果,通過count::作為前綴來標(biāo)示
            }   
        }

    LogAnalysiser:: PartitionerClass

        public static class PartitionerClass implements Partitioner<Text, LongWritable>
        {
            public int getPartition(Text key, LongWritable value, int numPartitions)
            {
                if (numPartitions >= 2)//Reduce 個(gè)數(shù),判斷流量還是次數(shù)的統(tǒng)計(jì)分配到不同的Reduce
                    if (key.toString().startsWith("flow::"))
                        return 0;
                    else
                        return 1;
                else
                    return 0;
            }
            public void configure(JobConf job){}   
    }

    LogAnalysiser:: CombinerClass

    參看ReduceClass,通常兩者可以使用一個(gè),不過這里有些不同的處理就分成了兩個(gè)。在ReduceClass中藍(lán)色的行表示在CombinerClass中不存在。

    LogAnalysiser:: ReduceClass

        public static class ReduceClass extends MapReduceBase
            implements Reducer<Text, LongWritable,Text, LongWritable>
        {
            public void reduce(Text key, Iterator<LongWritable> values,
                    OutputCollector<Text, LongWritable> output, Reporter reporter)throws IOException
            {
                Text newkey = new Text();
                newkey.set(key.toString().substring(key.toString().indexOf("::")+2));
                LongWritable result = new LongWritable();
                long tmp = 0;
                int counter = 0;
                while(values.hasNext())//累加同一個(gè)key的統(tǒng)計(jì)結(jié)果
                {
                    tmp = tmp + values.next().get();
                   
                    counter = counter +1;//擔(dān)心處理太久,JobTracker長(zhǎng)時(shí)間沒有收到報(bào)告會(huì)認(rèn)為TaskTracker已經(jīng)失效,因此定時(shí)報(bào)告一下
                    if (counter == 1000)
                    {
                        counter = 0;
                        reporter.progress();
                    }
                }
                result.set(tmp);
                output.collect(newkey, result);//輸出最后的匯總結(jié)果
            }   
        }

    LogAnalysiser

    	public static void main(String[] args)
    {
    try
    {
    run(args);
    } catch (Exception e)
    {
    e.printStackTrace();
    }
    }
    public static void run(String[] args) throws Exception
    {
    if (args == null || args.length <2)
    {
    System.out.println("need inputpath and outputpath");
    return;
    }
    String inputpath = args[0];
    String outputpath = args[1];
    String shortin = args[0];
    String shortout = args[1];
    if (shortin.indexOf(File.separator) >= 0)
    shortin = shortin.substring(shortin.lastIndexOf(File.separator));
    if (shortout.indexOf(File.separator) >= 0)
    shortout = shortout.substring(shortout.lastIndexOf(File.separator));
    SimpleDateFormat formater = new SimpleDateFormat("yyyy.MM.dd");
    shortout = new StringBuffer(shortout).append("-")
    .append(formater.format(new Date())).toString();


    if (!shortin.startsWith("/"))
    shortin = "/" + shortin;
    if (!shortout.startsWith("/"))
    shortout = "/" + shortout;
    shortin = "/user/root" + shortin;
    shortout = "/user/root" + shortout;
    File inputdir = new File(inputpath);
    File outputdir = new File(outputpath);
    if (!inputdir.exists() || !inputdir.isDirectory())
    {
    System.out.println("inputpath not exist or isn't dir!");
    return;
    }
    if (!outputdir.exists())
    {
    new File(outputpath).mkdirs();
    }

    JobConf conf = new JobConf(new Configuration(),LogAnalysiser.class);//構(gòu)建Config
    FileSystem fileSys = FileSystem.get(conf);
    fileSys.copyFromLocalFile(new Path(inputpath), new Path(shortin));//將本地文件系統(tǒng)的文件拷貝到HDFS中

    conf.setJobName("analysisjob");
    conf.setOutputKeyClass(Text.class);//輸出的key類型,在OutputFormat會(huì)檢查
    conf.setOutputValueClass(LongWritable.class); //輸出的value類型,在OutputFormat會(huì)檢查
    conf.setMapperClass(MapClass.class);
    conf.setCombinerClass(CombinerClass.class);
    conf.setReducerClass(ReduceClass.class);
    conf.setPartitionerClass(PartitionerClass.class);
    conf.set("mapred.reduce.tasks", "2");//強(qiáng)制需要有兩個(gè)Reduce來分別處理流量和次數(shù)的統(tǒng)計(jì)
    FileInputFormat.setInputPaths(conf, shortin);//hdfs中的輸入路徑
    FileOutputFormat.setOutputPath(conf, new Path(shortout));//hdfs中輸出路徑

    Date startTime = new Date();
    System.out.println("Job started: " + startTime);
    JobClient.runJob(conf);
    Date end_time = new Date();
    System.out.println("Job ended: " + end_time);
    System.out.println("The job took " + (end_time.getTime() - startTime.getTime()) /1000 + " seconds.");
    //刪除輸入和輸出的臨時(shí)文件
    fileSys.copyToLocalFile(new Path(shortout),new Path(outputpath));
    fileSys.delete(new Path(shortin),true);
    fileSys.delete(new Path(shortout),true);
    }

    以上的代碼就完成了所有的邏輯性代碼,然后還需要一個(gè)注冊(cè)驅(qū)動(dòng)類來注冊(cè)業(yè)務(wù)Class為一個(gè)可標(biāo)示的命令,讓hadoop jar可以執(zhí)行。

    public class ExampleDriver {
      public static void main(String argv[]){
        ProgramDriver pgd = new ProgramDriver();
        try {
          pgd.addClass("analysislog", LogAnalysiser.class, "A map/reduce program that analysis log .");
          pgd.driver(argv);
        }
        catch(Throwable e){
          e.printStackTrace();
        }
      }
    }

    將代碼打成jar,并且設(shè)置jar的mainClass為ExampleDriver這個(gè)類。在分布式環(huán)境啟動(dòng)以后執(zhí)行如下語句:

    hadoop jar analysiser.jar analysislog /home/wenchu/test-in /home/wenchu/test-out

    在/home/wenchu/test-in中是需要分析的日志文件,執(zhí)行后就會(huì)看見整個(gè)執(zhí)行過程,包括了Map和Reduce的進(jìn)度。執(zhí)行完畢會(huì)在/home/wenchu/test-out下看到輸出的內(nèi)容。有兩個(gè)文件:part-00000和part-00001分別記錄了統(tǒng)計(jì)后的結(jié)果。 如果需要看執(zhí)行的具體情況,可以看在輸出目錄下的_logs/history/xxxx_analysisjob,里面羅列了所有的Map,Reduce的創(chuàng)建情況以及執(zhí)行情況。在運(yùn)行期也可以通過瀏覽器來查看Map,Reduce的情況:http://MasterIP:50030/jobtracker.jsp

    Hadoop集群測(cè)試

    首先這里使用上面的范例作為測(cè)試,也沒有做太多的優(yōu)化配置,這個(gè)測(cè)試結(jié)果只是為了看看集群的效果,以及一些參數(shù)配置的影響。

    文件復(fù)制數(shù)為1,blocksize 5M

    Slave數(shù) 處理記錄數(shù)(萬條) 執(zhí)行時(shí)間(秒)
    2 95 38
    2 950 337
    4 95 24
    4 950 178
    6 95 21
    6 950 114

    Blocksize 5M

    Slave數(shù) 處理記錄數(shù)(萬條) 執(zhí)行時(shí)間(秒)
    2(文件復(fù)制數(shù)為1) 950 337
    2(文件復(fù)制數(shù)為3) 950 339
    6(文件復(fù)制數(shù)為1) 950 114
    6(文件復(fù)制數(shù)為3) 950 117

    文件復(fù)制數(shù)為1

    Slave數(shù) 處理記錄數(shù)(萬條) 執(zhí)行時(shí)間(秒)
    6(blocksize 5M) 95 21
    6(blocksize 77M) 95 26
    4(blocksize 5M) 950 178
    4(blocksize 50M) 950 54
    6(blocksize 5M) 950 114
    6(blocksize 50M) 950 44
    6(blocksize 77M) 950 74

    測(cè)試的數(shù)據(jù)結(jié)果很穩(wěn)定,基本測(cè)幾次同樣條件下都是一樣。通過測(cè)試結(jié)果可以看出以下幾點(diǎn):

    1. 機(jī)器數(shù)對(duì)于性能還是有幫助的(等于沒說^_^)。
    2. 文件復(fù)制數(shù)的增加只對(duì)安全性有幫助,但是對(duì)于性能沒有太多幫助。而且現(xiàn)在采取的是將操作系統(tǒng)文件拷貝到HDFS中,所以備份多了,準(zhǔn)備的時(shí)間很長(zhǎng)。
    3. blocksize對(duì)于性能影響很大,首先如果將block劃分的太小,那么將會(huì)增加job的數(shù)量,同時(shí)也增加了協(xié)作的代價(jià),降低了性能,但是配置的太大也會(huì)讓job不能最大化并行處理。所以這個(gè)值的配置需要根據(jù)數(shù)據(jù)處理的量來考慮。
    4. 最后就是除了這個(gè)表里面列出來的結(jié)果,應(yīng)該去仔細(xì)看輸出目錄中的_logs/history中的xxx_analysisjob這個(gè)文件,里面記錄了全部的執(zhí)行過程以及讀寫情況。這個(gè)可以更加清楚地了解哪里可能會(huì)更加耗時(shí)。

    隨想

    “云計(jì)算”熱的燙手,就和SAAS、Web2及SNS等一樣,往往都是在搞概念,只有真正踏踏實(shí)實(shí)的大型互聯(lián)網(wǎng)公司,才會(huì)投入人力物力去研究符合自己的分布式計(jì)算。其實(shí)當(dāng)你的數(shù)據(jù)量沒有那么大的時(shí)候,這種分布式計(jì)算也就僅僅只是一個(gè)玩具而已,只有在真正解決問題的過程中,它深層次的問題才會(huì)被挖掘出來。

    這三篇文章(分布式計(jì)算開源框架Hadoop介紹,Hadoop中的集群配置和使用技巧)僅僅是為了給對(duì)分布式計(jì)算有興趣的朋友拋個(gè)磚,要想真的掘到金子,那么就踏踏實(shí)實(shí)的去用、去想、去分析。或者自己也會(huì)更進(jìn)一步地去研究框架中的實(shí)現(xiàn)機(jī)制,在解決自己?jiǎn)栴}的同時(shí),也能夠貢獻(xiàn)一些什么。

    前幾日看到有人跪求成為架構(gòu)師的方式,看了有些可悲,有些可笑,其實(shí)有多少架構(gòu)師知道什么叫做架構(gòu)?架構(gòu)師的職責(zé)是什么?與其追求這么一個(gè)名號(hào),還不如踏踏實(shí)實(shí)地做塊石頭沉到水底。要知道,積累和沉淀的過程就是一種成長(zhǎng)。

    相關(guān)閱讀:

    1. 分布式計(jì)算開源框架Hadoop介紹――分布式計(jì)算開源框架Hadoop入門實(shí)踐(一)。
    2. Hadoop中的集群配置和使用技巧――分布式計(jì)算開源框架Hadoop入門實(shí)踐(二)。

    作者介紹:岑文初,就職于阿里軟件公司研發(fā)中心平臺(tái)一部,任架構(gòu)師。當(dāng)前主要工作涉及阿里軟件開發(fā)平臺(tái)服務(wù)框架(ASF)設(shè)計(jì)與實(shí)現(xiàn),服務(wù)集成平臺(tái)(SIP)設(shè)計(jì)與實(shí)現(xiàn)。沒有什么擅長(zhǎng)或者精通,工作到現(xiàn)在唯一提升的就是學(xué)習(xí)能力和速度。個(gè)人Blog為:http://blog.csdn.net/cenwenchu79。

    志愿參與InfoQ中文站內(nèi)容建設(shè),請(qǐng)郵件至editors@cn.infoq.com。也歡迎大家到InfoQ中文站用戶討論組參與我們的線上討論。

    posted @ 2011-01-25 16:14 ivaneeo 閱讀(417) | 評(píng)論 (0)編輯 收藏

         摘要: HBASE松散數(shù)據(jù)存儲(chǔ)設(shè)計(jì)初識(shí) - 西湖邊的窮秀才-文初 - BlogJava window.onerror = ignoreError; function ignoreError() { return true; } Date.prototype.Format = function(f...  閱讀全文
    posted @ 2011-01-21 19:31 ivaneeo 閱讀(407) | 評(píng)論 (0)編輯 收藏

    一、介紹
    Google的工程師為了方便自己對(duì)MapReduce的實(shí)現(xiàn)搞了一個(gè)叫做Sawzall的工具,Google就放了幾篇論文放在網(wǎng)上,但這玩意在代碼上不開源在設(shè)計(jì)思想是開源的,在前面一篇文章中我也提到過Hadoop也推出了類似Sawzall的Pig語言,就是根據(jù)Google放出來的論文山寨的。

    Pig是對(duì)處理超大型數(shù)據(jù)集的抽象層,在MapReduce中的框架中有map和reduce兩個(gè)函數(shù),如果你親手弄一個(gè)MapReduce實(shí)現(xiàn)從編寫代碼,編譯,部署,放在Hadoop上執(zhí)行這個(gè)MapReduce程序還是耗費(fèi)你一定的時(shí)間的,有了Pig這個(gè)東東以后不僅僅可以簡(jiǎn)化你對(duì)MapReduce的開發(fā),而且還可以對(duì)不同的數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換,例如:包含在連接內(nèi)的一些轉(zhuǎn)化在MapReduce中不太容易去實(shí)現(xiàn)。

    Apache Pig的運(yùn)行可以純本地的,解壓,敲個(gè)“bin/pig -x local”命令直接運(yùn)行,非常簡(jiǎn)單,這就是傳說中的local模式,但是人們往往不是這樣使用,都是將Pig與hdfs/hadoop集群環(huán)境進(jìn)行對(duì)接,我看說白了Apache的Pig最大的作用就是對(duì)mapreduce算法(框架)實(shí)現(xiàn)了一套shell腳本 ,類似我們通常熟悉的SQL語句,在Pig中稱之為Pig Latin,在這套腳本中我們可以對(duì)加載出來的數(shù)據(jù)進(jìn)行排序、過濾、求和、分組(group by)、關(guān)聯(lián)(Joining),Pig也可以由用戶自定義一些函數(shù)對(duì)數(shù)據(jù)集進(jìn)行操作,也就是傳說中的UDF(user-defined functions)。

    經(jīng)過Pig Latin的轉(zhuǎn)換后變成了一道MapReduce的作業(yè),通過MapReduce多個(gè)線程,進(jìn)程或者獨(dú)立系統(tǒng)并行執(zhí)行處理的結(jié)果集進(jìn)行分類和歸納。Map() 和 Reduce() 兩個(gè)函數(shù)會(huì)并行運(yùn)行,即使不是在同一的系統(tǒng)的同一時(shí)刻也在同時(shí)運(yùn)行一套任務(wù),當(dāng)所有的處理都完成之后,結(jié)果將被排序,格式化,并且保存到一個(gè)文件。Pig利用MapReduce將計(jì)算分成兩個(gè)階段,第一個(gè)階段分解成為小塊并且分布到每一個(gè)存儲(chǔ)數(shù)據(jù)的節(jié)點(diǎn)上進(jìn)行執(zhí)行,對(duì)計(jì)算的壓力進(jìn)行分散,第二個(gè)階段聚合第一個(gè)階段執(zhí)行的這些結(jié)果,這樣可以達(dá)到非常高的吞吐量,通過不多的代碼和工作量就能夠驅(qū)動(dòng)上千臺(tái)機(jī)器并行計(jì)算,充分的利用計(jì)算機(jī)的資源,打消運(yùn)行中的瓶頸。

    所以用Pig可以對(duì)TB級(jí)別海量的數(shù)據(jù)進(jìn)行查詢非常輕松,并且這些海量的數(shù)據(jù)都是非結(jié)構(gòu)化的數(shù)據(jù),例如:一堆文件可能是log4j輸出日志存又放于跨越多個(gè)計(jì)算機(jī)的多個(gè)磁盤上,用來記錄上千臺(tái)在線服務(wù)器的健康狀態(tài)日志,交易日至,IP訪問記錄,應(yīng)用服務(wù)日志等等。我們通常需要統(tǒng)計(jì)或者抽取這些記錄,或者查詢異常記錄,對(duì)這些記錄形成一些報(bào)表,將數(shù)據(jù)轉(zhuǎn)化為有價(jià)值的信息,這樣的話查詢會(huì)較為復(fù)雜,此時(shí)類似MySQL這樣的產(chǎn)品就并非能滿足我們的對(duì)速度、執(zhí)行效率上的需求,而用Apache的Pig就可以幫助我們?nèi)?shí)現(xiàn)這樣的目標(biāo)。

    反之,你如果在做實(shí)驗(yàn)的時(shí)候,把MySQL中的100行數(shù)據(jù)轉(zhuǎn)換成文本文件放在在pig中進(jìn)行查詢,會(huì)讓你非常失望,為何這短短的100行數(shù)據(jù)查詢的效率極低,呵呵,因?yàn)橹虚g有一個(gè)生成MapReduce作業(yè)的過程,這是無法避免的開銷,所以小量的數(shù)據(jù)查詢是不適合pig做的,就好比用關(guān)二哥的大刀切青菜一樣。另外,還可以利用Pig的API在Java環(huán)境中調(diào)用,對(duì)Apache的Pig以上內(nèi)容請(qǐng)?jiān)试S我這樣片面的理解,謝謝。

     
    二、基本架構(gòu)
     
    從整體上來看大量的數(shù)據(jù)聚集在HDFS系統(tǒng)上,通過輸入類似SQL的腳本簡(jiǎn)化對(duì)MapReduce的操作,讓這幾行代碼/腳本去驅(qū)動(dòng)上千臺(tái)機(jī)器進(jìn)行并行計(jì)算。
    如圖所示:
     Apache-Pig-Architect.jpg

    Pig的實(shí)現(xiàn)有5個(gè)主要的部分構(gòu)成:
    如圖所示:
    apache zebra

    1.Pig自己實(shí)現(xiàn)的一套框架對(duì)輸入、輸出的人機(jī)交互部分的實(shí)現(xiàn),就是Pig Latin 。
    2.Zebra是Pig與HDFS/Hadoop的中間層、Zebra是MapReduce作業(yè)編寫的客戶端,Zerbra用結(jié)構(gòu)化的語言實(shí)現(xiàn)了對(duì)hadoop物理存儲(chǔ)元數(shù)據(jù)的管理也是對(duì)Hadoop的數(shù)據(jù)抽象層,在Zebra中有2個(gè)核心的類 TableStore(寫)/TableLoad(讀)對(duì)Hadoop上的數(shù)據(jù)進(jìn)行操作。
    3.Pig中的Streaming主要分為4個(gè)組件: 1. Pig Latin 2. 邏輯層(Logical Layer) 3. 物理層(Physical Layer) 4. Streaming具體實(shí)現(xiàn)(Implementation),Streaming會(huì)創(chuàng)建一個(gè)Map/Reduce作業(yè),并把它發(fā)送給合適的集群,同時(shí)監(jiān)視這個(gè)作業(yè)的在集群環(huán)境中的整個(gè)執(zhí)行過程。 
    4.MapReduce在每臺(tái)機(jī)器上進(jìn)行分布式計(jì)算的框架(算法)。
    5.HDFS最終存儲(chǔ)數(shù)據(jù)的部分。

    三、與Hive對(duì)比
    請(qǐng)?jiān)试S我很無聊的把飛機(jī)和火車拿來做比較,因?yàn)?者根本沒有深入的可比性,雖然兩者都是一種高速的交通工具,但是具體的作用范圍是截然不同的,就像Hive和Pig都是Hadoop中的項(xiàng)目,并且Hive和pig有很多共同點(diǎn),但Hive還似乎有點(diǎn)數(shù)據(jù)庫的影子,而Pig基本就是一個(gè)對(duì)MapReduce實(shí)現(xiàn)的工具(腳本)。兩者都擁有自己的表達(dá)語言,其目的是將MapReduce的實(shí)現(xiàn)進(jìn)行簡(jiǎn)化,并且讀寫操作數(shù)據(jù)最終都是存儲(chǔ)在HDFS分布式文件系統(tǒng)上。看起來Pig和Hive有些類似的地方,但也有些不同,來做一個(gè)簡(jiǎn)單的比較,先來看一張圖:
    hive and pig
    查看大圖請(qǐng)點(diǎn)擊這里

    再讓我說幾句廢話:
    Language
    在Hive中可以執(zhí)行  插入/刪除 等操作,但是Pig中我沒有發(fā)現(xiàn)有可以 插入 數(shù)據(jù)的方法,請(qǐng)?jiān)试S我暫且認(rèn)為這是最大的不同點(diǎn)吧。

    Schemas
    Hive中至少還有一個(gè)“表”的概念,但是Pig中我認(rèn)為是基本沒有表的概念,所謂的表建立在Pig Latin腳本中,對(duì)與Pig更不要提metadata了。

    Partitions
    Pig中沒有表的概念,所以說到分區(qū)對(duì)于Pig來說基本免談,如果跟Hive說“分區(qū)”(Partition)他還是能明白的。

    Server
    Hive可以依托于Thrift啟動(dòng)一個(gè)服務(wù)器,提供遠(yuǎn)程調(diào)用。 找了半天壓根沒有發(fā)現(xiàn)Pig有這樣的功能,如果你有新發(fā)現(xiàn)可以告訴我,就好像有人開發(fā)了一個(gè)Hive的REST

    Shell
    在Pig 你可以執(zhí)行一些個(gè) ls 、cat 這樣很經(jīng)典、很cool的命令,但是在使用Hive的時(shí)候我壓根就沒有想過有這樣的需求。

    Web Interface
    Hive有,Pig無

    JDBC/ODBC
    Pig無,Hive有


    四、使用

    1啟動(dòng)/運(yùn)行  
    分為2臺(tái)服務(wù)器,一臺(tái)作為pig的服務(wù)器,一臺(tái)作為hdfs的服務(wù)器。
    首先需要在pig的服務(wù)器上進(jìn)行配置,將pig的配置文件指向hdfs服務(wù)器,修改pig/conf目錄下的
     vim /work/pig/conf/pig.properties
     添加以下內(nèi)容:
    fs.default.name=hdfs://192.168.1.201:9000/    #指向HDFS服務(wù)器
    mapred.job.tracker=192.168.1.201:9001          #指向MR job服務(wù)器地址

    如果是第一次運(yùn)行請(qǐng)?jiān)贖adoop的HDFS的服務(wù)器上創(chuàng)建root目錄,并且將etc目錄下的passwd文件放在HDFS的root目錄下,請(qǐng)執(zhí)行以下兩條命令。
    hadoop fs -mkdir /user/root
    hadoop fs -put /etc/passwd /user/root/passwd

    創(chuàng)建運(yùn)行腳本,用vim命令在pig的服務(wù)器上創(chuàng)建javabloger_testscript.pig 文件,內(nèi)容如下:
    LoadFile = load 'passwd' using PigStorage(':');
    Result = foreach LoadFile  generate $0 as id;
    dump Result;

    運(yùn)行pig腳本,例如:pig javabloger_testscript.pig,執(zhí)行狀態(tài)如圖所示:
    pig

    執(zhí)行結(jié)果:

    2.java 代碼  運(yùn)行并且打印運(yùn)行結(jié)果
    import java.io.IOException;
    import java.util.Iterator;

    import org.apache.pig.PigServer;
    import org.apache.pig.data.Tuple;

    public class  LocalPig {
        public static void main(String[] args) {
            try {
                PigServer pigServer = new PigServer("local");
                runIdQuery(pigServer, "passwd");
            } catch (Exception e) {
            }
        }

        public static void runIdQuery(PigServer pigServer, String inputFile)  throws IOException {
            pigServer.registerQuery("LoadFile = load '" + inputFile+ "' using PigStorage(':');");
            pigServer.registerQuery("Result = foreach A generate $0 as id;");
            Iterator<Tuple> result = pigServer.openIterator("Result "); 
            while (result.hasNext()) { 
                   Tuple t = result.next(); 
                   System.out.println(t); 
                } 
    //        pigServer.store("B", "output");
            
        }
    }

    –end–

    本文已經(jīng)同步到新浪微博,點(diǎn)擊這里訪問“J2EE企業(yè)應(yīng)用 顧問/咨詢- H.E.'s Blog”的官方微博。
    豆瓣讀書  向你推薦有關(guān) Hadoop、 Hive、 MapReduce、 NoSQL、 Pig、 云計(jì)算、 架構(gòu)設(shè)計(jì)、 類別的圖書。
    posted @ 2011-01-21 19:28 ivaneeo 閱讀(2083) | 評(píng)論 (0)編輯 收藏

    http://code.google.com/p/nutla/ 

    1、概述
     不管程序性能有多高,機(jī)器處理能力有多強(qiáng),都會(huì)有其極限。能夠快速方便的橫向與縱向擴(kuò)展是Nut設(shè)計(jì)最重要的原則。
     Nut是一個(gè)Lucene+Hadoop分布式搜索框架,能對(duì)千G以上索引提供7*24小時(shí)搜索服務(wù)。在服務(wù)器資源足夠的情況下能達(dá)到每秒處理100萬次的搜索請(qǐng)求。
     Nut開發(fā)環(huán)境:jdk1.6.0.21+lucene3.0.2+eclipse3.6.1+hadoop0.20.2+zookeeper3.3.1+hbase0.20.6+memcached+linux

    2、特新
     a、熱插拔
     b、可擴(kuò)展
     c、高負(fù)載
     d、易使用,與現(xiàn)有項(xiàng)目無縫集成
    e、支持排序
    f、7*24服務(wù)
    g、失敗轉(zhuǎn)移

    3、搜索流程
    Nut由Index、Search、Client、Cache和DB五部分構(gòu)成。(Cache默認(rèn)使用memcached,DB默認(rèn)使用hbase)
    Client處理用戶請(qǐng)求和對(duì)搜索結(jié)果排序。Search對(duì)請(qǐng)求進(jìn)行搜索,Search上只放索引,數(shù)據(jù)存儲(chǔ)在DB中,Nut將索引和存儲(chǔ)分離。Cache緩存的是搜索條件和結(jié)果文檔id。DB存儲(chǔ)著數(shù)據(jù),Client根據(jù)搜索排序結(jié)果,取出當(dāng)前頁中的文檔id從DB上讀取數(shù)據(jù)。

    用戶發(fā)起搜索請(qǐng)求給由Nut Client構(gòu)成的集群,由某個(gè)Nut Client根據(jù)搜索條件查詢Cache服務(wù)器是否有該緩存,如果有緩存根據(jù)緩存的文檔id直接從DB讀取數(shù)據(jù),如果沒有緩存將隨機(jī)選擇一組搜索服務(wù)器組(Search Group i),將查詢條件同時(shí)發(fā)給該組搜索服務(wù)器組里的n臺(tái)搜索服務(wù)器,搜索服務(wù)器將搜索結(jié)果返回給Nut Client由其排序,取出當(dāng)前頁文檔id,將搜索條件和當(dāng)前文檔id緩存,同時(shí)從DB讀取數(shù)據(jù)。


    4、索引流程
    Hadoop Mapper/Reducer 建立索引。再將索引從HDFS分發(fā)到各個(gè)索引服務(wù)器。
    對(duì)索引的更新分為兩種:刪除和添加(更新分解為刪除和添加)。
    a、刪除
    在HDFS上刪除索引,將生成的*.del文件分發(fā)到所有的索引服務(wù)器上去或者對(duì)HDFS索引目錄刪除索引再分發(fā)到對(duì)應(yīng)的索引服務(wù)器上去。
    b、添加
    新添加的數(shù)據(jù)用另一臺(tái)服務(wù)器來生成。
    刪除和添加步驟可按不同定時(shí)策略來實(shí)現(xiàn)。

    5、Zookeeper服務(wù)器狀態(tài)管理策略

    在架構(gòu)設(shè)計(jì)上通過使用多組搜索服務(wù)器可以支持每秒處理100萬個(gè)搜索請(qǐng)求。
    每組搜索服務(wù)器能處理的搜索請(qǐng)求數(shù)在1萬—1萬5千之間。如果使用100組搜索服務(wù)器,理論上每秒可處理100萬個(gè)搜索請(qǐng)求。


    假如每組搜索服務(wù)器有100份索引放在100臺(tái)正在運(yùn)行中搜索服務(wù)器(run)上,那么將索引按照如下的方式放在備用中搜索服務(wù)器(bak)上:index 1,index 2,index 3,index 4,index 5,index 6,index 7,index 8,index 9,index 10放在B 1 上,index 6,index 7,index 8,index 9,index 10,index 11,index 12,index 13,index 14,index 15放在B 2上。。。。。。index 96,index 97,index 98,index 99,index 100,index 5,index 4,index 3,index 2,index 1放在最后一臺(tái)備用搜索服務(wù)器上。那么每份索引會(huì)存在3臺(tái)機(jī)器中(1份正在運(yùn)行中,2份備份中)。
    盡管這樣設(shè)計(jì)每份索引會(huì)存在3臺(tái)機(jī)器中,仍然不是絕對(duì)安全的。假如運(yùn)行中的index 1,index 2,index 3同時(shí)宕機(jī)的話,那么就會(huì)有一份索引搜索服務(wù)無法正確啟用。這樣設(shè)計(jì),作者認(rèn)為是在安全性和機(jī)器資源兩者之間一個(gè)比較適合的方案。

    備用中的搜索服務(wù)器會(huì)定時(shí)檢查運(yùn)行中搜索服務(wù)器的狀態(tài)。一旦發(fā)現(xiàn)與自己索引對(duì)應(yīng)的服務(wù)器宕機(jī)就會(huì)向lock申請(qǐng)分布式鎖,得到分布式鎖的服務(wù)器就將自己加入到運(yùn)行中搜索服務(wù)器組,同時(shí)從備用搜索服務(wù)器組中刪除自己,并停止運(yùn)行中搜索服務(wù)器檢查服務(wù)。

    為能夠更快速的得到搜索結(jié)果,設(shè)計(jì)上將搜索服務(wù)器分優(yōu)先等級(jí)。通常是將最新的數(shù)據(jù)放在一臺(tái)或幾臺(tái)內(nèi)存搜索服務(wù)器上。通常情況下前幾頁數(shù)據(jù)能在這幾臺(tái)搜索服務(wù)器里搜索到。如果在這幾臺(tái)搜索服務(wù)器上沒有數(shù)據(jù)時(shí)再向其他舊數(shù)據(jù)搜索服務(wù)器上搜索。
    優(yōu)先搜索等級(jí)的邏輯是這樣的:9最大為搜索全部服務(wù)器并且9不能作為level標(biāo)識(shí)。當(dāng)搜索等級(jí)level為1,搜索優(yōu)先級(jí)為1的服務(wù)器,當(dāng)level為2時(shí)搜索優(yōu)先級(jí)為1和2的服務(wù)器,依此類推。

    posted @ 2011-01-21 19:06 ivaneeo 閱讀(254) | 評(píng)論 (0)編輯 收藏

    HBase – Hadoop Database,是一個(gè)高可靠性、高性能、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng),利用HBase技術(shù)可在廉價(jià)PC Server上搭建起大規(guī)模結(jié)構(gòu)化存儲(chǔ)集群。

    HBase是Google Bigtable的開源實(shí)現(xiàn),類似Google Bigtable利用GFS作為其文件存儲(chǔ)系統(tǒng),HBase利用Hadoop HDFS作為其文件存儲(chǔ)系統(tǒng);Google運(yùn)行MapReduce來處理Bigtable中的海量數(shù)據(jù),HBase同樣利用Hadoop MapReduce來處理HBase中的海量數(shù)據(jù);Google Bigtable利用 Chubby作為協(xié)同服務(wù),HBase利用Zookeeper作為對(duì)應(yīng)。

    上圖描述了Hadoop EcoSystem中的各層系統(tǒng),其中HBase位于結(jié)構(gòu)化存儲(chǔ)層,Hadoop HDFS為HBase提供了高可靠性的底層存儲(chǔ)支持,Hadoop MapReduce為HBase提供了高性能的計(jì)算能力,Zookeeper為HBase提供了穩(wěn)定服務(wù)和failover機(jī)制。

    此外,Pig和Hive還為HBase提供了高層語言支持,使得在HBase上進(jìn)行數(shù)據(jù)統(tǒng)計(jì)處理變的非常簡(jiǎn)單。 Sqoop則為HBase提供了方便的RDBMS數(shù)據(jù)導(dǎo)入功能,使得傳統(tǒng)數(shù)據(jù)庫數(shù)據(jù)向HBase中遷移變的非常方便。

    HBase訪問接口

    1.       Native Java API,最常規(guī)和高效的訪問方式,適合Hadoop MapReduce Job并行批處理HBase表數(shù)據(jù)

    2.       HBase Shell,HBase的命令行工具,最簡(jiǎn)單的接口,適合HBase管理使用

    3.       Thrift Gateway,利用Thrift序列化技術(shù),支持C++,PHP,Python等多種語言,適合其他異構(gòu)系統(tǒng)在線訪問HBase表數(shù)據(jù)

    4.       REST Gateway,支持REST 風(fēng)格的Http API訪問HBase, 解除了語言限制

    5.       Pig,可以使用Pig Latin流式編程語言來操作HBase中的數(shù)據(jù),和Hive類似,本質(zhì)最終也是編譯成MapReduce Job來處理HBase表數(shù)據(jù),適合做數(shù)據(jù)統(tǒng)計(jì)

    6.       Hive,當(dāng)前Hive的Release版本尚沒有加入對(duì)HBase的支持,但在下一個(gè)版本Hive 0.7.0中將會(huì)支持HBase,可以使用類似SQL語言來訪問HBase

    HBase數(shù)據(jù)模型

    Table & Column Family

    Row Key Timestamp Column Family
    URI Parser
    r1 t3 url=http://www.taobao.com title=天天特價(jià)
    t2 host=taobao.com
    t1
    r2 t5 url=http://www.alibaba.com content=每天…
    t4 host=alibaba.com

    Ø  Row Key: 行鍵,Table的主鍵,Table中的記錄按照Row Key排序

    Ø  Timestamp: 時(shí)間戳,每次數(shù)據(jù)操作對(duì)應(yīng)的時(shí)間戳,可以看作是數(shù)據(jù)的version number

    Ø  Column Family:列簇,Table在水平方向有一個(gè)或者多個(gè)Column Family組成,一個(gè)Column Family中可以由任意多個(gè)Column組成,即Column Family支持動(dòng)態(tài)擴(kuò)展,無需預(yù)先定義Column的數(shù)量以及類型,所有Column均以二進(jìn)制格式存儲(chǔ),用戶需要自行進(jìn)行類型轉(zhuǎn)換。

    Table & Region

    當(dāng)Table隨著記錄數(shù)不斷增加而變大后,會(huì)逐漸分裂成多份splits,成為regions,一個(gè)region由[startkey,endkey)表示,不同的region會(huì)被Master分配給相應(yīng)的RegionServer進(jìn)行管理:

    -ROOT- && .META. Table

    HBase中有兩張?zhí)厥獾腡able,-ROOT-和.META.

    Ø  .META.:記錄了用戶表的Region信息,.META.可以有多個(gè)regoin

    Ø  -ROOT-:記錄了.META.表的Region信息,-ROOT-只有一個(gè)region

    Ø  Zookeeper中記錄了-ROOT-表的location

    Client訪問用戶數(shù)據(jù)之前需要首先訪問zookeeper,然后訪問-ROOT-表,接著訪問.META.表,最后才能找到用戶數(shù)據(jù)的位置去訪問,中間需要多次網(wǎng)絡(luò)操作,不過client端會(huì)做cache緩存。

    MapReduce on HBase

    在HBase系統(tǒng)上運(yùn)行批處理運(yùn)算,最方便和實(shí)用的模型依然是MapReduce,如下圖:

    HBase Table和Region的關(guān)系,比較類似HDFS File和Block的關(guān)系,HBase提供了配套的TableInputFormat和TableOutputFormat API,可以方便的將HBase Table作為Hadoop MapReduce的Source和Sink,對(duì)于MapReduce Job應(yīng)用開發(fā)人員來說,基本不需要關(guān)注HBase系統(tǒng)自身的細(xì)節(jié)。

    HBase系統(tǒng)架構(gòu)

    Client

    HBase Client使用HBase的RPC機(jī)制與HMaster和HRegionServer進(jìn)行通信,對(duì)于管理類操作,Client與HMaster進(jìn)行RPC;對(duì)于數(shù)據(jù)讀寫類操作,Client與HRegionServer進(jìn)行RPC

    Zookeeper

    Zookeeper Quorum中除了存儲(chǔ)了-ROOT-表的地址和HMaster的地址,HRegionServer也會(huì)把自己以Ephemeral方式注冊(cè)到Zookeeper中,使得HMaster可以隨時(shí)感知到各個(gè)HRegionServer的健康狀態(tài)。此外,Zookeeper也避免了HMaster的單點(diǎn)問題,見下文描述

    HMaster

    HMaster沒有單點(diǎn)問題,HBase中可以啟動(dòng)多個(gè)HMaster,通過Zookeeper的Master Election機(jī)制保證總有一個(gè)Master運(yùn)行,HMaster在功能上主要負(fù)責(zé)Table和Region的管理工作:

    1.       管理用戶對(duì)Table的增、刪、改、查操作

    2.       管理HRegionServer的負(fù)載均衡,調(diào)整Region分布

    3.       在Region Split后,負(fù)責(zé)新Region的分配

    4.       在HRegionServer停機(jī)后,負(fù)責(zé)失效HRegionServer 上的Regions遷移

    HRegionServer

    HRegionServer主要負(fù)責(zé)響應(yīng)用戶I/O請(qǐng)求,向HDFS文件系統(tǒng)中讀寫數(shù)據(jù),是HBase中最核心的模塊。

    HRegionServer內(nèi)部管理了一系列HRegion對(duì)象,每個(gè)HRegion對(duì)應(yīng)了Table中的一個(gè)Region,HRegion中由多個(gè)HStore組成。每個(gè)HStore對(duì)應(yīng)了Table中的一個(gè)Column Family的存儲(chǔ),可以看出每個(gè)Column Family其實(shí)就是一個(gè)集中的存儲(chǔ)單元,因此最好將具備共同IO特性的column放在一個(gè)Column Family中,這樣最高效。

    HStore存儲(chǔ)是HBase存儲(chǔ)的核心了,其中由兩部分組成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用戶寫入的數(shù)據(jù)首先會(huì)放入MemStore,當(dāng)MemStore滿了以后會(huì)Flush成一個(gè)StoreFile(底層實(shí)現(xiàn)是HFile),當(dāng)StoreFile文件數(shù)量增長(zhǎng)到一定閾值,會(huì)觸發(fā)Compact合并操作,將多個(gè)StoreFiles合并成一個(gè)StoreFile,合并過程中會(huì)進(jìn)行版本合并和數(shù)據(jù)刪除,因此可以看出HBase其實(shí)只有增加數(shù)據(jù),所有的更新和刪除操作都是在后續(xù)的compact過程中進(jìn)行的,這使得用戶的寫操作只要進(jìn)入內(nèi)存中就可以立即返回,保證了HBase I/O的高性能。當(dāng)StoreFiles Compact后,會(huì)逐步形成越來越大的StoreFile,當(dāng)單個(gè)StoreFile大小超過一定閾值后,會(huì)觸發(fā)Split操作,同時(shí)把當(dāng)前Region Split成2個(gè)Region,父Region會(huì)下線,新Split出的2個(gè)孩子Region會(huì)被HMaster分配到相應(yīng)的HRegionServer上,使得原先1個(gè)Region的壓力得以分流到2個(gè)Region上。下圖描述了Compaction和Split的過程:

    在理解了上述HStore的基本原理后,還必須了解一下HLog的功能,因?yàn)樯鲜龅腍Store在系統(tǒng)正常工作的前提下是沒有問題的,但是在分布式系統(tǒng)環(huán)境中,無法避免系統(tǒng)出錯(cuò)或者宕機(jī),因此一旦HRegionServer意外退出,MemStore中的內(nèi)存數(shù)據(jù)將會(huì)丟失,這就需要引入HLog了。每個(gè)HRegionServer中都有一個(gè)HLog對(duì)象,HLog是一個(gè)實(shí)現(xiàn)Write Ahead Log的類,在每次用戶操作寫入MemStore的同時(shí),也會(huì)寫一份數(shù)據(jù)到HLog文件中(HLog文件格式見后續(xù)),HLog文件定期會(huì)滾動(dòng)出新的,并刪除舊的文件(已持久化到StoreFile中的數(shù)據(jù))。當(dāng)HRegionServer意外終止后,HMaster會(huì)通過Zookeeper感知到,HMaster首先會(huì)處理遺留的 HLog文件,將其中不同Region的Log數(shù)據(jù)進(jìn)行拆分,分別放到相應(yīng)region的目錄下,然后再將失效的region重新分配,領(lǐng)取 到這些region的HRegionServer在Load Region的過程中,會(huì)發(fā)現(xiàn)有歷史HLog需要處理,因此會(huì)Replay HLog中的數(shù)據(jù)到MemStore中,然后flush到StoreFiles,完成數(shù)據(jù)恢復(fù)。

    HBase存儲(chǔ)格式

    HBase中的所有數(shù)據(jù)文件都存儲(chǔ)在Hadoop HDFS文件系統(tǒng)上,主要包括上述提出的兩種文件類型:

    1.       HFile, HBase中KeyValue數(shù)據(jù)的存儲(chǔ)格式,HFile是Hadoop的二進(jìn)制格式文件,實(shí)際上StoreFile就是對(duì)HFile做了輕量級(jí)包裝,即StoreFile底層就是HFile

    2.       HLog File,HBase中WAL(Write Ahead Log) 的存儲(chǔ)格式,物理上是Hadoop的Sequence File

    HFile

    下圖是HFile的存儲(chǔ)格式:

    首先HFile文件是不定長(zhǎng)的,長(zhǎng)度固定的只有其中的兩塊:Trailer和FileInfo。正如圖中所示的,Trailer中有指針指向其他數(shù)據(jù)塊的起始點(diǎn)。File Info中記錄了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index塊記錄了每個(gè)Data塊和Meta塊的起始點(diǎn)。

    Data Block是HBase I/O的基本單元,為了提高效率,HRegionServer中有基于LRU的Block Cache機(jī)制。每個(gè)Data塊的大小可以在創(chuàng)建一個(gè)Table的時(shí)候通過參數(shù)指定,大號(hào)的Block有利于順序Scan,小號(hào)Block利于隨機(jī)查詢。每個(gè)Data塊除了開頭的Magic以外就是一個(gè)個(gè)KeyValue對(duì)拼接而成, Magic內(nèi)容就是一些隨機(jī)數(shù)字,目的是防止數(shù)據(jù)損壞。后面會(huì)詳細(xì)介紹每個(gè)KeyValue對(duì)的內(nèi)部構(gòu)造。

    HFile里面的每個(gè)KeyValue對(duì)就是一個(gè)簡(jiǎn)單的byte數(shù)組。但是這個(gè)byte數(shù)組里面包含了很多項(xiàng),并且有固定的結(jié)構(gòu)。我們來看看里面的具體結(jié)構(gòu):

    開始是兩個(gè)固定長(zhǎng)度的數(shù)值,分別表示Key的長(zhǎng)度和Value的長(zhǎng)度。緊接著是Key,開始是固定長(zhǎng)度的數(shù)值,表示RowKey的長(zhǎng)度,緊接著是RowKey,然后是固定長(zhǎng)度的數(shù)值,表示Family的長(zhǎng)度,然后是Family,接著是Qualifier,然后是兩個(gè)固定長(zhǎng)度的數(shù)值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有這么復(fù)雜的結(jié)構(gòu),就是純粹的二進(jìn)制數(shù)據(jù)了。

    HLogFile

    上圖中示意了HLog文件的結(jié)構(gòu),其實(shí)HLog文件就是一個(gè)普通的Hadoop Sequence File,Sequence File 的Key是HLogKey對(duì)象,HLogKey中記錄了寫入數(shù)據(jù)的歸屬信息,除了table和region名字外,同時(shí)還包括 sequence number和timestamp,timestamp是“寫入時(shí)間”,sequence number的起始值為0,或者是最近一次存入文件系統(tǒng)中sequence number。

    HLog Sequece File的Value是HBase的KeyValue對(duì)象,即對(duì)應(yīng)HFile中的KeyValue,可參見上文描述。

    結(jié)束

    本文對(duì)HBase技術(shù)在功能和設(shè)計(jì)上進(jìn)行了大致的介紹,由于篇幅有限,本文沒有過多深入地描述HBase的一些細(xì)節(jié)技術(shù)。目前一淘的存儲(chǔ)系統(tǒng)就是基于HBase技術(shù)搭建的,后續(xù)將介紹“一淘分布式存儲(chǔ)系統(tǒng)”,通過實(shí)際案例來更多的介紹HBase應(yīng)用。

    posted @ 2011-01-21 19:04 ivaneeo 閱讀(929) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共67頁: First 上一頁 15 16 17 18 19 20 21 22 23 下一頁 Last 
    主站蜘蛛池模板: 久久精品无码专区免费东京热| 亚洲欧洲日韩国产综合在线二区| 黄色a级免费网站| 两个人看的www免费| 毛片免费在线观看网站| 亚洲人成7777影视在线观看| 久久99精品免费一区二区| 国产精品久久久久久久久久免费 | 久久免费福利视频| 亚洲AV无码专区亚洲AV伊甸园| 亚洲AV成人一区二区三区观看| 蜜桃AV无码免费看永久| 国内精品99亚洲免费高清| 亚洲国产精品网站在线播放| 99久在线国内在线播放免费观看| 亚洲国产成人久久综合一 | 在线视频精品免费| 亚洲va久久久噜噜噜久久狠狠| 国产免费一区二区三区不卡| 日本成人在线免费观看| 亚洲精品伦理熟女国产一区二区| 欧洲美熟女乱又伦免费视频| 自怕偷自怕亚洲精品| 中文字幕免费在线看| 亚洲AV永久无码区成人网站 | 国产精品免费精品自在线观看| 亚洲一区二区三区精品视频| 午夜精品免费在线观看| 亚洲人成影院在线无码按摩店| 国产免费阿v精品视频网址| 亚洲午夜精品久久久久久人妖| 亚洲免费观看网站| 亚洲人成色777777老人头| 免费a级毛片网站| 在线观看亚洲AV日韩A∨| 国产精品视_精品国产免费 | 亚洲天然素人无码专区| 免费人成无码大片在线观看| 国产在线观a免费观看| 亚洲欧洲日产v特级毛片| 暖暖免费高清日本中文|