2013-05-31 31 views
5

Tôi đang cố gắng sử dụng distcp để sao chép một thư mục từ cụm hadoop cục bộ (cdh4) vào thùng Amazon S3 của tôi.DistCp từ Local Hadoop đến Amazon S3

tôi sử dụng lệnh sau:

hadoop distcp -log /tmp/distcplog-s3/ hdfs://nameserv1/tmp/data/sampledata s3n://hdfsbackup/ 

hdfsbackup là tên của Amazon S3 Bucket của tôi.

DistCp không thành công với ngoại lệ máy chủ chưa biết:

13/05/31 11:22:33 INFO tools.DistCp: srcPaths=[hdfs://nameserv1/tmp/data/sampledata] 
13/05/31 11:22:33 INFO tools.DistCp: destPath=s3n://hdfsbackup/ 
     No encryption was performed by peer. 
     No encryption was performed by peer. 
13/05/31 11:22:35 INFO hdfs.DFSClient: Created HDFS_DELEGATION_TOKEN token 54 for hadoopuser on ha-hdfs:nameserv1 
13/05/31 11:22:35 INFO security.TokenCache: Got dt for hdfs://nameserv1; Kind: HDFS_DELEGATION_TOKEN, Service: ha-hdfs:nameserv1, Ident: (HDFS_DELEGATION_TOKEN token 54 for hadoopuser) 
     No encryption was performed by peer. 
java.lang.IllegalArgumentException: java.net.UnknownHostException: hdfsbackup 
    at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:414) 
    at org.apache.hadoop.security.SecurityUtil.buildDTServiceName(SecurityUtil.java:295) 
    at org.apache.hadoop.fs.FileSystem.getCanonicalServiceName(FileSystem.java:282) 
    at org.apache.hadoop.fs.FileSystem.collectDelegationTokens(FileSystem.java:503) 
    at org.apache.hadoop.fs.FileSystem.addDelegationTokens(FileSystem.java:487) 
    at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:130) 
    at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:111) 
    at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.java:85) 
    at org.apache.hadoop.tools.DistCp.setup(DistCp.java:1046) 
    at org.apache.hadoop.tools.DistCp.copy(DistCp.java:666) 
    at org.apache.hadoop.tools.DistCp.run(DistCp.java:881) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) 
    at org.apache.hadoop.tools.DistCp.main(DistCp.java:908) 
Caused by: java.net.UnknownHostException: hdfsbackup 
    ... 14 more 

Tôi có ID AWS/Bí mật cấu hình trong lõi-site.xml của tất cả các nút.

<!-- Amazon S3 --> 
<property> 
    <name>fs.s3.awsAccessKeyId</name> 
    <value>MY-ID</value> 
</property> 

<property> 
    <name>fs.s3.awsSecretAccessKey</name> 
    <value>MY-SECRET</value> 
</property> 


<!-- Amazon S3N --> 
<property> 
    <name>fs.s3n.awsAccessKeyId</name> 
    <value>MY-ID</value> 
</property> 

<property> 
    <name>fs.s3n.awsSecretAccessKey</name> 
    <value>MY-SECRET</value> 
</property> 

Tôi có thể sao chép tệp từ hdfs bằng lệnh cp mà không gặp bất kỳ sự cố nào. Lệnh dưới đây sao chép thành công vào thư mục HDFS để S3

hadoop fs -cp hdfs://nameserv1/tmp/data/sampledata s3n://hdfsbackup/ 

Tôi biết có Amazon S3 distcp tối ưu hóa (s3distcp) có sẵn, nhưng tôi không muốn sử dụng nó vì nó không hỗ trợ cập nhật/tùy chọn ghi đè.

Trả lời

2

Dường như bạn đang sử dụng bảo mật Kerberos, và tiếc là các công việc Map/Reduce không thể truy cập Amazon S3 hiện tại nếu Kerberos được bật. Bạn có thể xem thêm chi tiết trong MAPREDUCE-4548.

Họ thực sự có một bản vá mà nên sửa chữa nó nhưng không phải là hiện một phần của bất kỳ phân phối Hadoop, vì vậy nếu bạn có một cơ hội để sửa đổi và xây dựng Hadoop từ nguồn đây là những gì bạn nên làm:


Index: core/org/apache/hadoop/security/SecurityUtil.java 
=================================================================== 
--- core/org/apache/hadoop/security/SecurityUtil.java (révision 1305278) 
+++ core/org/apache/hadoop/security/SecurityUtil.java (copie de travail) 
@@ -313,6 +313,9 @@ 
    if (authority == null || authority.isEmpty()) { 
     return null; 
    } 
+ if (uri.getScheme().equals("s3n") || uri.getScheme().equals("s3")) { 
+  return null; 
+ } 
    InetSocketAddress addr = NetUtils.createSocketAddr(authority, defPort); 
    return buildTokenService(addr).toString(); 
    } 

Vé được cập nhật lần cuối vài ngày trước, vì vậy hy vọng điều này sẽ sớm được chính thức vá.

Một giải pháp dễ dàng hơn là chỉ cần tắt Kerberos, nhưng điều đó có thể không thực hiện được trong môi trường của bạn.

Tôi đã thấy rằng bạn có thể làm điều này nếu nhóm của bạn được đặt tên giống như tên miền, nhưng tôi chưa thử và ngay cả khi công việc này nghe có vẻ giống như một hack.

+0

Cảm ơn, tôi nghi ngờ đây là vấn đề liên quan đến bảo mật dựa trên một vấn đề khác (https://issues.apache.org/jira/browse/HADOOP-8408) có cùng một ngăn xếp ngoại lệ tương tự. – Mohamed

+0

Đổi tên nhóm để xem tên miền của dòng không hoạt động đối với tôi. Bản vá đã khắc phục được sự cố. – Mohamed