HDFS的namenode從單節點擴展為HA需要注意的問題


擴展為HA需要注意的問題

原Namenode稱為namenode1,新增的Namenode稱為namenode2.

從namenode單節點擴展為HA模式官網上有詳細的教程,下面是擴展過程中疏忽的地方。

  • namenode2部署后需要復制namenode1格式化好的數據,就是namenode1部署的時候,通過hdfs namenode -format生成的數據。

  • journalnode部署好后,也需要格式化數據。格式化方式為:journalnode啟動之后,在namenode執行hdfs namenode -bootstrapStandby來初始化journalnode,namenode不能是在運行狀態,否則會報數據被鎖定的異常。

    然后執行hadoop/bin/hdfs haadmin -transitionToActive nn1手動吧nn1切換成active節點。

下面是簡寫的筆記,按照個人知識基礎寫的,建議部署過程參照官網。

HA 原理

hadoop可以通過nfs和quorum journal manager(QJM)實現。

通過QJM共享edit log。

當主節點掛了,備從edit log迅速成為主節點。

架構

HA 集群中有一個namenode是Active ,另一個是Standby

部署Standby的時候,把Active節點上格式化好的數據拷貝到Standby。

要布署HA,需要准備一下內容:

  • Namenode: 主節點和備節點。
  • JournalNode:JournalNode是輕量級的,所以JournalNode可以布署在其他的Hadoop機器上,比如job tracker或者yarn RecourceManager。注意:必須至少三個JournalNode,這種結構允許系統有一個節點故障。可以大於單台,但是要增加允許故障節點的數量,journalnode的數量必須時奇數。因為系統健康狀況的最低標准為(n/2)+1 個。所以三個節點只允許一台掛掉,4個節點也允許1台掛掉。

HA配置

參數說明

hdfs-site.xml

dfs.nameservices 用於標識集群

<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>

dfs.ha.namenodes.[nameservice ID] 集群mycluster的namenode成員

<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>

dfs.namenode.rpc-address.[nameservice ID].[name node ID]

<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>machine1.example.com:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>machine2.example.com:8020</value>
</property>

dfs.namenode.http-address.[nameservice ID].[name node ID]

<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>machine1.example.com:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>machine2.example.com:50070</value>
</property>

dfs.namenode.shared.edits.dir 配置edits共享地址,journalnode的地址。

mycluster是nameservice ID

<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
</property>

dfs.client.failover.proxy.provider.[nameservice ID] 客戶端用來連接avtive namenode的類。

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

dfs.ha.fencing.methods 再故障轉移時的一種保護機制。Hadoop可以使用shell和sshfence的方式。

sshfence參數遠程連接到目標節點殺死進程。

   <property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>

    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/exampleuser/.ssh/id_rsa</value>
    </property>

shell 可以使用的變量

$target_host hostname of the node to be fenced
$target_port IPC port of the node to be fenced
$target_address the above two, combined as host:port
$target_nameserviceid the nameservice ID of the NN to be fenced
$target_namenodeid the namenode ID of the NN to be fenced
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>shell(/path/to/my/script.sh --nameservice=$target_nameserviceid $target_host:$target_port)</value>
    </property>

core-site.xml

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>

dfs.journalnode.edits.dir journalnode保存edits的路徑

JournalNode的配置

<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/path/to/journal/node/local/data</value>
</property>

JournalNode

上面是配置,啟動方式為:

hadoop-2.9.2/sbin/hadoop-daemon.sh --config /opt/hadoop-2.9.2/etc/hadoop --script hdfs start journalnode

journalnode啟動之后在namenode執行hdfs namenode -bootstrapStandby來初始化journalnode

然后執行hadoop/bin/hdfs haadmin -transitionToActive nn1手動吧nn1切換成active節點。

namenode|secondarynamenode|datanode|journalnode|dfs|dfsadmin|fsck|balancer|zkfc|portmap|nfs3|dfsrouter

自動故障轉移

上面的配置只能使用手動轉移。

zookeeper布署

namenode

core-site.xml

<configuration>
<property>
	<name>fs.defaultFS</name>
	<value>hdfs://ns1</value>
</property>
<property>
	<name>hadoop.tmp.dir</name>
	<value>/opt/modules/App/hadoop-2.5.0/data/tmp</value>
</property>
<property>
	<name>hadoop.http.staticuser.user</name>
	<value>beifeng</value>
</property>
<property>
	<name>ha.zookeeper.quorum</name>
	<value>bigdata-01:2181,bigdata-02:2181,bigdata-03:2181</value>
</property>
</configuration>

hdfs-site.xml

<configuration>
<property>
	<name>dfs.replication</name>
	<value>3</value>
</property>
property>
	<name>dfs.permissions.enabled</name>
	<value>false</value>
</property>
<property>
	<name>dfs.nameservices</name>
	<value>ns1</value>
</property>
<property>
	<name>dfs.blocksize</name>
	<value>134217728</value>
</property>
<property>
	<name>dfs.ha.namenodes.ns1</name>
	<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址,nn1所在地址  -->
<property>
	<name>dfs.namenode.rpc-address.ns1.nn1</name>
	<value>bigdata-01:8020</value>
</property>
<!-- nn1的http通信地址,外部訪問地址 -->
<property>
	<name>dfs.namenode.http-address.ns1.nn1</name>
	<value>bigdata-01:50070</value>
</property>
<!-- nn2的RPC通信地址,nn2所在地址 -->
<property>
	<name>dfs.namenode.rpc-address.ns1.nn2</name>
	<value>bigdata-02:8020</value>
</property>
<!-- nn2的http通信地址,外部訪問地址 -->
<property>
	<name>dfs.namenode.http-address.ns1.nn2</name>
	<value>bigdata-02:50070</value>
</property>
<!-- 指定NameNode的元數據在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->
<property>
	<name>dfs.namenode.shared.edits.dir</name>
	<value>qjournal://bigdata-01:8485;bigdata-02:8485;bigdata-03:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
	<name>dfs.journalnode.edits.dir</name>
	<value>/opt/modules/App/hadoop-2.5.0/data/journal</value>
</property>
<!--客戶端通過代理訪問namenode,訪問文件系統,HDFS 客戶端與Active 節點通信的Java 類,使用其確定Active 節點是否活躍  -->
<property>
	<name>dfs.client.failover.proxy.provider.ns1</name>
	<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--這是配置自動切換的方法,有多種使用方法,具體可以看官網,在文末會給地址,這里是遠程登錄殺死的方法  -->
<property>
	<name>dfs.ha.fencing.methods</name>
	<value>sshfence</value>     ----這個參數的值可以有多種,你也可以換成shell(/bin/true)試試,也是可以的,這個腳本do nothing 返回0
</property>
<!-- 這個是使用sshfence隔離機制時才需要配置ssh免登陸 -->
<property>
	<name>dfs.ha.fencing.ssh.private-key-files</name>
	<value>/home/beifeng/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間,這個屬性同上,如果你是用腳本的方法切換,這個應該是可以不配置的 -->
<property>
	<name>dfs.ha.fencing.ssh.connect-timeout</name>
	<value>30000</value>
</property>
<!-- 這個是開啟自動故障轉移,如果你沒有自動故障轉移,這個可以先不配 -->
<property>
	<name>dfs.ha.automatic-failover.enabled</name>
	<value>true</value>
</property>
</configuration>

mapred-site.xml

<configuration>
<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
</property>
<property>
	<name>mapreduce.jobhistory.address</name>
	<value>bigdata-01:10020</value>
</property>
<property>
	<name>mapreduce.jobhistory.webapp.address</name>
	<value>bigdata-01:19888</value>
</property>
</configuration>

yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
	<property>
        <name>yarn.resourcemanager.hostname</name>
        <value>bigdata-03</value>
    </property>
	<property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
		<property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>106800</value>
    </property>
</configuration>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM