We are trying to setup Cloudera 5.5 where HDFS will be working on s3 only for that we have already configured the necessory properties in Core-site.xml
<
The problem is not with the location of the jars.
The problem is with the setting:
<property>
<name>fs.AbstractFileSystem.s3a.impl</name>
<value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
<description>The FileSystem for S3A Filesystem</description>
</property>
This setting is not needed. Because of this setting, it is searching for following constructor in S3AFileSystem
class and there is no such constructor:
S3AFileSystem(URI theUri, Configuration conf);
Following exception clearly tells that it is unable to find a constructor for S3AFileSystem
with URI
and Configuration
parameters.
java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.fs.s3a.S3AFileSystem.<init>(java.net.URI, org.apache.hadoop.conf.Configuration)
To resolve this problem, remove fs.AbstractFileSystem.s3a.impl
setting from core-site.xml
. Just having fs.s3a.impl
setting in core-site.xml
should solve your problem.
EDIT:
org.apache.hadoop.fs.s3a.S3AFileSystem
just implements FileSystem
.
Hence, you cannot set value of fs.AbstractFileSystem.s3a.impl
to org.apache.hadoop.fs.s3a.S3AFileSystem
, since org.apache.hadoop.fs.s3a.S3AFileSystem
does not implement AbstractFileSystem
.
I am using Hadoop 2.7.0 and in this version s3A
is not exposed as AbstractFileSystem
.
There is JIRA ticket: https://issues.apache.org/jira/browse/HADOOP-11262 to implement the same and the fix is available in Hadoop 2.8.0.
Assuming, your jar has exposed s3A
as AbstractFileSystem
, you need to set the following for fs.AbstractFileSystem.s3a.impl
:
<property>
<name>fs.AbstractFileSystem.s3a.impl</name>
<value>org.apache.hadoop.fs.s3a.S3A</value>
</property>
That will solve your problem.