2017-02-18 152 views
0

我所要做的就是在编程上使用Java在HDFS中创建一个目录。 我收到此错误。螺纹 异常 “主要” java.util.ServiceConfigurationError:org.apache.hadoop.fs.FileSystem:提供org.apache.hadoop.fs.s3a.S3AFileSystem无法实例Hadoop 2.7 - 在HDFS中创建目录的简单Java代码

产生的原因:java.lang中。 NoClassDefFoundError:com/amazonaws/AmazonServiceException 导致:java.lang.ClassNotFoundException:com.amazonaws.AmazonServiceException

不确定这里所有这些Amazon S3来自哪里。请帮忙。

这是代码。这是Hadoop的2.7

package tas.module1; 


import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.BlockLocation; 
import org.apache.hadoop.fs.FSDataInputStream; 
import org.apache.hadoop.fs.FSDataOutputStream; 
import org.apache.hadoop.fs.FileStatus; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 


public class JavaClient { 

public JavaClient() { 

} 

public static void main(String[] args) throws IOException { 

    JavaClient jc = new JavaClient(); 
    Configuration config = new Configuration(); 
     config.addResource(new Path("/usr/local/hadoop-2.7.1/etc/hadoop/core-site.xml")); 
     config.addResource(new Path("/usr/local/hadoop-2.7.1/etc/hadoop/hdfs-site.xml")); 

     config.set("fs.hdfs.impl", 
       org.apache.hadoop.hdfs.DistributedFileSystem.class.getName() 
      ); 
      config.set("fs.file.impl", 
       org.apache.hadoop.fs.LocalFileSystem.class.getName() 
      ); 
     FileSystem dfs = FileSystem.get(config); 
     String dirName = "TestDirectory"; 
     System.out.println(dfs.getWorkingDirectory() +" this is from /n/n"); 
     Path src = new Path(dfs.getWorkingDirectory()+"/"+dirName); 

     dfs.mkdirs(src); 



System.out.println("created dir"); 

    dfs.close(); 

} 
} 

回答

0

看来你缺少涉及与S3文件系统工作的一些依赖。为了使用它,您需要在您的群集中部署aws java sdk jar。您可以从http://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip下载aws-java-sdk。然后,您需要解压缩它,并将aws-java-sdk/lib /和aws-java-sdk/third-party /中的每个jar复制到您的datanode。

另一种选择是直接通过行家创造尤伯杯罐子,包括这种依赖关系到你的罐子:

<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk --> 
<dependency> 
    <groupId>com.amazonaws</groupId> 
    <artifactId>aws-java-sdk</artifactId> 
    <version>1.11.91</version> 
</dependency> 
+0

嗨, 感谢您的答复。 问题是为什么我得到这个AWS S3相关的错误消息,因为我的hadoop伪集群是本地的,我所尝试的是使用java程序在HDFS中创建一个文件夹。 我的Hadoop在Ubuntu 14的本地虚拟机中。 – Suri

1

啊,这是固定前阵子在HADOOP-12636了一个问题,涉及到Java服务API和类路径。 Hadoop 2.7.2枚举了JAR中所有可用的文件系统实现类,并且由于暂时的类路径问题而在此处失败。

如果你把从CP类Hadoop AWS JAR会随风而逝,或者只是升级到Hadoop的2.7.3

+0

感谢Steve – Suri