hadoop集羣之間的hdfs文件拷貝

一、背景

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

若是是兩個都沒有作安全認證的集羣互傳文件,使用distcp能夠很快實現。經過查閱資料,在cdh的官網上居然有這麼神奇的一個參數能夠解決這麼一個奇葩的需求。傳送門:http://www.cloudera.com/documentation/enterprise/5-5-x/topics/cdh_admin_distcp_secure_insecure.htmljava

二、實現

2.1 Copying Data between two Insecure cluster

兩個都沒有作安全認證的集羣,一般方法以下:node

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

也能夠經過webhdfs的方式:web

$ 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)。apache

distcp的一些參數以下:跨域

-i:忽略失敗(不建議開啓)
-log <logdir>:記錄日誌到 <logdir>
-m <num_maps>:同時拷貝的最大數目(指定了拷貝數據時map的數目。請注意並非map數越多吞吐量越大。)
-overwrite:覆蓋目標(若是一個map失敗而且沒有使用-i選項,不單單那些拷貝失敗的文件,這個分塊任務中的全部文件都會被從新拷貝。 就像下面提到的,它會改變生成目標路徑的語義,因此 用戶要當心使用這個選項。)
-update:若是源和目標的大小不同則進行覆蓋
-f <urilist_uri>:使用<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執行以下命令:bash

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

在我實際操做過程當中,兩個集羣都有作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

解決以下:session

把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作跨域的配置。本文暫不研究討論。

相關文章
相關標籤/搜索