hadoop不同版本之间的集群复制

hadoop不同版本之间的集群复制。

1.基础

使用hadoop distcp 来进行集群间的数据复制。

2.实战

如果两个集群之间版本不一样,应该这样来复制。

hadoop  distcp   hftp://source/source  hdfs://dest:9000/source

为啥是hftp呢,因为不同版本rpc不太一样。

如果一个集群闲置,尽量使用它的MR能力。有一个要注意,在这个集群里

目标nn尽量采用ip地址。为啥,你试试就知道,用hostname多麻烦了。

还遇到这个错,引以为鉴。

  1. ERROR org.apache.hadoop.mapred.JobHistory: Failed creating job history log file for job job_201308261457_000  
  2. 5  
  3. java.net.UnknownHostException: unknown host: namenode2  
  4.         at org.apache.hadoop.ipc.Client$Connection.<init>(Client.java:216)  
  5.         at org.apache.hadoop.ipc.Client.getConnection(Client.java:1154)  
  6.         at org.apache.hadoop.ipc.Client.call(Client.java:1010)  
  7.         at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:224)  
  8.         at $Proxy5.getProtocolVersion(Unknown Source)  
  9.         at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:364)  
  10.         at org.apache.hadoop.hdfs.DFSClient.createRPCNamenode(DFSClient.java:106)  
  11.         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:208)  
  12.         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:175)  
  13.         at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:89)  
  14.         at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1310)  


 

如果文件过大,过多,不建议直接复制,建议采用脚本文件遍历目录,导出单个复制小目录的批命令。

python脚本如下(临时脚本,未优化,请保函)

[python] view plain copy
  1. #!/usr/bin/env python  
  2.   
  3. import sys, os, time, atexit, string  
  4. from signal import SIGTERM  
  5. def list_dir(exec_cmd,s_dir):  
  6.     tmp=[]  
  7.     tmps = os.popen(exec_cmd +s_dir).read().strip().split("\n")  
  8.     for tmp_sline in tmps  :  
  9.         if "-" in tmp_sline:  
  10.            sitem=tmp_sline.split(" ")  
  11.            tmp.append(sitem)  
  12.     return tmp  
  13.        
  14. dir="/data/dw/"  
  15. cmd="/opt/modules/hadoop/hadoop-0.20.203.0/bin/hadoop fs -ls hdfs://192.168.1.99:9000"#目标集群  
  16. cmd2="/opt/modules/hadoop/hadoop-0.20.203.0/bin/hadoop fs -ls hdfs://source:9000"#源集群  
  17. lines = list_dir(cmd2,dir)#sort  
  18. for line in lines  :  
  19.     if "-" in line:  
  20.        slines= list_dir(cmd2,line[-1])#year  
  21.        print "/opt/modules/hadoop/hadoop-0.20.203.0/bin/hadoop fs -mkdir hdfs://192.168.1.99:9000%s"%line[-1].replace("data/","data/  
  22. sbak/") #复制前建上级目录  
  23.        for sline in slines  :  
  24.            if "-" in sline:  
  25.               print "/opt/modules/hadoop/hadoop-0.20.203.0/bin/hadoop  distcp   hftp://source:50070%s hdfs://192.168.1.  
  26. 99:9000%s"%(sline[-1],line[-1].replace("data/","data/sbak/"))  




下面是原创

14/07/30 16:47:20 INFO mapreduce.Job:  map 0% reduce 0%
14/07/30 16:47:33 INFO mapreduce.Job:  map 100% reduce 0%
14/07/30 16:47:34 INFO mapreduce.Job: Task Id : attempt_1406708172793_0010_m_000000_1, Status : FAILED
Error: java.io.IOException: File copy failed: hftp://hadoop11/in/word --> hdfs://192.168.1.129:9000/in3/word
 at org.apache.hadoop.tools.mapred.CopyMapper.copyFileWithRetry(CopyMapper.java:262)
 at org.apache.hadoop.tools.mapred.CopyMapper.map(CopyMapper.java:229)
 at org.apache.hadoop.tools.mapred.CopyMapper.map(CopyMapper.java:45)
 at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
 at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
 at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
 at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
 at java.security.AccessController.doPrivileged(Native Method)
 at javax.security.auth.Subject.doAs(Subject.java:415)
 at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
 at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)
Caused by: java.io.IOException: Couldn't run retriable-command: Copying hftp://hadoop11/in/word to hdfs://192.168.1.129:9000/in3/word
 at org.apache.hadoop.tools.util.RetriableCommand.execute(RetriableCommand.java:101)
 at org.apache.hadoop.tools.mapred.CopyMapper.copyFileWithRetry(CopyMapper.java:258)
 ... 10 more
Caused by: java.io.IOException: Check-sum mismatch between hftp://hadoop11/in/word and hdfs://192.168.1.129:9000/in3/.distcp.tmp.attempt_1406708172793_0010_m_000000_1. Source and target differ in block-size. Use -pb to preserve block-sizes during copy. Alternatively, skip checksum-checks altogether, using -skipCrc. (NOTE: By skipping checksums, one runs the risk of masking data-corruption during file-transfer.)
 at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.compareCheckSums(RetriableFileCopyCommand.java:190)
 at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.doCopy(RetriableFileCopyCommand.java:125)
 at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.doExecute(RetriableFileCopyCommand.java:95)
 at org.apache.hadoop.tools.util.RetriableCommand.execute(RetriableCommand.java:87)
 ... 11 more


解决方式:


<property>
<name>dfs.checksum.type</name>
<value>CRC32<value>
</property>

mac@vip.126.com 2014/7/30 17:04:00

source:50070    dest: 9000


 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值