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

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

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

    小明思考

    Just a software engineer
    posts - 124, comments - 36, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Learn From HBase/Bigtable

    Posted on 2012-03-07 10:42 小明 閱讀(2061) 評論(0)  編輯  收藏 所屬分類: 分布式計算

    學習軟件有三個境界,第一個境界是會使用它,第二個境界是懂得背后的原理,明白它的架構體系,第三個境界學習他的所長,為我所用。研究HBase/BigTable架構和源碼一段時間后,我總結了一些東西可以供我們在設計分布式系統借鑒使用。

    1. 使用可信任的分布式組件來搭建自己的分布式系統。
    設 計一個可靠,健壯的分布式系統是比較困難的。我們知道,為了防止SPOF(Single Point Of Failure)問題,我們要分散風險,把數據放在多個nodes上面去,但是這樣帶來了是數據的同步問題和版本問題,解決這個問題需要運用復雜的 Paxos協議,系統的復雜度自然就升高了。另外一個需要解決的問題是分布式鎖和事件通知機制,以及全局信息共享,設計這些都需要大量的精力和仔細的研 究。

    HBase就不用考慮這些問題,它把數據的同步和冗余問題交給了Hadoop,把鎖機制和全局共享交給了Zookeeper,這大大簡化了HBase的設計。

    所以我們設計系統的時候,也要盡量利用這些可靠,穩定的組件。目前比較流行和穩定的有:
    分布式文件系統 - HDFS
    分布式鎖和目錄 - Zookeeper
    緩存 - MemCached
    消息隊列 - ActiveMQ

    2.避免單點問題(SPOF)
    設計分布式系統要時刻考慮到失敗,不單是軟件可能失敗,硬件也可能掛掉,所以我們系統里面就不能有不可替代的角色。

    HBase 使用Master Server來監控所有的Region Server,一旦其中的一臺出現問題,在其上的Region將會被轉移到其他的Region Server,避免了服務中斷。而Master Server也可以多臺備選,一臺掛掉之后,其他的備胎則會”繼承遺志“,從而讓整個系統得以生存。

    那 HBase如何做到這個呢,一個是使用”心跳機制”,即Region Server要主動定期向Master匯報狀況,另外一個是利用zookeeper里面的”生命節點“,每個server在啟動后要在ZK里面注冊,一旦 這個server掛掉,它在ZK里面的節點就會消失,監聽這個節點的server就會得到通知。

    3.利用不變性提高系統的吞吐量
    我們知道,很多進程/線程修改同一個東西的時候,我們就需要鎖機制來避免沖突。但是鎖帶來的問題是系統性能下降。如果對于一個只讀的對象,就不需要鎖了。

    HBase 在設計存儲的時候考慮到這一點,最新的數據是放在memory里面,以提高性能。但是memory是有限的,我們不可能讓數據一直放在memory里面, 所以我們需要定時把這些數據寫到HDFS/磁盤上面。一種設計是寫到一個可修改的大文件中去,這樣對這個文件的讀寫就需要加鎖了。HBase是每次都寫到 一個新的文件中,一旦文件創建后,這個文件將不能被修改,就是所謂的create-one-read-many。當然這樣也有一個問題,就是時間長了,會 有很多的小文件,每次查找,需要查找這所有的文件,降低了系統的性能,HBase會定時的合并這些小文件生成一個大文件。

    4.利用索引塊提高文件的查詢速度
    HBase的存儲文件(HFile)是用來存儲很多排序后的Key-Value的,如何設計一種支持快速隨機查詢和壓縮的文件是一個有意思的話題。

    HFile 在文件的尾部增加了索引塊,但是不可能對任何一個rowkey都做索引,這樣的話索引塊會很大,而且也不利于壓縮。HFile的做法是定義一個Data Block的大小,這樣就把數據劃分了一個一個的Block,索引只針對這些block做,Block是可以被壓縮的。當查詢一個rowkey的時候,如 果沒有cache的話,首先使用二分法定位到具體的block,然后再解壓,遍歷查詢具體的key。

    HFile這樣的設計兼顧了速度和文件大小的平衡。

    5.自定義RPC機制提供更大的靈活性
    HBase/Hadoop 都沒有利用標準的Java遠程調用規范RMI,而是自己搞了一套。這樣做的好處有幾點,一是減少網絡流量,我們知道,java RMI使用了java serlizable來傳遞參數,java序列化有很多無關的類信息,都占用不少的空間,而且這會帶來對java版本的依賴。二是帶來更大的靈活性,你可 以在其中加入版本檢查,權限認證等。

    那 HBase是怎么設計這個RPC呢?首先它定義了一個writable接口,來代替java序列化,實現這個接口就等于告訴HBase,怎么把這個對象寫 到RPC流中去。使用RPC的時候,需要先寫一個服務器端和客戶端共用的interface,這個interface必須繼承 VersionedProtocol來處理版本問題 。HBase利用Java的動態反射機制(Proxy.newProxyInstance)來生成代 理對象,這樣當Client調用代理對象的時候,Client就會把參數打包,發送到服務器端,然后等待返回結果。服務器會根據interface查找到 具體的實現的對象,調用該對象的方法來執行遠程調用。詳細的做法可以參考HBase/Hadoop的源碼。

    6.內嵌Web Server增強系統的透明度
    當一個后臺進程啟動之后,我們如何了解這個進程的內部狀態呢?傳統方法是通過進程管理器或者Debug log來看進程的情況,但是這些信息很有限。

    HBase利用jetty在進程內部啟動了一個web server,就可以即時的顯示一些系統內部的信息,非常的方便。

    利 用Jetty支持jsp非常的容易,下面是一個示例的代碼。注意的是,需要把jasper-runtime-5.5.12.jar,jasper- compiler-5.5.12.jar,jasper-compiler-jdt-5.5.12.jar,jsp-2.1.jar,jsp-api- 2.1.jar等jar包放在classpath里面,否則會出現頁面解析錯誤。

    server = new Server(port);

    server.setSendServerVersion(false);
    server.setSendDateHeader(false);
    server.setStopAtShutdown(true);

    WebAppContext wac = new WebAppContext();
    wac.setContextPath("/");
    wac.setWar("./webapps/job");
    server.setHandler(wac);
    server.setStopAtShutdown(true);

    主站蜘蛛池模板: 456亚洲人成影院在线观| 亚洲av日韩av高潮潮喷无码 | 久久国产精品成人片免费| 丁香五月亚洲综合深深爱| 国产精品免费观看视频| 国产成人亚洲精品影院| 精品无码一级毛片免费视频观看| 亚洲日韩国产精品乱| 成人免费一区二区三区| 亚洲综合色婷婷七月丁香| 99久久免费国产精品热| 婷婷亚洲综合五月天小说| 97青青草原国产免费观看| 亚洲国产日产无码精品| 最近的中文字幕大全免费版| 亚洲av永久中文无码精品综合 | 亚洲高清视频一视频二视频三| 日韩成人精品日本亚洲| 国产免费观看网站| 一级毛片免费一级直接观看| 久久久久久久亚洲精品| 91精品视频在线免费观看| 亚洲小说图片视频| 国产成人aaa在线视频免费观看| 欧洲乱码伦视频免费国产| 久久国产亚洲精品麻豆| 91精品啪在线观看国产线免费| 亚洲1区1区3区4区产品乱码芒果 | 色婷婷精品免费视频| 亚洲精品无码不卡在线播HE| 一区二区三区在线免费看| 色婷五月综激情亚洲综合| 免费少妇a级毛片| 国产精品偷伦视频观看免费 | 99精品视频在线观看免费播放 | 国产精品无码一区二区三区免费 | 亚洲国产精品人人做人人爽| 国产午夜成人免费看片无遮挡| 亚洲激情电影在线| 亚洲?V乱码久久精品蜜桃| 午夜无码A级毛片免费视频 |