• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 15, comments - 10, trackbacks - 0, articles - 0

            2015年4月27日

            附上URL:http://book.douban.com/subject/10786473/

            1,鍛煉意志力的方法
            A,每天冥想5分鐘
            B,鍛煉
            對于鍛煉有兩個常見問題,第一個是“需要鍛煉多久”,第二個是“什么鍛煉最有效”,這兩個問題的答案是“你想鍛煉多久”,“你真的會去做什么樣的鍛煉”
            C,睡眠
            睡足覺能顯著提高自控力,因為睡眠不足會導(dǎo)致大腦缺乏足夠的能量進行自控。
            如何改掉晚睡的壞習(xí)慣?
            真正的問題并不是強迫自己去睡覺,而是強迫自己在一定時間之后就遠離那些讓自己無法睡覺的事情。
            2,意志力的規(guī)律
            A,每天的意志力變化規(guī)律:早上的意志力最強,隨著時間的推移而逐漸減弱。
            方案:需要將最重要的事情放在早上處理
            B,很多想不到的事情都是在消耗你的意志力:很多你認為不需要意志力的事情其實都在消耗你的意志,比如試圖融入一家價值觀和你不符合的公司,在糟糕的路況中上班,干坐著熬過無聊的會議等等。
            方案:盡量避免這些事情的發(fā)生
            C,壓力和情緒低落會導(dǎo)致意志力渙散:由于大腦的調(diào)節(jié)功能,如果一個人感覺到壓力和情緒低落,大腦會指引著你去做它認為能給你帶來快樂的事情,這樣會造成一個矛盾:有很多工作要完成的人,往往會選擇去玩游戲來排解壓力;需要控制支出的人會去大肆購物來排解壓力,這樣就造成了一個惡性循環(huán)。
            方案:
            嘗試有效的解壓方法:鍛煉,閱讀,聽音樂,和家人相處,按摩,散步,冥想,培養(yǎng)有創(chuàng)意的愛好;
            放棄無效的解壓方法:賭博,購物,抽煙,喝酒,暴飲暴食,玩游戲,上網(wǎng),花兩個小時以上看電影或者電視。
            有效和無效的區(qū)別是?真正能緩解壓力的不是釋放多巴胺,而是增加大腦中改善情緒的化學(xué)物質(zhì),比如血清素/Y-氨基丁酸/催產(chǎn)素等等,這樣才是治本的。
            D,不能自我諒解導(dǎo)致的自控力惡性循環(huán):一次自控失敗往往會導(dǎo)致整個自控計劃的失敗,是第一次放棄后產(chǎn)生的羞恥感,罪惡感,失控感和絕望感,會讓人破罐子破摔。
            方案:尋求自我諒解,只要是凡人都會有失去自控力的時候,挫折本身并不可怕,可怕的是自暴自棄。
            3,意志力的誤區(qū)
            A,不要把支持目標實現(xiàn)的行為誤認為是目標本身:比如在健身之后,有時會獎賞自己一瓶碳酸飲料,或者去吃燒烤,其實最終攝入的能量還要大于健身消耗的能量。
            方案:要弄清楚自己的目標,不要將目標和過程弄混了。
            B,誤將渴望當做幸福:由于多巴胺分泌的因素,我們往往將某些快感當做了真正的幸福,比如吃垃圾食品,無節(jié)制的游戲等等。
            方案:我們需要區(qū)分讓我們的生活真正有意義的真實獎勵(有長久意義的,對生活有益的),和讓我們分散精力,上癮的虛假獎勵(短暫無用的,僅僅是刺激多巴胺分泌的)。
            C,經(jīng)常制定自控力計劃而不施行:很多人會重復(fù)的制定計劃,而不去執(zhí)行計劃,因為制定一個計劃很容易,而且會讓我們心情大好,但是如果真的付諸實踐,帶給我們的快感遠遠小于制定計劃的快感。
            方案:需要避免一個意志力陷阱:即用“改變的承諾”而不是“改變”來改善我們的心情
            D,人類往往放棄未來更大的回報,而選擇即刻的滿足感:即刻獎勵會激活更原始的獎勵系統(tǒng),即刺激多巴胺的分泌,而未來獎勵是刺激人類最近才進化出來的前額皮質(zhì)系統(tǒng)。人類在面臨當前獎勵和未來獎勵的時候,兩個獎勵系統(tǒng)會進行斗爭。
            方案:等待10分鐘,因為這10分鐘會降低即刻滿足的快感,讓大腦更理智的思考。如果10分鐘之后依然想要,則可以選擇即刻滿足。

            posted @ 2015-04-27 15:34 whspecial 閱讀(18008) | 評論 (1)編輯 收藏

            2014年3月11日

            轉(zhuǎn)載自:http://www.blogjava.net/itspy/archive/2008/04/22/194686.html#Post

            log4j本來設(shè)置了要打印行號與文件名的,結(jié)果有的能打印出來,有的卻是亂碼,查了些文檔之后才發(fā)現(xiàn),原來打印問題是因為編繹時沒有編繹進去調(diào)試信息,所以沒辦法打印.
            但是我用的是Ant,如果在Ant編繹時,編繹進去調(diào)試信息呢,參考下面配置.
            <javac srcdir="src" destdir="bin" debug="true"  classpathref="accrual.path" >

            參考文檔
            http://ant.apache.org/manual/CoreTasks/javac.html
            Log4j配置
            log4j.appender.C1.layout.ConversionPattern=%F(%L)-- %-4r %-5p [%t] %37c %3x - %m%n

            posted @ 2014-03-11 15:57 whspecial 閱讀(562) | 評論 (0)編輯 收藏

            2014年1月3日

                 摘要: 將排序二叉樹轉(zhuǎn)化成雙向鏈表,應(yīng)該是一道很常見的面試題目,網(wǎng)上的實現(xiàn)比較多,有用遞歸也有用中序遍歷法的。看到一位外國友人的實現(xiàn),還是比較清晰的,思路如下: 1,如果左子樹不為null,處理左子樹    1.a)遞歸轉(zhuǎn)化左子樹為雙向鏈表;    1.b)找出根結(jié)點的前驅(qū)節(jié)點(是左子樹的最右的節(jié)點)    1.c)將上一步找出的節(jié)點和根...  閱讀全文

            posted @ 2014-01-03 00:41 whspecial 閱讀(3613) | 評論 (0)編輯 收藏

            2013年10月31日

               這一段在看《unix網(wǎng)絡(luò)編程》,回顧之前做項目用到的一些東西,在這里總結(jié)一下:

               (1)TCP套接口編程
               這里介紹各個接口函數(shù):
               1 文件描述符
               -socket(int domain, int type, int protocol); //生成文件描述符
               -bind(int sockfd, struct sockaddr *my_addr, int addrlen); //將本地的一個端口綁定到fd上,一般只需要在server端
               2 服務(wù)端
               -listen(int sockfd, int backlog); //有兩個作用:1,將主動套接口變?yōu)楸粍犹捉涌?2,設(shè)置最大連接數(shù)backlog
               -accept(int sockfd, void *addr, int *addrlen); //為建立好的連接生成一個新的fd
               3 客戶端
               -connect(int sockfd, struct sockaddr *serv_addr, int addrlen); //進行socket連接
               4 通信
               -send(int sockfd, const void *msg, int len, unsigned int flags); //發(fā)送請求
               -recv(int sockfd, void *buf, int len, unsigned int flags); //接收請求



               (2)I/O多路復(fù)用
               I/O多路復(fù)用是指內(nèi)核一旦發(fā)現(xiàn)進程指定的一個或者多個IO條件準備讀取,它就通知該進程。按照《UNIX網(wǎng)絡(luò)編程》的說法,I/O多路復(fù)用用于以下三種情況:
               a)一個TCP服務(wù)器既要處理監(jiān)聽套接口,又要處理已連接套接口;
               b)一個服務(wù)器既要處理TCP,又要處理UDP;
               c)當客戶端處理多個描述字(比如處理交互式輸入和網(wǎng)絡(luò)套接口)
               目前被廣泛使用的是select和epoll:
               2.1,select
               int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)
               第一個參數(shù)指定最大的fd數(shù)目,中間三個分別是被監(jiān)控的讀、寫、異常的fd集,最后一個是超時時間。select函數(shù)會阻塞等待,直到監(jiān)控的fd集中有fd就緒,或者已經(jīng)超時。
               2.2,epoll
               epoll相比于select,主要的好處在于它不像select一樣去輪詢fd集,而是由內(nèi)核去觸發(fā);另外它支持更大的fd個數(shù)

               (3)網(wǎng)絡(luò)服務(wù)器模型
               其實網(wǎng)絡(luò)服務(wù)器模型還是比較復(fù)雜的,有一篇比較經(jīng)典的文章叫做c10K problem,鏈接如下:http://www.kegel.com/c10k.html
               這里記錄的是很簡單的幾種多線程TCP服務(wù)器模型,順便可以比較下:
               2.1 主線程accept,為每個client創(chuàng)建一個線程
               2.2 使用線程池,全部accept,當有連接來的時候其中某個線程進行處理
               2.3 使用線程池,主線程accept,當有連接來的時候主線程將其放入隊列,由工作線程進行處理(生產(chǎn)者-消費者模型)
               1方案過于頻繁地進行線程創(chuàng)建銷毀,2方案在一個連接過來時會帶來驚群現(xiàn)象,3方案會比前兩個方案要好一些。

            posted @ 2013-10-31 00:32 whspecial 閱讀(2728) | 評論 (1)編輯 收藏

            2013年10月27日

            這是來自于阿里技術(shù)嘉年華的一個分享,因為在百度也考慮過類似的事情,所以聽得比較有感悟,這里把相關(guān)內(nèi)容整理一下。

            首先尊重版權(quán),還是把原鏈接和作者貼上:

            http://adc.alibabatech.org/carnival/history/schedule/2013/detail/main/286?video=0

            來自于阿里吳威工程師的分享

             

            首先需要說明一點,跨機房hadoop可能應(yīng)用場景并不是很多,國內(nèi)像BAT這種巨頭也許需要,但是大部分的中小公司也許并不需要這個,也許這是個屠龍之技,呵呵。

            把這個問題分三段來講,第一段是問題出現(xiàn)的背景,第二段是解決該問題的難點,第三段是最終的解決方案。

            (一) 背景:

            先要看下為什么需要做一個跨機房的大集群?

            大集群的優(yōu)點在于數(shù)據(jù)管理和授權(quán)容易(這個問題在一個多部門的大公司還是很重要的);跨部門的使用數(shù)據(jù)容易,無需重復(fù)拉取數(shù)據(jù)。

            在集群達到一定規(guī)模時,單機房(機房內(nèi)的容量是有限的)已經(jīng)無法滿足集群的需求了,要想一勞永逸的解決問題,需要建設(shè)一個跨機房的hadoop集群。

            (二)技術(shù)挑戰(zhàn):

            2.1 NameNode的性能問題:

                     在管理一個巨大的hadoop集群時,由于原始的Namenode是單節(jié)點,因此會成為一個性能瓶頸,遇到的性能問題主要包括兩方面:存儲容量問題(存儲元數(shù)據(jù))和計算壓力(處理rpc請求,修改內(nèi)存樹時候需要全局鎖)問題。

                     其中存儲容量問題可以依賴內(nèi)存的垂直擴展來解決,但是計算壓力卻很難通過提升硬件來解決(因為目前廠商的主要發(fā)展方向是多核,而非提高主頻)

            2.2機房之間的網(wǎng)絡(luò)限制:

                     機房之間的網(wǎng)絡(luò)永遠是個硬件條件的限制,跨機房的網(wǎng)絡(luò)傳輸帶來了數(shù)據(jù)延時和帶寬限制:

            1, 延時一般是在10ms之內(nèi),而hadoop上大部分運行的是離線作業(yè),基本可接受

            2, 帶寬限制的問題比較大,因為單機房內(nèi)的點對點帶寬一般是在1Gbps,而機房之間的帶寬確在20Mbps左右,非常有限。

            2.3資源組之間的管理

                     每個部門可以看做一個資源組,它們可能會互相使用對方的數(shù)據(jù),因此如何規(guī)劃計算和存儲的位置就很重要,否則會在多個機房之間出現(xiàn)大量的數(shù)據(jù)拷貝。

            (三)解決方案:

            先看下整個跨集群hadoop的架構(gòu)圖:


             

            重點介紹里面三點,也就是和上面三個問題相對應(yīng)的:

            1, 可以看到這里畫出了兩個NNnamenode),它們實際上還是屬于一個hadoop集群,這是業(yè)界里的一個解決方案:HDFS Fedaration,它為了解決元數(shù)據(jù)節(jié)點性能問題;

            2, 可以看到這里有一個cross node節(jié)點,它是用來在兩個機房之間同步數(shù)據(jù)的,它的設(shè)計考慮到了機房間的網(wǎng)絡(luò)限制;

            3, 最后是groupAgroupB,這是為了解決數(shù)據(jù)產(chǎn)出方和使用方關(guān)系來用的。

            3.1 Federation

            Federation相關(guān)資料見:

            http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Federation.html#HDFS_Federation


            為了水平擴展Namenodefederation使用了多個互相獨立的namenode。它們之間互相不需要通信,每個datenode需要向全部namenode注冊并發(fā)送信息。

            BlockPool是屬于一個namenodeblock集合,每個blockpool之間也是互相獨立的。

                     federation里,有一個需要關(guān)注的問題,就是多個namenode的地址如何對用戶進行透明?它采用的解決方案是目錄樹掛載的方案(社區(qū)有個viewFS,應(yīng)該就是為了解決這個問題):熟悉linux或者nfs的朋友應(yīng)該都知道mount這個概念,目錄樹掛載就是這個意思。

            不過使用目錄樹掛載也存在著一個問題,就是各個子目錄下的存儲資源需要人為的介入管理,不能出現(xiàn)嚴重的不均。

            3.2 crossNode

                     機房間的網(wǎng)絡(luò)限制要求不能出現(xiàn)大規(guī)模、長時間的數(shù)據(jù)拷貝,需要一個專門管理機房間數(shù)據(jù)拷貝的進程,叫做crossNode。它是獨立部署的一個節(jié)點,和元數(shù)據(jù)節(jié)點是分離的。

                     它能提供的功能概括來說主要包括以下三點:

            a) 根據(jù)預(yù)置的跨機房文件,進行數(shù)據(jù)拷貝

            b) 處理實時的數(shù)據(jù)拷貝請求

            c) 進行跨機房的數(shù)據(jù)流量控制

            如何得知跨機房文件列表?

                     由于離線任務(wù)基本都是定時觸發(fā)的,可以根據(jù)對歷史作業(yè)的分析來形成一個跨機房文件列表

            3.3   資源組之間的管理

            各個資源組之間存在數(shù)據(jù)的依賴,我們希望通過資源組管理,能實現(xiàn)大部分任務(wù)在本機房內(nèi)產(chǎn)出數(shù)據(jù),只有少量跨機房產(chǎn)出數(shù)據(jù);大部分任務(wù)讀取本機房的數(shù)據(jù)副本,只有少量跨機房讀取數(shù)據(jù)。

            為了標識資源組之間的數(shù)據(jù)依賴性,定義一個資源組之間的距離概念:一個資源組訪問另一個資源組的數(shù)據(jù)量越多,則兩者的距離越近,應(yīng)該將距離接近的資源組放在同一個機房內(nèi)。

            為了讓計算和產(chǎn)出盡可能地靠近,使用一個MRProxy,對于不同類型的任務(wù)做不同處理:

            a)            離線計算:跨機房列表中的數(shù)據(jù)正在傳輸中(DC1->DC2),DC2上的 Job 被暫停調(diào)度,等待傳輸完畢

            b)            Ad-hoc查詢:DC2上的 Job 需要讀DC1上的數(shù)據(jù),Job暫停調(diào)度,通知 CrossNode,數(shù)據(jù)傳輸完畢后繼續(xù)調(diào)度

            c)             特殊情況:跨機房數(shù)據(jù) JoinDC1大表,DC2小表,Job 調(diào)度到DC1上,跨機房直接讀取DC2數(shù)據(jù),無需等待

             

            由于是根據(jù)視頻和ppt整理,并沒有代碼或者文檔,所以可能有些地方的理解有偏差,歡迎來提意見~

            posted @ 2013-10-27 23:28 whspecial 閱讀(5262) | 評論 (0)編輯 收藏

            2013年10月24日

            KFS的元數(shù)據(jù)持久化是依賴checkpoint和operation log結(jié)合來工作的,其中checkpoint顧名思義保存的是某個點內(nèi)存的狀態(tài),operation log記錄的是對元數(shù)據(jù)修改的操作日志。

            使用checkpoint+log的設(shè)計
            (1)    元數(shù)據(jù)信息必須要持久化,否則掉電或者人工重啟之后該信息丟失
            (2)    便于快速重啟,可以從最近的一個cp中快速構(gòu)建內(nèi)存狀態(tài),加上該cp之后的log就可以完整地構(gòu)建內(nèi)存

            讀寫checkpointlog的過程

            Metaserver啟動時的內(nèi)存構(gòu)建:

            Startup.cc調(diào)用rebuild函數(shù)

            (1)       如果之前已經(jīng)有了checkpoint,從checkpoint里重建內(nèi)存樹,否則新建一棵內(nèi)存樹

            (2)       在內(nèi)存中replaycheckpoint之后的所有operation log

            MetaServer運行時寫入新的checkpoint

            logcompactor_main.ccmain函數(shù)調(diào)用,應(yīng)該是以調(diào)用另一個進程的方式來執(zhí)行,猜想是Metaserver進程會定時調(diào)用該進程

            (1)       根據(jù)舊的checkpoint在內(nèi)存中生成狀態(tài)

            (2)       在內(nèi)存中replay之后的op log

            (3)       將此時的內(nèi)存狀態(tài)寫入新的checkpoint

            MetaServer運行時寫入新的log

            logger.cc來寫入新log,看了代碼應(yīng)該是每次修改了元信息的操作,都會將這條op log寫入磁盤,雖然性能不高,但是比較可靠(之前也自己寫過日志庫,使用的是兩個buffer交換寫入,這樣比較高效一些)

            posted @ 2013-10-24 01:03 whspecial 閱讀(1254) | 評論 (0)編輯 收藏

            2013年10月23日

            此處的KFS是指Kosmos distributed file system,代碼位于http://sourceforge.net/projects/kosmosfs/,之后會寫幾篇相關(guān)的文章,以供后來者參考。

            KFS里Meta的內(nèi)存結(jié)構(gòu)主要是一棵B+樹,保存在內(nèi)存里,具體分析如下:

            B-樹,B+樹的定義

            關(guān)于這些樹的定義,最好還是參考算法導(dǎo)論等經(jīng)典書,網(wǎng)路上的信息有些不是很準確,為了方便大家還是貼一個鏈接:

            http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html

            KFS為何選用B+樹而非B樹?

            這是我個人的理解:

            雖然B樹可以在非葉子節(jié)點命中,會縮短一些平均查找長度,但是B+樹在這種應(yīng)用一個優(yōu)勢就是每個節(jié)點都有指向next節(jié)點的指針,對于范圍查詢或者遍歷操作很適合。對于文件系統(tǒng)的一個ls某個子目錄的需求,用B+樹可以較高效的解決。

            KFSB+樹的類圖


            MetaNode
            base class for both internal and leaf nodes

            Metabase class for data objects (leaf nodes)

            Nodean internal node in the KFS search tree

            MetaChunkInfochunk information for a given file offset

            MetaDentry Directory entry, mapping a file name to a file id

            MetaFattrFile or directory attributes

            各節(jié)點的介紹

            1Meta類是子節(jié)點的父類,其最主要的成員變量是fid

            有三個葉子節(jié)點:MetaChunkInfoMetaDentryMetaFattr

            2MetaDentry實現(xiàn)從文件名到fid的映射,對于每個文件(目錄)都擁有1MetaDentry

            成員變量包括:

            dir:文件父目錄的fid

            namedentry的名稱,實際就是文件名

            3MetaFattr實現(xiàn)從fid到文件屬性的映射,對于每個文件(目錄)都擁有一個MetaFattr

            成員變量包括:

            Type:文件還是目錄

            numReplicas:文件有幾份副本

            mtime:修改時間

            ctime:屬性修改時間

            crtime:文件創(chuàng)建時間

            chunkcount:連續(xù)的chunk數(shù)目

            filesize:文件大小

            nextChunkOffset:最后一個chunk在文件的所處的offset

            mode_t mode:文件屬性(rwx位)

            key:由KFS_FATTRfid來構(gòu)成,可以通過fid直接找到保存文件屬性的節(jié)點。

            4MetaChunkInfo標志某個文件對應(yīng)的chunk信息,如果一個文件包含多個chunk,那么需要有多個MetaChunkInfo

            成員變量包括:

            offsetchunk在文件中的偏移量,因為一個文件可能由多個chunk組成

            chunkIdchunkid

            chunkVersionchunkversion

            5Node實現(xiàn)的是B+樹的內(nèi)部節(jié)點,這種節(jié)點僅僅作為索引用途,存儲實際元數(shù)據(jù)信息的節(jié)點位于最底部的葉子節(jié)點。

            成員變量包括:

            NKEY = 32:每個節(jié)點最多擁有的關(guān)鍵字數(shù)目,實際上也就是最多擁有的子節(jié)點數(shù)目,如果多余這個值節(jié)點進行分裂

            NSPLIT = NKEY / 2:分裂之后每個節(jié)點的關(guān)鍵字數(shù)目

            NFEWEST = NKEY - NSPLIT:每個節(jié)點最少擁有的關(guān)鍵字數(shù)目,如果少于這個值兩個節(jié)點進行合并

            count:節(jié)點實際擁有的關(guān)鍵字數(shù)目

            Key childKey[NKEY]:節(jié)點存儲的關(guān)鍵字列表

            MetaNode *childNode[NKEY]:節(jié)點指向子節(jié)點的指針列表

            Node *next:指向下一個同級節(jié)點的指針

            實際上每個內(nèi)部節(jié)點的階數(shù)為32,可以有32個子節(jié)點,而每個葉子節(jié)點只保存一個key值。

            三類子節(jié)點在B+樹中如何分布?

            可以想象,必定是將同一類的節(jié)點聚集在一起。因此對于排序函數(shù)就是先比較節(jié)點類型,然后再對節(jié)點內(nèi)部的成員變量進行比較。MetaDentry是根據(jù)dir(父目錄的id),MetaFattr是根據(jù)fidMetaChunkInfo是根據(jù)idchunkId來排序。

            一個不太相關(guān)的思考

            看上面的三類子節(jié)點,我們可以發(fā)現(xiàn)chunk的位置信息并沒有保存在B+樹里,它是單獨保存在一個Map數(shù)據(jù)結(jié)構(gòu)里的,也不會在meta server里進行持久化,而是每次chunk啟動時向meta server來報告。之所以不做持久化,可以這樣來理解:

            只有Chunk服務(wù)器才能最終確定一個Chunk是否在它的硬盤上。Chunk服務(wù)器的錯誤可能會導(dǎo)致Chunk自動消失(比如,硬盤損壞了或者無法訪問了),亦或者操作人員可能會重命名一個Chunk服務(wù)器,還是由chunk server來報告比較靠譜。

            posted @ 2013-10-23 01:36 whspecial 閱讀(1238) | 評論 (0)編輯 收藏

            2013年8月14日

                Dremel是google推出的又一神器,paper中宣稱能夠在3s內(nèi)分析1PB的數(shù)據(jù),主要是面向交互式查詢。這篇paper對嵌套類型的存儲方式方面,思維確實有些跳躍,這篇文章主要講講這個,一方面是方便后來者理解,另一方面是讓自己也整理下思路。

                首先Dremel使用的是列存模型,對于基本類型列存較容易做到;但是對于嵌套類型,Dremel也能做到將其拆解成基本類型并進行列存,這是值得我們研究的。

                直觀看下嵌套類型按行存儲和拆解后按列存儲的對比效果:

                然后對于嵌套數(shù)據(jù)類型,Dremel里面定義了里面三種類型的字段

                1,必須出現(xiàn)1次而且僅出現(xiàn)1次的字段:required

                2,可能出現(xiàn)1次或者0次的字段:optional

                3,可能出現(xiàn)0次或者N次字段:repeated

                下面以paper的例子來講述吧:

                其中DocId是required字段,因此在r1,r2中必須出現(xiàn)1次;url字段是optional字段,因此在r1的第三個Name里未出現(xiàn),在r1的前兩個Name里出現(xiàn)了1次;Backward字段是repeated字段,因此在r1的Links里未出現(xiàn),在r2的Links里出現(xiàn)了2次。

                理解了上面這些,直接來看下Dremel是怎么來存它的吧:

                上表中的每條記錄都有兩個屬性,"r"代表repetition level,"d"代表definition level,定義如下:

                repetition level:what repeated field in the field’s path the value has repeated,記錄該字段是在哪個repeated級別上重復(fù)的

                definition level:how many fields inpthat could be undefined (because they are optional or repeated) are actually present,記錄該字段之上有多少個optional或者repeated字段實際是有值的(本來可以為null的)

                看到這里,各位可能已經(jīng)在心里默念了:WTF!別急,可以結(jié)合一個例子來看:

            先看repetition level(下面以r替代),以Name.Language.Code為例:

                1)對第1個出現(xiàn)的值,其r始終為0,因此'en-us'的r為0

                2)對于第2個值'en',其上一個值是'en-us',它們是在Language級別發(fā)生的重復(fù),Name.Language是兩級的repeated字段,因此r為2

                3)對于第3個值null,是為了記錄'en-gb'是出現(xiàn)在第三個Name而非第二個Name里,特意占位用的。null的上一個值是'en',它們是在Name級別發(fā)生的重復(fù),因此r是1

                4)對于第4個值'en-gb',其上一個值是null,它們也是在Name級別發(fā)生的重復(fù),因此r是1

                5)對于第5個值null,其上一個值是'en-gb',它們出現(xiàn)在兩個不同Document里,因此r是0

                總結(jié)下,看repetition level注意兩點:1,只比較該值和上一個值;2,只需要看這兩個值的重復(fù)位置上有幾個repeated字段

            再看definition level(下面以d替代),也以Name.Language.Code為例:

                1)對于'en-us',其上的Name,Language都出現(xiàn)了,因此d為2(其實對于非null值的字段,其上的optional或者repeated字段肯定是出現(xiàn)了,所以都是相同的,只是null字段的d值有差別)

                2)對于'en',同理d也為2

                3)對于null,其上只出現(xiàn)了Name,沒有出現(xiàn)Language,因此d為1

                4)對于'en-gb',d也為2

                5)對于最后一個null,其上也只出現(xiàn)了Name,沒有出現(xiàn)Language,因此d為1


                以上只是講了dremel怎么去存嵌套類型,至于這種存法是怎么想出來的,真非我輩能理解的了。。。更多內(nèi)容,請參考原著paper及網(wǎng)上解析。

            posted @ 2013-08-14 23:17 whspecial 閱讀(1869) | 評論 (1)編輯 收藏

                上篇文章從整體介紹了Orcfile的存儲格式,接下來重點介紹下Orc里用到的幾種編碼格式:

                字典編碼:用于String類型的字段

                Run-Length編碼:用于int,long,short等類型的編碼

                Bit編碼:可以用于各種數(shù)據(jù)類型

            1,字典編碼:

                對于String類型的每個字段分別保存一個字典,記錄每個值在字典中的位置,保存字典的數(shù)據(jù)結(jié)構(gòu)采用一棵紅黑樹。對于每個String字段,最終會有三個輸出Stream,分別是StringOuptut(記錄字典中的值),LengthOutput(記錄每個字典值的長度),RowOutput(記錄字段在字典中的位置)。

                思考1:為什么要用紅黑樹?

                因為紅黑樹無論是插入,刪除,查找的性能都比較平均,都是O(logN),而且是平衡查找樹,最壞情況也不會退化成O(N)

                思考2:其實一般存儲時還會使用LZO之類的壓縮,它們本身就是一種字典壓縮,為什么Orc里面要自己做字典壓縮?

                因為LZO之類的壓縮窗口一般比較小(LZO默認是64KB),而Orc的字典壓縮是以整個字段為范圍來壓縮的,壓縮率會更好。

            2,Run-Length編碼:

                對于int,long,short類型的字段,使用Run-Length編碼。該Run-Length能夠?qū)Φ炔顢?shù)列(完全相等也屬于等差數(shù)列)進行壓縮,該等差數(shù)列需要滿足以下兩個條件:

                1,至少包含3個元素

                2,差值在-128~127之間(因為差值用1Byte來表示)

                對于不滿足等差數(shù)列的數(shù)字,Run-Length編碼也能存儲,但是沒有壓縮效果,Run-Length的具體存儲如下:

                第一個Byte是Control Byte,取值在-128~127之間,其中-1~-128代表后面存儲著1~128個不滿足等差數(shù)列的數(shù)字,0~127代表后面存儲著3~130個等差數(shù)列的數(shù)字;

                如果Control Byte>=0,則后面跟著一個Byte存儲差值,否則不存儲該Byte;

                如果Control Byte>=0,則后面跟著等差數(shù)列的第一個數(shù),否則跟著-Control Byte個數(shù)字。

                例子:

                原始數(shù)字:12,12,12,12,12,10,7,13

                經(jīng)過Run-Length的數(shù)字:2,0,12,-3,10,7,13

                紅色代表Control Byte,黃色代表差值,黑色代表具體的數(shù)字。

            3,Bit編碼:

            對所有類型的字段都可以采用Bit編碼來表示該值是否為null。在寫任何類型字段之前,先判斷該字段值是夠為null,如果為null則bit值存為0,否則存為1,對于為null的字段在實際編碼時不需要存儲了。經(jīng)過Bit編碼之后,可以對于8個bit組成一個Byte,再對其進行Run-Length編碼。

                其實除了這三種編碼格式之外,Orc對于hive的復(fù)雜類型array,map,list等,將其降維成基本類型來存儲,這個也是值得借鑒的,如果有空之后會進行分析。

            posted @ 2013-08-14 23:13 whspecial 閱讀(3499) | 評論 (0)編輯 收藏

                Orcfile(Optimized Row Columnar)是hive 0.11版里引入的新的存儲格式,是對之前的RCFile存儲格式的優(yōu)化。寫這個的哥們來自于HortonWorks,代碼寫的很不錯,比之前的rcfile強多了(據(jù)說rcfile是個中科院的童鞋跑去facebook寫的,看來中國的計算機教育水平還是有限啊。。。囧,跑題了)

                先介紹下Orc的文件格式,截一張官方的圖:

                可以看到每個Orc文件由1個或多個stripe組成,每個stripe250MB大小,這個Stripe實際相當于之前的rcfile里的RowGroup概念,不過大小由4MB->250MB,這樣應(yīng)該能提升順序讀的吞吐率。每個Stripe里有三部分組成,分別是Index Data,Row Data,Stripe Footer:

                1,Index Data:一個輕量級的index,默認是每隔1W行做一個索引。這里做的索引應(yīng)該只是記錄某行的各字段在Row Data中的offset,據(jù)說還包括每個Column的max和min值,具體沒細看代碼。

                2,Row Data:存的是具體的數(shù)據(jù),和RCfile一樣,先取部分行,然后對這些行按列進行存儲。與RCfile不同的地方在于每個列進行了編碼,分成多個Stream來存儲,具體如何編碼在下一篇解析里會講。

                3,Stripe Footer:存的是各個Stream的類型,長度等信息。

                每個文件有一個File Footer,這里面存的是每個Stripe的行數(shù),每個Column的數(shù)據(jù)類型信息等;每個文件的尾部是一個PostScript,這里面記錄了整個文件的壓縮類型以及FileFooter的長度信息等。在讀取文件時,會seek到文件尾部讀PostScript,從里面解析到File Footer長度,再讀FileFooter,從里面解析到各個Stripe信息,再讀各個Stripe,即從后往前讀。

                接下來看下ORcfile相對于RCfile做了哪些改進,從Orc作者的ppt里截了張圖,分別解釋下各行:

                Hive type model:RCfile在底層存儲時不保存類型,都當做Byte流來存儲

                Separtor complex columns:Orc將復(fù)雜類型拆開存儲

                Splits Found Quickly:不很理解

                Default Column group size:不用解釋了

                Files per a bucket:不很理解

                Store min,max,count,sum:存了這些便于快速地skip掉一個stripe

                Versioned metadata:不很理解

                Run-Length Data-coding:整數(shù)類型做Run-Length變長編碼

                Store Strings in dictionary:String類型做字典編碼

                Store Row Count:每個Stripe會存儲行數(shù)

                Skip Compressed blocks:可以直接skip掉壓縮過的block

                Store internal indexes:存儲了一個輕量級的index


                整個Orc看下來,代碼寫的還是比較清晰明了的,而且我們也進行了測試,壓縮效果比RCfile提升了不少,有興趣的朋友可以來看下,之后會寫第二篇解析,主要是講Orc用到的幾種編碼格式。

            posted @ 2013-08-14 23:12 whspecial 閱讀(6736) | 評論 (0)編輯 收藏

            亚洲国产精品综合久久网络| 久久综合香蕉国产蜜臀AV| 天堂久久天堂AV色综合| 国产精品永久久久久久久久久| 看久久久久久a级毛片| 亚洲va中文字幕无码久久| 久久人人添人人爽添人人片牛牛| 婷婷久久精品国产| 久久久久久国产精品无码下载 | 精品熟女少妇AV免费久久| 久久成人小视频| 99精品国产99久久久久久97| 亚洲国产精品无码成人片久久| 无码精品久久久久久人妻中字 | 久久青青草原综合伊人| 91久久福利国产成人精品| 久久久精品波多野结衣| 99久久做夜夜爱天天做精品| 综合网日日天干夜夜久久| 久久国产热精品波多野结衣AV| 精品乱码久久久久久久| 精品国产一区二区三区久久蜜臀| 久久久久久国产精品美女| 久久精品成人欧美大片| 久久久老熟女一区二区三区| 国产高潮国产高潮久久久91| 一个色综合久久| 亚洲国产成人久久精品动漫| 日批日出水久久亚洲精品tv| 无码久久精品国产亚洲Av影片 | www.久久热.com| 久久久久亚洲爆乳少妇无| 亚洲AV无一区二区三区久久 | 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 日本免费久久久久久久网站| 亚洲精品无码久久毛片| 久久精品国产亚洲av影院| 久久婷婷五月综合97色直播| 久久亚洲春色中文字幕久久久| 久久精品国产第一区二区| 久久久久久无码Av成人影院|