2014-09-22 4 views
4

У меня есть следующая тестовая программа для чтения файла из HDFS.MalformedURLException при чтении файла из HDFS

public class FileReader { 
    public static final String NAMENODE_IP = "172.32.17.209"; 
    public static final String FILE_PATH = "/notice.html"; 

    public static void main(String[] args) throws MalformedURLException, 
      IOException { 
     String url = "hdfs://" + NAMENODE_IP + FILE_PATH; 

     InputStream is = new URL(url).openStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line = br.readLine(); 
     while(line != null) { 
      System.out.println(line); 
      line = br.readLine(); 
     } 
    } 
} 

Это дает обработчик Url java.net.MalformedURLException

Exception in thread "main" java.net.MalformedURLException: unknown protocol: hdfs 
    at java.net.URL.<init>(URL.java:592) 
    at java.net.URL.<init>(URL.java:482) 
    at java.net.URL.<init>(URL.java:431) 
    at in.ksharma.hdfs.FileReader.main(FileReader.java:29) 

ответ

6

Регистрация Hadoop в. Стандартный обработчик Url не будет знать, как обрабатывать hdfs: // схему.

Попробуйте это:

public static void main(String[] args) throws MalformedURLException, 
      IOException { 
     URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); 

     String url = "hdfs://" + NAMENODE_IP + FILE_PATH; 

     InputStream is = new URL(url).openStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line = br.readLine(); 
     while(line != null) { 
      System.out.println(line); 
      line = br.readLine(); 
     } 
    } 
+0

Я пробовал этот код, но все еще получаю исключение: 'unlnown protocol: hdfs'. Пожалуйста, дайте мне знать, как вы это решили. – user182944

1

я получаю тот же вопрос, при написании приложения Java для чтения с HDFS на Hadoop 2.6. Мое решение: Добавить

hadoop-2.X/share/hadoop/hdfs/hadoop-hdfs-2.X.jar to your classpath. 
+0

Это необходимый шаг для удаления ошибки. Я не вижу причин, почему это было отклонено. Работал для меня. –

1

В нашем случае мы должны были объединить его с другой ответ:
https://stackoverflow.com/a/21118824/1549135

Так во-первых в нашей HDFS настройки класса (Scala code):

val hadoopConfig: Configuration = new Configuration() 
hadoopConfig.set("fs.hdfs.impl", classOf[DistributedFileSystem].getName) 
hadoopConfig.set("fs.file.impl", classOf[LocalFileSystem].getName) 

И позже, как в принятом ответе:
https://stackoverflow.com/a/25971334/1549135

URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory) 
Try(new URL(path)) 

Примечание стороны:

Мы уже имел: в наших зависимости "org.apache.hadoop" % "hadoop-hdfs" % "2.8.0" и это не помогло.

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