s3 dist cp建立在Hadoop AWS库之上,该库不支持使用现成的加速桶。
您希望自己制作一个依赖于Hadoop AWS和Amazon-SDK-S3的JAR,在那里转换所需参数,并扩展S3ClientFactory以实现加速上载。
Maven依赖项示例:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-aws</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
S3客户工厂:
public class AcceleratedS3ClientFactory extends DefaultS3ClientFactory {
@Override
protected AmazonS3 newAmazonS3Client(AWSCredentialsProvider credentials, ClientConfiguration awsConf) {
AmazonS3ClientBuilder s3Builder = AmazonS3ClientBuilder
.standard()
.withRegion("s3-accelerate.amazonaws.com")
.enableAccelerateMode();
s3Builder.setCredentials(credentials);
s3Builder.setClientConfiguration(awsConf);
return s3Builder.build();
}
@Override
public AmazonS3 createS3Client(URI name) throws IOException {
AmazonS3 s3 = super.createS3Client(name);
// load below bucket name from step configuration as well
s3.setBucketAccelerateConfiguration("bucket-name",
new BucketAccelerateConfiguration(BucketAccelerateStatus.Enabled));
return s3;
}
}
最后一步是为Hadoop提供S3工厂类:
<property>
<name>fs.s3a.s3.client.factory.impl</name>
<value>example_package.AcceleratedS3ClientFactory</value>
</property>
这也可以从命令行中完成,因此您可以直接在EMR接口或EMR SDK中指定它。
对于副本本身,可以使用Hadoop
文件实用程序.copy
API,您可以在那里指定源和目标,以及所需的配置。
对于某些特定的文件格式,或者不是基于fs的源或目标,spark可以考虑使用上述实用程序。在某些情况下,它可以使传输更快。
现在您可以向EMR发送JAR步骤:
aws emr add-steps --cluster-id cluster_id \
--steps Type=CUSTOM_JAR,Name="a step name",Jar=s3://app/my-s3distcp-1.0.jar,\
Args=["key","value"]
注:
不要指定Hadoop AWS支持的特定于bucket的端点。它以与加速不兼容的方式使用,每次都会得到相同的异常。
链接: