Distcpの件


[TOC]
魂拷問:あなたは本当にdistcpを知っていますか?ここで言うのはdistcpのことです
背景
今日ノートを整理している時、何編もの臨時記録が記録されているクラスタ間のファイルコピーに注意すべき点を発見しました.記録されているものとポイントは違いますが、コアのものはdistcp関連なので、やはり少しまとめる必要があるような気がします.この文章の内容は主に細部の問題で、もっと重点を置いているのは リファレンスアドレスです.
概要
まず、distcpとは何でしょうか.文字通りdistributed copy( )です.つまり、もともと一人でやっていたことを、多くの人に分担して並列に処理します.もちろん、このタスクの分業の粒度はファイルに基づいています.つまり、1つのファイルしかありません.では、このコピーはせいぜい一人でしかできません.
基本的な使い方
#     hdfs  (   hadoop),     hftp  (    hadoop  )
hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo
#                
hadoop distcp hdfs://nn1:8020/foo/bar1 hdfs://nn2:8020/foo/bar2 hdfs://nn3:8020/bar/foo
#       -f ,       -file        source                 

パラメータの説明
ここでは各パラメータの中国語の意味を一つ一つ翻訳しないで、基本的にはどのような意味を直訳することができます.ここでは主に使用上注意しなければならないと思います.
[yourFather@hadoop-onedata ~]$ hadoop distcp --help
usage: distcp OPTIONS [source_path...] 
              OPTIONS
 -append                Reuse existing data in target files and append new
                        data to them if possible
 -async                 Should distcp execution be blocking
 -atomic                Commit all changes or none
 -bandwidth        Specify bandwidth per map in MB
 -delete                Delete from target, files missing in source
 -diff             Use snapshot diff report to identify the
                        difference between source and target
 -f                List of files that need to be copied
 -filelimit        (Deprecated!) Limit number of files copied to <= n
 -i                     Ignore failures during copy
 -log              Folder on DFS where distcp execution logs are
                        saved
 -m                Max number of concurrent maps to use for copy
 -mapredSslConf    Configuration for ssl config file, to use with
                        hftps://
 -overwrite             Choose to overwrite target files unconditionally,
                        even if they exist.
 -p                preserve status (rbugpcaxt)(replication,
                        block-size, user, group, permission,
                        checksum-type, ACL, XATTR, timestamps). If -p is
                        specified with no , then preserves
                        replication, block size, user, group, permission,
                        checksum type and timestamps. raw.* xattrs are
                        preserved when both the source and destination
                        paths are in the /.reserved/raw hierarchy (HDFS
                        only). raw.* xattrpreservation is independent of
                        the -p flag. Refer to the DistCp documentation for
                        more details.
 -sizelimit        (Deprecated!) Limit number of files copied to <= n
                        bytes
 -skipcrccheck          Whether to skip CRC checks between source and
                        target paths.
 -strategy         Copy strategy to use. Default is dividing work
                        based on file sizes
 -tmp              Intermediate work path to be used for atomic
                        commit
 -update                Update target, copying only missingfiles or
                        directories
  • --append,--overwrite,--update間の関係
  • パラメータ
    説明する
    コメント
    append
    追加、sinkファイルが既に存在するデータを多重化し、データの追加を試み、基準TODOを判断する
    overwrite
    以前に存在するかどうかにかかわらず、上書きは再生成されます.
    update
    更新、判断基準はsourceとsinkファイルサイズが一致するかどうか
  • -m

  • これはよく説明されていますが、distcpのためにmapreduceモデルを使用するべきで、sqoopと少し似ています.だから-mは-mapです.並列度です. 個のmapを起動して同時にコピーします.なぜ一番多いのでしょうか.コピーはファイルベース(厳密にはblock)なので、1つのファイルを複数のコピーに分解するのは少し難しいに違いありません.だから、sourceが1つのファイルしかない場合、-mは何個を指定しますか.コピータスクを実行するmap taskは1つしかありません
  • -i

  • 失敗を無視するということは、コピータスクが重い場合、リソースが緊張している場合に途中で失敗する可能性が高いなどですが、タスクを再起動するたびに全量コピーを再開するわけではありません.ここでは、失敗を無視し、後続の実行時の再増分コピーを考慮することができます.
  • -strategy

  • コピーポリシーの問題です.デフォルトはファイルのサイズに応じてタスクを分割します.オプションのパラメータはdynamic|uniformで、デフォルトはコピータスクごとに同じバイト数をコピーします.
  • -p

  • コピー、blockサイズ、ユーザー権限など、ターゲットシステムに保存されているファイルのstatusという意味ですが、デフォルトではターゲットシステムと一致しています
  • -bandwidth

  • 明らかに、帯域幅の大きさであり、distcpは計算ロジックがなく、io密集型タスクに属しているため、クラスタ移行の際に帯域幅の使用を厳格に制御する必要がある.このパラメータはmapの使用帯域幅を制御することであり、distcpタスクの個数とdistcpタスクのmap個数を制限すれば、全体の移行プログラムの帯域幅の使用を制御することができる.
    QA
    ここに記録されているのは、私が使用している間に出会った小さな問題で、必ずしも原理の最適化の問題ではなく、使用上疑問や曖昧さが生じる可能性がある場所です.
    Q 1:コピーしたときにデータが衝突した場合、どのような結果になりますか?A 1:soureに同じ名前のファイルが表示された場合、distcpタスクが失敗し、エラーログが印刷されます.ターゲットディレクトリにコピーするファイルがすでに存在する場合、デフォルトではソースファイルのコピータスクは無視されます.もちろん、エラーを設定することもできます.別のプロセスでターゲットファイルにデータを書き込むと、ログが間違って印刷されます.
    Q 2:distcpのタスク配置位置に要求はありますか?A 2:distcpタスクを実行するノードまたはtaskが上下流にアクセスしてインタラクションできることだけを要求すればよいが,配置の場所は要求されず,実際にはターゲットクラスタのノードに配置されるのが一般的である.
    Q 3:distcpタスクビッグデータの移行に注意することは何ですか?A 3:distcpタスクは大きなioのタスクであるため、帯域幅は制限要因であり、クラスタマシン帯域幅を監視するスクリプトを書き、空き時間に移行タスクを開始することができます.
    ふろく
    #   1:                ,      ,  
    time hadoop distcp hdfs://nn1:8020/user/hive/warehouse/${database}.db/${table}/dt=${partition}  hdfs://nn2:8020/user/hive/warehouse/${database}.db/${table} >> /logs/distcp/${database}.log
    
    #   2:      
    hadoop distcp \
        -Dmapred.jobtracker.maxtasks.per.job=1800000 \   #    map (     map  )
        -Dmapred.job.max.map.running=4000 \              #  map  
        -Ddistcp.bandwidth=150000000 \                   #  
        -Ddfs.replication=2 \                            #    ,   
        -Ddistcp.skip.dir=$skipPath \                    #     (      )
        -Dmapred.map.max.attempts=9 \                    #  task      
        -Dmapred.fairscheduler.pool=distcp \             #       pool
        -pugp \                                          #    (  , ,  )
        -i \                                             #     task
        -skipcrccheck \                                  #  CRC  (   ,    hdfs           。)
        hdfs://clusterA:9000/AAA/data  \                 #   
        hdfs://clusterB:9000/BBB/data                    #    
        
    #   3:      ,   dfs.http.address    
    hadoop distcp -numListstatusThreads 40 -update -delete -prbugpaxtq hftp://nn1:50070/source hdfs://cluster2/target

    参照リンク:
  • hadoop移行
  • 分散コピー

  • 記録が少し急いでいますが、間違いがあれば、ご指摘ください.