天天看點

《Hadoop實戰第2版》——1.6節Hadoop資料管理

1.6 hadoop資料管理

前面重點介紹了hadoop及其體系結構與計算模型mapreduce,現在開始介紹hadoop的資料管理,主要包括hadoop的分布式檔案系統hdfs、分布式資料庫hbase和資料倉庫工具hive。

1.6.1 hdfs的資料管理

hdfs是分布式計算的存儲基石,hadoop分布式檔案系統和其他分布式檔案系統有很多類似的特性:

對于整個叢集有單一的命名空間;

具有資料一緻性,都适合一次寫入多次讀取的模型,用戶端在檔案沒有被成功建立之前是無法看到檔案存在的;

檔案會被分割成多個檔案塊,每個檔案塊被配置設定存儲到資料節點上,而且會根據配置由複制檔案塊來保證資料的安全性。

通過前面的介紹和圖1-3可以看出,hdfs通過三個重要的角色來進行檔案系統的管理:namenode、datanode和client。namenode可以看做是分布式檔案系統中的管理者,主要負責管理檔案系統的命名空間、叢集配置資訊和存儲塊的複制等。namenode會将檔案系統的 metadata存儲在記憶體中,這些資訊主要包括檔案資訊、每一個檔案對應的檔案塊的資訊和每一個檔案塊在datanode中的資訊等。datanode是檔案存儲的基本單元,它将檔案塊(block)存儲在本地檔案系統中,儲存了所有block的metadata,同時周期性地将所有存在的 block資訊發送給namenode。client就是需要擷取分布式檔案系統檔案的應用程式。接下來通過三個具體的操作來說明hdfs對資料的管理。

(1)檔案寫入

1)client向namenode發起檔案寫入的請求。

2)namenode根據檔案大小和檔案塊配置情況,傳回給client所管理的datanode的資訊。

3)client将檔案劃分為多個block,根據datanode的位址資訊,按順序将其寫入到每一個datanode塊中。

(2)檔案讀取

1)client向namenode發起檔案讀取的請求。

2)namenode傳回檔案存儲的datanode資訊。

3)client讀取檔案資訊。

(3)檔案塊(block)複制

1)namenode發現部分檔案的block不符合最小複制數這一要求或部分datanode失效。

2)通知datanode互相複制block。

3)datanode開始直接互相複制。

作為分布式檔案系統,hdfs在資料管理方面還有值得借鑒的幾個功能:

檔案塊(block)的放置:一個block會有三份備份,一份放在namenode指定的datanode上,另一份放在與指定datanode不在同一台機器上的datanode上,最後一份放在與指定datanode同一rack的datanode上。備份的目的是為了資料安全,采用這種配置方式主要是考慮同一rack失敗的情況,以及不同rack之間進行資料複制會帶來的性能問題。

心跳檢測:用心跳檢測datanode的健康狀況,如果發現問題就采取資料備份的方式來保證資料的安全性。

資料複制(場景為datanode失敗、需要平衡datanode的存儲使用率和平衡datanode資料互動壓力等情況):使用hadoop時可以用hdfs的balancer指令配置threshold來平衡每一個datanode的磁盤使用率。假設設定了threshold為10%,那麼執行balancer指令時,首先會統計所有datanode的磁盤使用率的平均值,然後判斷如果某一個datanode的磁盤使用率超過這個平均值,那麼将會把這個datanode的block轉移到磁盤使用率低的datanode上,這對于新節點的加入十分有用。

資料校驗:采用crc32做資料校驗。在寫入檔案塊的時候,除了會寫入資料外還會寫入校驗資訊,在讀取的時候則需要先校驗後讀入。

單個namenode:如果單個namenode失敗,任務處理資訊将會記錄在本地檔案系統和遠端的檔案系統中。

資料管道性的寫入:當用戶端要寫入檔案到datanode上時,首先會讀取一個block,然後将其寫到第一個datanode上,接着由第一個 datanode将其傳遞到備份的datanode上,直到所有需要寫入這個block的datanode都成功寫入後,用戶端才會開始寫下一個block。

安全模式:分布式檔案系統啟動時會進入安全模式(系統運作期間也可以通過指令進入安全模式),當分布式檔案系統處于安全模式時,檔案系統中的内容不允許修改也不允許删除,直到安全模式結束。安全模式主要是為了在系統啟動的時候檢查各個datanode上資料塊的有效性,同時根據政策進行必要的複制或删除部分資料塊。在實際操作過程中,如果在系統啟動時修改和删除檔案會出現安全模式不允許修改的錯誤提示,隻需要等待一會兒即可。

1.6.2 hbase的資料管理

hbase是一個類似bigtable的分布式資料庫,它的大部分特性和bigtable一樣,是一個稀疏的、長期存儲的(存在硬碟上)、多元度的排序映射表,這張表的索引是行關鍵字、列關鍵字和時間戳。表中的每個值是一個純字元數組,資料都是字元串,沒有類型。使用者在表格中存儲資料,每一行都有一個可排序的主鍵和任意多的列。由于是稀疏存儲的,是以同一張表中的每一行資料都可以有截然不同的列。列名字的格式是“< family>:< label>”,它是由字元串組成的,每一張表有一個family集合,這個集合是固定不變的,相當于表的結構,隻能通過改變表結構來改變表的family集合。但是label值相對于每一行來說都是可以改變的。

hbase把同一個family中的資料存儲在同一個目錄下,而hbase的寫操作是鎖行的,每一行都是一個原子元素,都可以加鎖。所有資料庫的更新都有一個時間戳标記,每次更新都會生成一個新的版本,而hbase會保留一定數量的版本,這個值是可以設定的。用戶端可以選擇擷取距離某個時間點最近的版本,或者一次擷取所有版本。

以上從微觀上介紹了hbase的一些資料管理措施。那麼hbase作為分布式資料庫在整體上從叢集出發又是如何管理資料的呢?

hbase在分布式叢集上主要依靠由hregion、hmaster、hclient組成的體系結構從整體上管理資料。

hbase體系結構有三大重要組成部分:

hbasemaster:hbase主伺服器,與bigtable的主伺服器類似。

hregionserver:hbase域伺服器,與bigtable的tablet伺服器類似。

hbase client:hbase用戶端是由org.apache.hadoop.hbase.client.htable定義的。

下面将對這三個元件進行詳細的介紹。

(1)hbasemaster

一個hbase隻部署一台主伺服器,它通過上司選舉算法(leader election algorithm)確定隻有唯一的主伺服器是活躍的,zookeeper儲存主伺服器的伺服器位址資訊。如果主伺服器癱瘓,可以通過上司選舉算法從備用伺服器中選擇新的主伺服器。

主伺服器承擔着初始化叢集的任務。當主伺服器第一次啟動時,會試圖從hdfs擷取根或根域目錄,如果擷取失敗則建立根或根域目錄,以及第一個元域目錄。在下次啟動時,主伺服器就可以擷取叢集和叢集中所有域的資訊了。同時主伺服器還負責叢集中域的配置設定、域伺服器運作狀态的監視、表格的管理等工作。

(2)hregionserver

hbase域伺服器的主要職責有服務于主伺服器配置設定的域、處理用戶端的讀寫請求、本地緩沖區回寫、本地資料壓縮和分割域等功能。

每個域隻能由一台域伺服器來提供服務。當它開始服務于某域時,它會從hdfs檔案系統中讀取該域的日志和所有存儲檔案,同時還會管理操作hdfs檔案的持久性存儲工作。用戶端通過與主伺服器通信擷取域和域所在域伺服器的清單資訊後,就可以直接向域伺服器發送域讀寫請求,來完成操作。

(3)hbaseclient

hbase用戶端負責查找使用者域所在的域伺服器位址。hbase用戶端會與hbase主機交換消息以查找根域的位置,這是兩者之間唯一的交流。

定位根域後,用戶端連接配接根域所在的域伺服器,并掃描根域擷取元域資訊。元域資訊中包含所需使用者域的域伺服器位址。用戶端再連接配接元域所在的域伺服器,掃描元域以擷取所需使用者域所在的域伺服器位址。定位使用者域後,用戶端連接配接使用者域所在的域伺服器并發出讀寫請求。使用者域的位址将在用戶端被緩存,後續的請求無須重複上述過程。

綜上所述,在hbase的體系結構中,hbase主要由主伺服器、域伺服器和用戶端三部分組成。主伺服器作為hbase的中心,管理整個叢集中的所有域,監控每台域伺服器的運作情況等;域伺服器接收來自伺服器的配置設定域,處理用戶端的域讀寫請求并回寫映射檔案等;用戶端主要用來查找使用者域所在的域伺服器位址資訊。

1.6.3 hive的資料管理

hive是建立在hadoop上的資料倉庫基礎構架。它提供了一系列的工具,用來進行資料提取、轉化、加載,這是一種可以存儲、查詢和分析存儲在hadoop中的大規模資料的機制。hive定義了簡單的類sql的查詢語言,稱為hive ql,它允許熟悉sql的使用者用sql語言查詢資料。作為一個資料倉庫,hive的資料管理按照使用層次可以從中繼資料存儲、資料存儲和資料交換三方面來介紹。

(1)中繼資料存儲

hive将中繼資料存儲在rdbms中,有三種模式可以連接配接到資料庫:

single user mode:此模式連接配接到一個in-memory的資料庫derby,一般用于unit test。

multi user mode:通過網絡連接配接到一個資料庫中,這是最常用的模式。

remote server mode:用于非java用戶端通路中繼資料庫,在伺服器端啟動一個 metastoreserver,用戶端利用thrift協定通過 metastoreserver來通路中繼資料庫。

(2)資料存儲

首先,hive沒有專門的資料存儲格式,也沒有為資料建立索引,使用者可以非常自由地組織hive中的表,隻需要在建立表的時候告訴hive資料中的列分隔符和行分隔符,它就可以解析資料了。

其次,hive中所有的資料都存儲在hdfs中,hive中包含4種資料模型:table、external table、partition和bucket。

hive中的table和資料庫中的table在概念上是類似的,每一個table在hive中都有一個相應的目錄來存儲資料。例如,一個表pvs,它在hdfs中的路徑為:/wh/pvs,其中,wh是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的資料倉庫的目錄,所有的 table資料(不包括external table)都儲存在這個目錄中。

(3)資料交換

資料交換主要分為以下幾部分,如圖1-5所示。

使用者接口:包括用戶端、web界面和資料庫接口。

中繼資料存儲:通常存儲在關系資料庫中,如mysql、derby等。

解釋器、編譯器、優化器、執行器。

hadoop:利用hdfs進行存儲,利用mapreduce進行計算。

使用者接口主要有三個:用戶端、資料庫接口和web界面,其中最常用的是用戶端。client是hive的用戶端,當啟動client模式時,使用者會想要連接配接hive server,這時需要指出 hive server所在的節點,并且在該節點啟動hiveserver。web界面是通過浏覽器通路hive的。

hive将中繼資料存儲在資料庫中,如mysql、derby中。hive 中的中繼資料包括表的名字、表的列、表的分區、表分區的屬性、表的屬性(是否為外部表等)、表的資料所在目錄等。

解釋器、編譯器、優化器完成hive ql查詢語句從詞法分析、文法分析、編譯、優化到查詢計劃的生成。生成的查詢計劃存儲在hdfs中,并且随後由mapreduce調用執行。

hive的資料存儲在hdfs中,大部分的查詢由mapreduce完成(包含的查詢不會生成mapredcue任務,比如select from tbl)。

以上從hadoop的分布式檔案系統hdfs、分布式資料庫hbase和資料倉庫工具hive入手介紹了hadoop的資料管理,它們都通過自己的資料定義、體系結構實作了資料從宏觀到微觀的立體化管理,完成了hadoop平台上大規模的資料存儲和任務處理。

《Hadoop實戰第2版》——1.6節Hadoop資料管理