복붙노트

[HADOOP] Java를 사용하여 Hadoop에서 오프셋 된 파일을 읽는 방법

HADOOP

Java를 사용하여 Hadoop에서 오프셋 된 파일을 읽는 방법

문제점 : HDFS에서 파일의 한 부분을 읽고 1000 줄의 파일에서 101-120 줄과 같이 반환하고 싶습니다.

나는 그것이 비싸다는 것을 읽었 기 때문에 추구를 사용하고 싶지 않다.

의미있는 데이터 집합을 처리하기 위해 PIG를 사용하는 로그 파일이 있습니다. 필자는 프런트 엔드에서 소비 및 표시 할 데이터를 반환하는 API를 작성했습니다. 처리 된 데이터 세트는 충분히 커서 Hadoop에서 전체 파일을 한 번에 읽고 싶지 않아 전선의 시간과 대역폭을 절약 할 수 있습니다. (5 - 10MB라고 가정 해 봅시다)

현재 BufferedReader를 사용하여 정상적으로 작동하는 작은 요약 파일을 반환합니다.

ArrayList lines = new ArrayList();
...
for (FileStatus item: items) {
    // ignoring files like _SUCCESS
    if(item.getPath().getName().startsWith("_")) {
        continue;
    }           

    in = fs.open(item.getPath());
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    String line;
    line = br.readLine();
    while (line != null) {
        line = line.replaceAll("(\\r|\\n)", "");
        lines.add(line.split("\t"));
        line = br.readLine();
    }
}

나는 스택뿐만 아니라 꽤 많은 interwebs 주위에 찔렀다. 그러나 내가 필요한 것을 정확하게 발견하지 않았다.

아마도이 작업을 수행하는 것은 완전히 잘못된 방법이며이를 관리하기 위해 완전히 별도의 코드 세트와 다른 기능이 필요합니다. 의견을 제시하십시오.

감사!

아래의 토론에서 연구에 근거하여 추가 된 것처럼 : Hadoop은 블록 경계를 넘어 레코드 레코드를 어떻게 처리합니까? Hadoop FileSplit 읽기

해결법

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

    1.SEEK는 방대한 양의 파일을 읽는 최선의 선택이라고 생각합니다. 내가 읽었던 데이터의 양이 2 ~ 3GB의 범위에 있었기 때문에 문제가되지 않았습니다. 오늘까지 어떤 문제도 발생하지 않았지만 큰 데이터 세트를 처리하기 위해 파일 분할을 사용했습니다. 아래는 목적을 읽고 목적으로 사용할 수있는 코드입니다.

    SEEK는 방대한 양의 파일을 읽는 최선의 선택이라고 생각합니다. 내가 읽었던 데이터의 양이 2 ~ 3GB의 범위에 있었기 때문에 문제가되지 않았습니다. 오늘까지 어떤 문제도 발생하지 않았지만 큰 데이터 세트를 처리하기 위해 파일 분할을 사용했습니다. 아래는 목적을 읽고 목적으로 사용할 수있는 코드입니다.

    public class HDFSClientTesting {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    
      try{
    
     //System.loadLibrary("libhadoop.so");
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        conf.addResource(new Path("core-site.xml"));
    
    
        String Filename = "/dir/00000027";
        long ByteOffset = 3185041;
    
    
    
        SequenceFile.Reader rdr = new SequenceFile.Reader(fs, new Path(Filename), conf);
        Text key = new Text();
        Text value = new Text();
    
        rdr.seek(ByteOffset);
        rdr.next(key,value);
        //Plain text
        JSONObject jso = new JSONObject(value.toString());
        String content = jso.getString("body");
        System.out.println("\n\n\n" + content + "\n\n\n");
    
        File file =new File("test.gz");
        file.createNewFile();
    
    }
      catch (Exception e ){
        throw new RuntimeException(e);
    
    }
     finally{
    
     } 
    
      }
    
    }
    
  2. from https://stackoverflow.com/questions/24064178/how-to-read-files-with-an-offset-from-hadoop-using-java by cc-by-sa and MIT license