1. 程式人生 > >HDFS_資料遷移&節點遷移

HDFS_資料遷移&節點遷移

一、資料遷移

  1. 使用場景:

    ① 冷熱叢集資料分類儲存
    ② 叢集資料整體搬遷
    ③ 資料的準實時同步,目的在於資料的雙備份可用

  2. 資料遷移要素考量:

    ① 頻寬Bandwidth:需要限流

    ② 效能Performance:採用單機程式還是分散式程式?

    ③ 增量同步Data-Increment:原始資料檔案進行了追加寫、原始資料檔案被刪除或重新命名
    在海量資料儲存系統如HDFS中,一般不會在原始檔內容上做修改,要麼繼續追加寫,要麼刪除檔案。所以 做增量資料同步,只要考慮上述兩個條件即可
    判斷追加寫:
    1)先比較檔案大小,如果兩個階段檔案大小發生改變,說明檔案在內容上已經發生變更,變更的型別有兩類。擷取對應原始長度部分進行checksum(校驗和)比較,如果一致,則此檔案發生了追加寫。不一致,則說明檔案在原內容上也已經改變
    2)如果檔案大小一致,則計算相應的checksum,然後進行比較

    ④ 資料遷移的同步性
    資料遷移解決方案:DistCp
    1) DistCp支援頻寬限流,可以通過引數bandwidth來控制
    2) 增量同步資料,通過update、append、diff這3個引數來控制
    ·Update:更新目標路徑,只拷貝相對於源端,目標端不存在的檔案或目錄
    ·Append:追加寫目標路徑下已經存在的檔案,如果這個檔案在源端已經發生了追加寫操作
    ·Diff:通過快照的diff對比資訊來同步源路徑與目標路徑
    ·高效的效能:執行的分散式特性(純map任務構成的job)、高效的MR元件
    Hadoop DistCp命令:

    distcp OPTIONS [-source_path···] <target_path>
    

    OPTIONS
    -append //拷貝檔案時支援對現有檔案進行追加寫操作
    -async //非同步執行distcp拷貝任務
    -bandwidth //對每個map任務的頻寬限速
    -delete //刪除相對於源端,目標端多出來的檔案
    -diff //通過快照diff資訊進行資料的同步
    -overrite //以覆蓋的方式進行拷貝,如果目標端檔案已經存在,則直接進行覆蓋
    -p //拷貝資料時,擴充套件屬性資訊的保留,包括許可權資訊、塊大小資訊等等
    -skipcrccheck //拷貝資料時是否跳過校驗和的校驗
    -update //拷貝資料時,只拷貝相對於源端,目標端不存在的檔案資料
    其中source_path、target_path需要帶上地址字首以區分不同的叢集:

    hadoop distcp hdfs://nn1:8020/foo/a hdfs://nn2:8020/bar/foo
    

二、DataNode節點遷移

  1. 目標:
    將原DataNode所在節點的機器從A機房換到B機房,其中會涉及主機名和ip地址的改變,需要保證資料不發生丟失

  2. 相關知識:
    機器遷移將使該節點停止心跳,如果超過心跳檢查時間,將被認為是死節點,從而發生大量塊複製現象。為了使得短時間內不成為死節點,需要人工把心跳超時檢查時間設大。

    <name>dfs.namenode.heartbeat.recheck-interval</name>
    <value>10800000</value>  #3小時
    

    執行以下操作使得配置生效:
    ① 更新standby namenode的hdfs-site.xml的配置,並重啟
    ② 等待standby namenode退出safemode之後,再stop active namenode,更新配置並重啟
    此種方案只適用於DataNode不涉及主機名和IP地址變化的情況

  3. DataNode更換主機名、IP地址時的遷移方案
    ① 停止叢集hdfs相關的服務,最好把YARN相關的服務也停止
    ② 修改HDFS叢集名稱相關配置
    core-site.xml:

    <name>fs.defaultFS</name>
        <value>hdfs://clusterA</value>
        <final>true</final>
    

    yarn-site.xml:

    <name>yarn.resourcemanager.fs.state-store.uri</name>
        <value>hdfs://clusterA/logs/yarn/rmstore</value>
    

    hdfs-site.xml:

    <name>dfs.nameservices</name>
        <value>clusterA</value>
    
    <name>dfs.ha.namenodes.clusterA</name>
        <value>nn1,nn2</value>
    
    <name>dfs.namenode.rpc-address.clusterA.nn1</name>
        <value>clusternn1:9000</value>
    
    <name>dfs.namenode.rpc-address.clusterA.nn2</name>
        <value>clusternn2:9000</value>
    
    <name>dfs.namenode.http-address.clusterA.nn1</name>
        <value>clusternn1:50070</value>
    
    <name>dfs.namenode.http-address.clusterA.nn2</name>
        <value>clusternn2:50070</value>
    
    <name>dfs.client.failover.proxy.provider.clusterA</name>
         <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    

    ③ 重新格式化HDFS所依賴的znode

    hdfs zkfc -formatZK
    

    ④ 重啟HDFS相關服務,執行hadoop的fs命令是否可用,最後啟動YARN 服務,並提交一個wordcount任務到YARN上做測試