HDFS Federation基於Ambari部署安裝(調研文檔)

一、 HDFS Federation架構

* 在有Federation之前的HDFS架構

NameSpace層: 管理路徑、文件以及blocks的關係,同時支持文件系統的操作比如mkdir/put/get等;
BlockStorage層:
- Block Management: 維護Datanode中存儲的映射關係,主要是支持block層的創建、刪除、修改及副本的放置等;
- Physical Storage: 存儲block;

該架構中一個集羣中只能存在一個namespace,存在以下限制:
- 過多的BlockStorage同NameSpace的耦合;
- NameSpace的擴展性問題;
- 性能問題:單個節點的NameSpace雖然可以通過使用SSD盤刷FSEdit日誌、加大內存等手段改進,但隨着節點的增多單NN瓶頸總彙出現;
- 隔離性問題:各業務線共用一個NN,使得一旦有業務線使用不當導致NN不可用或者負載過高,會影響其他業務線(線上小文件問題);

* 改進後的HDFS Federation架構

HDFS Federation在0.23版本中已經加入。

HDFS Federation簡單原理:
- 多個NN共用一個集羣裏DN上的存儲資源,每個NN都可以單獨對外提供服務;
- 每個NN都會定義一個存儲池,有單獨的id,每個DN都爲所有存儲池提供存儲;
- DN會按照存儲池id向其對應的NN彙報塊信息,同時,DN會向所有NN彙報本地存儲可用資源情況;

改進後的優點:
- 擴展性和隔離性: 支持多個namenode水平擴展整個文件系統的namespace。可按照應用程序的用戶和種類分離namespace volume,進而增強了隔離性。
- 通用存儲服務: Block Pool抽象層爲HDFS的架構開啓了創新之門。分離block storage layer使得:
- 新的文件系統(non-HDFS)可以在block storage上構建;
- 新的應用程序(如HBase)可以直接使用block storage層;
- 分離的block storage層爲將來完全分佈式namespace打下基礎;
- 改動最小,向前兼容
- 現有的NN無需任何配置改動;
- 如果現有的客戶端只連某臺NN的話,代碼和配置也無需改動;
- 客戶端掛載表
- 通過路徑自動對應NN;
- 使Federation的配置改動對應用透明;

二、當前Ambari架構的侷限

Ambari是Hortonworks貢獻給社區的、完全開源的、Hadoop生態的集羣管理、監控、部署的工具,我們現有自動化部署工具Ambari是基於社區版2.5.0分支開發的。

Ambari中主要概念如下:
- Stack: 發行版本(比如Hotorworks的HDP,我們自研的NDP),同時支持不同的版本,版本之間可以繼承,但一次部署安裝智能選擇一個發行版;
- Service: 服務,屬於stack,一個stack下可以有多個service,service也可以分多個版本,版本間可以有繼承關係;比如當前我們自研版本支持Zookeeper/HDFS/YARN/Spark2/Hive2/Mammut/ElasticSearch/Kafka/Atlas等21個服務;
- Component: 組件,屬於service,一個service下可以有多個component組成。例如HDFS服務下的組件有datanode,namenode等,Yarn下包含resourcemanager/nodemanager等;
- 角色: Component的屬性,如master、slave等,也可以指定每種角色需要的host個數。例如namenode爲單一host組件,可以部署在master機器上,datanode可以部署在多臺host上那麼可以指定部署datanode的角色爲slave;
- Host: host爲運行ambari-agent的一臺機器,同時也是搭建集羣內部的一臺機器,可以部署多個Service的多個Component;

Ambari-Server調度原理:
- Ambari-server的Heartbeat Handler模塊用於接收各個agent的心跳請求(心跳請求裏面主要包含兩類信息:節點狀態信息和返回的操作結果),把節點狀態信息傳遞給FSM狀態機去維護着該節點的狀態,並且把返回的操作結果信息返回給Action Manager去做進一步的處理。
- Coordinator模塊又可以稱爲API handler,主要在接收WEB端操作請求後,會檢查它是否符合要求,stageplanner分解成一組操作,最後提供給ActionManager去完成執行操作。
- Ambari-Server的所有狀態信息的維護和變更都會記錄在數據庫中,用戶做一些更改服務的操作都會在數據庫上做一些相應的記錄,同時,agent通過心跳來獲得數據庫的變更歷史。

但在使用的過程中,發現Ambari有許多限制,社區已經發現了,在AMBARI-14714中已經計劃Ambari3.0.0進行重構,比如:
- 多個Stack問題:比如無法部署HDP的一些社區組件+自研的NDP的一些組件;
- 多個集羣問題: 無法基於Ambari部署多個集羣,集羣1供產品1使用,集羣2供產品2使用;
- 多個Service問題: 通過Ambari部署,HDFS/Yarn/Kafka/Solr公用一套Zookeeper,其隔離性受限;
- 多版本Service問題:現實中可能依賴Kafka0.8.x和Kafka0.9.x等,或者Elasticsearch1.x/2.x/5.x版本等,但基於Ambari只能部署一個版本;
- Ambari-Server HA問題:雖然社區有通過VIP的方式提供解決方案,但依然達不到HA的要求AMBARI-17126;
- HDFS Federation問題: 社區沒有做這個的意思;
- Fair Scheduler問題: 社區(或者說Hortonworks)當前支持Capacity Scheduler調度,對Fair Scheduler調度不支持;

三、關於HDFS Federation的部署方式

其中有關HDFS Federation的解決方案結合Ambari本身的架構來講,想很好的剝離其原本的架構來實現有一定的難度,暫時想到了如下幾個方案:
- 手動部署:最靈活,可參考當前線上聯通集羣的案例;
- 多Ambari-Server部署方式:部署多套Ambari-Server,同時修改各自配置,達到自動化部署HDFS Federation的效果;
- 社區Multi-Everything方案: 最理想的狀態,完全自動化部署,解決以上許多問題;首先社區Ambari3.0.0改動很大,現在分支還沒有release(有詢問過,但沒人保障最終deadline,畢竟都是hortonworks一幫人在弄,社區很不活躍),同時將我們自研結果何如社區Ambari3.0.0有一定的時間;

方案一、手動部署

部署新的Federation,還是按照HDFS HA的方式部署,需要兩臺機器namenode和secondery_namenode;

在namenode和secondery_namenode兩臺機器上均需要如下操作:
1. 在需要添加的節點上添加hdfs_client,並複製相應的路徑:/usr/ndp/current/hdfs_client -> /usr/ndp/current/hdfs_namenode,並修改相應的hdfs_namenode conf配置路徑。;
2. 修改複製的hdfs_namenode下的hadoop-env.sh: 將其中的hdfs_client變更爲hdfs_namenode
3. 修改core-site.xml
core-site.xml中添加federation的serviceId:

  <property>
      <name>fs.defaultFS</name>
      <value>hdfs://test1</value>
      <final>true</final>
    </property>
  1. 修改hdfs-site.xml: 首先刪除不必要的配置:dfs.internal.nameservices, 同時添加如下配置:
<property>
        <name>dfs.nameservices</name>
        <value>hzadg,test1</value>
    </property>

    <property>
        <name>dfs.client.failover.proxy.provider.test1</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <property>
      <name>dfs.ha.namenodes.test1</name>
      <value>nn3,nn4</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.test1.nn3</name>
      <value>hzadg-mammut-platform3.server.163.org:50070</value>
    </property>
    <property>
      <name>dfs.namenode.https-address.test1.nn3</name>
      <value>hzadg-mammut-platform3.server.163.org:50470</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.test1.nn3</name>
      <value>hzadg-mammut-platform3.server.163.org:8020</value>
    </property>
    <property>
        <name>dfs.namenode.servicerpc-address.test1.nn3</name>
        <value>hzadg-mammut-platform3.server.163.org:8021</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.test1.nn4</name>
      <value>hzadg-mammut-platform4.server.163.org:8020</value>
    </property>
    <property>
      <name>dfs.namenode.https-address.test1.nn4</name>
      <value>hzadg-mammut-platform4.server.163.org:50470</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.test1.nn4</name>
      <value>hzadg-mammut-platform4.server.163.org:50070</value>
    </property>
    <property>
        <name>dfs.namenode.servicerpc-address.test1.nn4</name>
        <value>hzadg-mammut-platform4.server.163.org:8021</value>
    </property>
  1. 創建必要的目錄,注意權限hdfs:hadoop用戶組:
    日誌/run路徑
    hdfs存儲目錄: /srv/nbs/0/hadoop/hdfs/namenode
  2. 添加keytab,並根據hdfs-site.xml指定位置複製到相應的路徑下:
    addprinc -randkey nn/hzadg-mammut-platform4.server.163.org
    ktadd nn/hzadg-mammut-platform4.server.163.org
  3. namenode/secondery_namenode 格式化,注意使用同已有集羣相同的cluster-id:
    su hdfs -l -s /bin/bash -c ‘/usr/ndp/current/hdfs_namenode/bin/hdfs namenode -format -clusterId CID-bc01aa89-d9db-4d28-b035-698456b78b95’
  4. 啓動 namenode
    su hdfs -l -s /bin/bash -c ‘ulimit -c unlimited ; /usr/ndp/current/hdfs_namenode/sbin/hadoop-daemon.sh –config /usr/ndp/current/hdfs_namenode/conf start namenode’
  5. 啓動 second namenode
    su hdfs -l -s /bin/bash -c ‘/usr/ndp/current/hdfs_namenode/bin/hdfs namenode -bootstrapStandby’
  6. 添加ZKFailOver
    注意添加完畢連個namenode之後,兩個節點都是standby狀態,同時沒辦法使用hdfs haadmin --transitionToActive nn3命令切換爲active,只有開啓ZKFailControl,在namenode/secondnamenode中輸入如下命令:
    su hdfs -l -s /bin/bash -c ‘ulimit -c unlimited ; /usr/ndp/current/hdfs_namenode/bin/hdfs zkfc -formatZK’
    su hdfs -l -s /bin/bash -c ‘ulimit -c unlimited ; /usr/ndp/current/hdfs_namenode/sbin/hadoop-daemon.sh –config /usr/ndp/current/hdfs_namenode/conf start zkfc’
  7. 修改原有集羣配置
    針對原集羣,修改hdfs-site.xml這樣datanode就可以彙報至新的federation集羣了,修改方式同上述部署一致:
    首先刪除不必要的配置:dfs.internal.nameservices
    <property>
        <name>dfs.nameservices</name>
        <value>hzadg,test1</value>
    </property>

    <property>
        <name>dfs.client.failover.proxy.provider.test1</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <property>
      <name>dfs.ha.namenodes.test1</name>
      <value>nn3,nn4</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.test1.nn3</name>
      <value>hzadg-mammut-platform3.server.163.org:50070</value>
    </property>
    <property>
      <name>dfs.namenode.https-address.test1.nn3</name>
      <value>hzadg-mammut-platform3.server.163.org:50470</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.test1.nn3</name>
      <value>hzadg-mammut-platform3.server.163.org:8020</value>
    </property>
    <property>
        <name>dfs.namenode.servicerpc-address.test1.nn3</name>
        <value>hzadg-mammut-platform3.server.163.org:8021</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.test1.nn4</name>
      <value>hzadg-mammut-platform4.server.163.org:8020</value>
    </property>
    <property>
      <name>dfs.namenode.https-address.test1.nn4</name>
      <value>hzadg-mammut-platform4.server.163.org:50470</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.test1.nn4</name>
      <value>hzadg-mammut-platform4.server.163.org:50070</value>
    </property>
    <property>
        <name>dfs.namenode.servicerpc-address.test1.nn4</name>
        <value>hzadg-mammut-platform4.server.163.org:8021</value>
    </property>
  1. 重啓原有集羣: 保持集羣配置一致,同時datanode會註冊至新的federation集羣;

方案二、多Ambari-Server部署方式

需要注意的是,暫時調研發現單個ambari-agent無法服務於多個ambari-server,所以暫時需要通過添加機器,重新部署ambari-agent的方式解決;

思路:
1. 添加新的機器,獨立部署一套ambari-server;
2. 在ambari-server上安裝zookeeper和hdfs基礎組件;
3. 啓動HA和Kerberos環境;
4. 參考上述需要修改的配置,修改原集羣和新添加集羣的配置;
5. 重啓服務;

實驗

TODO

方案三、社區Multi-Everything方案

一個ambari實例同一個Mpack Repository關聯(圖中的Mpack Repository), 可以通過Mpcak Repositoryc查詢一系列的可用Mpack(圖中的DistroX3.0.0/DistroY3.2.0等),同時可以用不同的Mpack部署y一個集羣,在這個集羣內可以創建不同的servcie group(圖中的Core SG/Stream SG等),可以在集羣中部署不同的service實例(圖中的ZK1/ZK2),同時在同一個host可以部署多個同一個組件實例(圖中的Broker-1/Broker-2等);

社區Ambari3.0.0的設計方案中,新添加了如下概念:
- Packlet: Packlet爲一個service/view的發佈部署單元,其爲Management pack的組成單元,比如Spark-2.0.0-packlet/HBase-3.0.0-packlet等。
- Service Packlet: Service服務的packlet,Spark-2.0.0-packlet/HBase-3.0.0-packlet等。;
- View Packlet: 同service packlet相似,但面向於ambari view的;
- Mpack(Management pack): 由不同packlet組成的一個組合,比如HDP-3.0.0.0-mpack等;
- Mpack Repository: 不同Mpack組成的一個發佈組合;
- Service Group: 爲了支持multi-mpcak和multi-service,引入了Service Group的概念,SG爲相關的service組合的邏輯概念,集羣內可以包含多個SG,SG安裝均來自相同的mpack,SG之間存在繼承關係;

需要注意的是SG同mpack概念是不同的:mpack類似於stack的概念,其爲一個發佈概念,如果你想引入service則需要在mpack中添加,SG爲運行時的概念,將不同的service組合一起的邏輯集合;所以在安裝部署的時候需要確認:
- 安裝service時需要綁定在mpack下的SG;
- 確定不同SG之間的依賴關係;

TODO: 持續關注;

總結

從上述的闡述中,當前總體思路: 打通思路一、思路二,長遠考慮關注思路三。

參考:
* Hortonworks關於HDFS Federation的說明: https://hortonworks.com/blog/an-introduction-to-hdfs-federation/
* HDFS Federation Issue: https://issues.apache.org/jira/browse/HDFS-1052
* HDFS Federation設計動機與基本原理: http://dongxicheng.org/mapreduce/hdfs-federation-introduction/
* http://www.infoq.com/cn/articles/hadoop-2-0-namenode-ha-federation-practice-zh/
* Hadoop 2.0 NameNode HA和Federation實踐: Ambari Multi Everything Issue: https://issues.apache.org/jira/browse/AMBARI-14714
* Ambari Server HA: https://issues.apache.org/jira/browse/AMBARI-17126
* Ambari HDFS Federation: https://issues.apache.org/jira/browse/AMBARI-10982
* Ambari Fair Scheduler: https://issues.apache.org/jira/browse/AMBARI-6819
* HDFS Federation機制: http://blog.csdn.net/androidlushangderen/article/details/52135506
* HA&Federation: http://blog.csdn.net/tutucute0000/article/details/39756123

發佈了55 篇原創文章 · 獲贊 12 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章