hadoop集群間的hdfs文件拷貝


1、背景

部門有個需求,在網絡互通的情況下,把現有的hadoop集群(未做Kerberos認證,集群名為:bd-stg-hadoop)的一些hdfs文件拷貝到新的hadoop集群(做了Kerberos認證,集群名為zp-tt-hadoop)

如果是兩個都沒有做安全認證的集群互傳文件,使用distcp可以很快實現。在當前情況下,情況可能要復雜一些。通過查閱資料,在cdh的官網上竟然有這么神奇的一個參數可以解決這樣的需求。傳送門:http://www.cloudera.com/documentation/enterprise/5-5-x/topics/cdh_admin_distcp_secure_insecure.html

2、實現

2.1 Copying Data between two Insecure cluster

兩個都沒有做安全認證的集群,通常方法如下:

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

也可以通過webhdfs的方式:

$ hadoop distcp webhdfs://nn1:8020/foo/bar  webhdfs://nn2:8020/bar/foo

對於不同Hadoop版本間的拷貝,用戶應該使用HftpFileSystem。 這是一個只讀文件系統,所以DistCp必須運行在目標端集群上。 源的格式是

hftp://<dfs.http.address>/<path> (默認情況dfs.http.address是 <namenode>:50070)。

distcp的一些參數如下:

-i:忽略失敗(不建議開啟)
-log:記錄日志到 <logdir>
-m:同時拷貝的最大數目(指定了拷貝數據時map的數目。請注意並不是map數越多吞吐量越大。)
-overwrite:覆蓋目標(如果一個map失敗並且沒有使用-i選項,不僅僅那些拷貝失敗的文件,這個分塊任務中的所有文件都會被重新拷貝。 就像下面提到的,它會改變生成目標路徑的語義,所以 用戶要小心使用這個選項。)
-update:如果源和目標的大小不一樣則進行覆蓋
-f:使用<urilist_uri> 作為源文件列表

2.2 Copying Data between a Secure and an Insecure

在secure-cluster上的core-site.xml配置文件中添加:

<property> 
  <name>ipc.client.fallback-to-simple-auth-allowed</name>
  <value>true</value> 
</property>

然后在secure-cluster執行如下命令:

distcp webhdfs://insecureCluster webhdfs://secureCluster 
distcp webhdfs://secureCluster webhdfs://insecureCluster 

在我實際操作過程中,兩個集群hdfs都有做ha,使用上面的命令會報錯:

16/09/27 14:47:52 ERROR tools.DistCp: Exception encountered 
java.lang.IllegalArgumentException: java.net.UnknownHostException: bd-stg-hadoop
	at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:374)
	at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:392)
	at org.apache.hadoop.hdfs.web.WebHdfsFileSystem.initialize(WebHdfsFileSystem.java:167)
	at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2643)
	at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:93)
	at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2680)
	at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2662)
	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:379)
	at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
	at org.apache.hadoop.tools.GlobbedCopyListing.doBuildListing(GlobbedCopyListing.java:76)
	at org.apache.hadoop.tools.CopyListing.buildListing(CopyListing.java:86)
	at org.apache.hadoop.tools.DistCp.createInputFileListing(DistCp.java:365)
	at org.apache.hadoop.tools.DistCp.execute(DistCp.java:171)
	at org.apache.hadoop.tools.DistCp.run(DistCp.java:122)
	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
	at org.apache.hadoop.tools.DistCp.main(DistCp.java:429)
Caused by: java.net.UnknownHostException: bd-stg-hadoop

解決如下:

把bd-stg-hadoop集群名字改成了active-namenode的host再進行操作,如下:

$ hadoop distcp webhdfs://bd-stg-namenode-138/tmp/hivebackup/app/app_stg_session webhdfs://zp-tt-hadoop:8020/tmp/hivebackup/app/app_stg_session

成功執行后, 可以發現原理就是啟動一個只有map的MapReduce作業來實現兩個集群間的數據復制。

2.3 Copying Data between two Secure cluster

這種情況相對有些復雜了,需要Kerberos做跨域的配置。本文暫不研究討論。


免責聲明!

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



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