복붙노트

[HADOOP] 프로그래밍 텍스트 파일의 내용은 HDFS 사용하여 Java에 저장 읽어 들이기

HADOOP

프로그래밍 텍스트 파일의 내용은 HDFS 사용하여 Java에 저장 읽어 들이기

어떻게 HDFS에서 디렉토리 / 단어에 저장된 텍스트 파일에서 바이트를 읽을 수있는이 간단한 자바 프로그램을 실행합니까? 내가 할 목적으로 jar 파일을 작성해야합니까? 제안하십시오.

      import java.io.*;
      import java.net.MalformedURLException;
      import java.net.URL;
      import org.apache.hadoop.*;
      import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    public class filesystemhdfs 
    {
     public static void main(String args[]) throws MalformedURLException, IOException
     {

        byte[] b=null;
    InputStream in=null;
    in=new URL("hdfs://localhost/words/file").openStream();
    in.read(b);
    System.out.println(""+b);
     for(int i=0;i<b.length;i++)
     {
        System.out.println("b[i]=%d"+b[i]);
        System.out.println(""+(char)b[i]);
     }

    }
   }

해결법

  1. ==============================

    1.당신은 HDFS API를 사용할 수 있습니다,이 지역에서 실행할 수 있습니다 :

    당신은 HDFS API를 사용할 수 있습니다,이 지역에서 실행할 수 있습니다 :

    Configuration configuration = new Configuration();
            configuration.set("fs.defaultFS", "hdfs://namenode:8020");
            FileSystem fs = FileSystem.get(configuration);
    Path filePath = new Path(
                    "hdfs://namenode:8020/PATH");
    
            FSDataInputStream fsDataInputStream = fs.open(filePath);
    
  2. ==============================

    2.첫째, 당신은 URL을 오브젝트의 HDFS 방식에 대한 JVM을 말할 필요가있다. 이를 통해 이루어집니다 :

    첫째, 당신은 URL을 오브젝트의 HDFS 방식에 대한 JVM을 말할 필요가있다. 이를 통해 이루어집니다 :

    URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    

    자바 클래스를 컴파일 한 후에는 하둡 명령을 사용합니다 :

    hadoop filesystemhdfs
    

    하둡은 편리한 IOUtils와 함께 제공됩니다. 그것은 당신을 위해 물건을 많이 완화됩니다.

  3. ==============================

    3.일반 파일 시스템에 자바가 지원하는 당신은 HDFS에서 파일을 읽을 수 없습니다. 당신은이에 대한 HDFS 자바 API를 사용해야합니다.

    일반 파일 시스템에 자바가 지원하는 당신은 HDFS에서 파일을 읽을 수 없습니다. 당신은이에 대한 HDFS 자바 API를 사용해야합니다.

    public static void main(String a[]) {
         UserGroupInformation ugi
         = UserGroupInformation.createRemoteUser("root");
    
         try {
    
    
            ugi.doAs(new PrivilegedExceptionAction<Void>() {
    
                public Void run() throws Exception {
    
                   Configuration conf = new Configuration();
                        //fs.default.name should match the corresponding value 
                        // in your core-site.xml in hadoop cluster
                    conf.set("fs.default.name","hdfs://hostname:9000");
                    conf.set("hadoop.job.ugi", "root");
    
                     readFile("words/file",conf) 
    
                    return null;
                }
            });
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    
     public static void readFile(String file,Configuration conf) throws IOException {
        FileSystem fileSystem = FileSystem.get(conf);
    
        Path path = new Path(file);
        if (!ifExists(path)) {
            System.out.println("File " + file + " does not exists");
            return;
        }
    
        FSDataInputStream in = fileSystem.open(path);
    
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String line = null;
        while((line = br.readLine())!= null){
            System.out.println(line);
        }
        in.close();
        br.close();
        fileSystem.close();
     }
       public static boolean ifExists(Path source) throws IOException {
    
        FileSystem hdfs = FileSystem.get(conf);
        boolean isExists = hdfs.exists(source);
        System.out.println(isExists);
        return isExists;
     }
    

    내가 PrivilegedExceptionAction와의 실행 방법에 UserGroupInformation 및 쓰기 코드를 사용하고 여기 왜 내가 원격 시스템에서 시도하고, 그입니다. 로컬 시스템에있는 경우에 당신은 그것을 필요로하지 않을 수 있습니다. HTH!

  4. from https://stackoverflow.com/questions/22020286/programatically-reading-contents-of-text-file-stored-in-hdfs-using-java by cc-by-sa and MIT license