2017-02-18 4 views
0

Все, что я пытаюсь сделать, - это создать каталог в HDFS, используя Java программно. Я получаю эту ошибку. Исключение в потоке "главный" java.util.ServiceConfigurationError: org.apache.hadoop.fs.FileSystem: Поставщик org.apache.hadoop.fs.s3a.S3AFileSystem не может быть созданHadoop 2.7 - Простой код Java для создания каталога в HDFS

Вызванный: java.lang. NoClassDefFoundError: ком/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 jars, развернутые в вашем кластере. Вы можете скачать aws-java-sdk от http://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip. Затем вам нужно разархивировать его и скопировать каждую банку в aws-java-sdk/lib/и aws-java-sdk/third-party/в ваши datanodes.

Другим варианта заключается в создании убера банки и включить эту зависимость прямо в банку через мавена:

<!-- 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 является локальным, и все, что я пытаюсь сделать, - создать папку в HDFS с помощью java-программы. My Hadoop находится в локальной виртуальной машине в Ubuntu 14. – Suri

1

ах, это ошибка фиксируется некоторое время назад в HADOOP-12636, которая относится к Java API службы и пути к классам. Hadoop 2.7.2 перечисляет все доступные классы реализации файловой системы в JAR, и здесь не удается из-за проблем переходного класса.

Если вы уронили Hadoop-AWS JAR с вашего CP это уйдет, или просто перейти на Hadoop 2.7.3

+0

Спасибо большое Стив – Suri

Смежные вопросы