복붙노트

[HADOOP] 다른 폴더에 출력 작성하기 hadoop

HADOOP

다른 폴더에 출력 작성하기 hadoop

다른 파일에 쓰려면 hadoop에서 multipleoutputs 기능을 사용할 수 있지만 둘 다 같은 출력 폴더로 이동합니다.

나는 각각의 파일을 동일한 축소판에서 다른 폴더로 쓰려고합니다.

이 작업을 수행 할 수있는 방법이 있습니까?

예를 들어 "hello / testfile"을 두 번째 인수로 넣으려고하면 잘못된 인수가 표시됩니다. 그래서 나는 다른 폴더에 쓸 수 없다.

도와주세요.

미리 감사드립니다.

답장을 보내 주셔서 감사합니다. 위의 방법을 사용하여 파일을 성공적으로 읽을 수 있습니다. 하지만 분산 모드에서는 그렇게 할 수 없습니다. 감속기에서는 세트:

mos.getCollector ( "data", reporter) .collect (새 텍스트 (str_key), 새 텍스트 (str_val));

(다중 출력 사용 및 작업 구성 : 나는

FileInputFormat.setInputPaths (conf2, "/ home / users / mlakshm / opchk285 / data-r-00000 *");

만큼 잘

FileInputFormat.setInputPaths (conf2, "/ home / users / mlakshm / opchk285 / data *");

그러나 다음과 같은 오류가 발생합니다.

cause:org.apache.hadoop.mapred.InvalidInputException: Input Pattern hdfs://mentat.cluster:54310/home/users/mlakshm/opchk295/data-r-00000* matches 0 files

해결법

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

    1.MultipleOutputs 코드를 코드베이스에 복사하고 허용되는 문자에 대한 제한을 느슨하게하십시오. 어쨌든 제한에 대한 유효한 이유를 볼 수 없습니다.

    MultipleOutputs 코드를 코드베이스에 복사하고 허용되는 문자에 대한 제한을 느슨하게하십시오. 어쨌든 제한에 대한 유효한 이유를 볼 수 없습니다.

  2. ==============================

    2.질문 1 : 출력 파일을 다른 디렉토리에 쓰는 중 - 다음 방법을 사용하여 수행 할 수 있습니다.

    질문 1 : 출력 파일을 다른 디렉토리에 쓰는 중 - 다음 방법을 사용하여 수행 할 수 있습니다.

    1. MultipleOutputs 클래스 사용 :

    MultipleOutputs를 사용하여 여러 개의 명명 된 출력 파일을 만들 수 있다는 점이 좋습니다. 알다시피, 우리는 이것을 드라이버 코드에 추가해야합니다.

    MultipleOutputs.addNamedOutput(job, "OutputFileName", OutputFormatClass, keyClass, valueClass);
    

    API는 이것을 달성하기 위해 두 가지 오버로드 된 쓰기 메소드를 제공합니다.

    multipleOutputs.write("OutputFileName", new Text(Key), new Text(Value));
    

    이제 별도의 출력 디렉토리에 출력 파일을 작성하려면 기본 출력 경로에 대한 추가 매개 변수로 오버로드 된 write 메소드를 사용해야합니다.

    multipleOutputs.write("OutputFileName", new Text(key), new Text(value), baseOutputPath);
    

    각 구현에서 baseOutputPath를 변경해야합니다.

    2. 드라이버 클래스의 파일 이름 바꾸기 / 이동 :

    이것은 아마도 여러 디렉토리에 출력을 쓰는 가장 쉬운 해킹 일 것입니다. multipleOutputs를 사용하고 모든 출력 파일을 단일 출력 디렉토리에 작성하십시오. 그러나 파일 이름은 각 범주마다 달라야합니다.

    세 가지 다른 출력 파일 세트를 만들고 싶다고 가정 해 봅시다. 첫 번째 단계는 이름이 지정된 출력 파일을 드라이버에 등록하는 것입니다.

    MultipleOutputs.addNamedOutput(job, "set1", OutputFormatClass, keyClass, valueClass);
    MultipleOutputs.addNamedOutput(job, "set2", OutputFormatClass, keyClass, valueClass);
    MultipleOutputs.addNamedOutput(job, "set3", OutputFormatClass, keyClass, valueClass);
    

    또한 실제 출력 디렉토리와 함께 드라이버 코드에서 원하는 다른 디렉토리 나 디렉토리 구조를 만드십시오.

    Path set1Path = new Path("/hdfsRoot/outputs/set1");
    Path set2Path = new Path("/hdfsRoot/outputs/set2");
    Path set3Path = new Path("/hdfsRoot/outputs/set3");
    

    마지막으로 중요한 단계는 이름을 기반으로 출력 파일의 이름을 바꾸는 것입니다. 작업이 성공적이면;

    FileSystem fileSystem = FileSystem.get(new Configuration);
    if (jobStatus == 0) {
    
            // Get the output files from the actual output path 
            FileStatus outputfs[] = fileSystem.listStatus(outputPath);
    
            // Iterate over all the files in the output path
            for (int fileCounter = 0; fileCounter < outputfs.length; fileCounter++) {
    
                // Based on each fileName rename the path.
                if (outputfs[fileCounter].getPath().getName().contains("set1")) {
                    fileSystem.rename(outputfs[fileCounter].getPath(), new Path(set1Path+"/"+anyNewFileName));
                } else if (outputfs[fileCounter].getPath().getName().contains("set2")) {
                    fileSystem.rename(outputfs[fileCounter].getPath(), new Path(set2Path+"/"+anyNewFileName));
                } else if (outputfs[fileCounter].getPath().getName().contains("set3")) {
                    fileSystem.rename(outputfs[fileCounter].getPath(), new Path(set3Path+"/"+anyNewFileName));
                }
            }
        }
    

    주 : 우리는 하나의 디렉토리에서 다른 디렉토리로 파일을 이동시키기 때문에 작업에 상당한 오버 헤드가 추가되지는 않습니다. 특정 접근 방식을 선택하는 것은 구현의 성격에 달려 있습니다.

    요약하면이 방법은 기본적으로 동일한 출력 디렉토리에 다른 이름을 사용하는 모든 출력 파일을 쓰고 작업이 성공적으로 완료되면 기본 출력 경로의 이름을 바꾸고 다른 출력 디렉토리로 파일을 이동합니다.

    질문 2 : 입력 폴더에서 특정 파일 읽기 :

    MultipleInputs 클래스를 사용하여 디렉토리에서 특정 입력 파일을 확실히 읽을 수 있습니다.

    입력 경로 / 파일 이름에 따라 입력 파일을 해당 Mapper 구현에 전달할 수 있습니다.

    사례 1 : 모든 입력 파일이 단일 디렉토리에있는 경우 :

    FileStatus inputfs[] = fileSystem.listStatus(inputPath);
    for (int fileCounter = 0; fileCounter < inputfs.length; fileCounter++) {
        if (inputfs[fileCounter].getPath().getName().contains("set1")) {
            MultipleInputs.addInputPath(job, inputfs[fileCounter].getPath(), TextInputFormat.class, Set1Mapper.class);
        } else if (inputfs[fileCounter].getPath().getName().contains("set2")) {
            MultipleInputs.addInputPath(job, inputfs[fileCounter].getPath(), TextInputFormat.class, Set2Mapper.class);
        } else if (inputfs[fileCounter].getPath().getName().contains("set3")) {
            MultipleInputs.addInputPath(job, inputfs[fileCounter].getPath(), TextInputFormat.class, Set3Mapper.class);
        }   
    }
    

    사례 2 : 모든 입력 파일이 단일 디렉토리에없는 경우 :

    입력 파일이 다른 디렉토리에 있더라도 기본적으로 위의 동일한 방법을 사용할 수 있습니다. 기본 입력 경로를 반복하고 파일 경로 이름에서 일치하는 기준을 확인하십시오.

    또는 파일이 완전히 다른 위치에있는 경우 가장 간단한 방법은 여러 입력에 개별적으로 추가하는 것입니다.

    MultipleInputs.addInputPath(job, Set1_Path, TextInputFormat.class, Set1Mapper.class);
    MultipleInputs.addInputPath(job, Set2_Path, TextInputFormat.class, Set2Mapper.class);
    MultipleInputs.addInputPath(job, Set3_Path, TextInputFormat.class, Set3Mapper.class);
    

    희망이 도움이! 고맙습니다.

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

    3.예. 입력 형식이 특정 파일 만 처리하도록 지정할 수 있습니다.

    예. 입력 형식이 특정 파일 만 처리하도록 지정할 수 있습니다.

    FileInputFormat.setInputPaths(job, "/path/to/folder/testfile*");
    

    코드를 수정하면 작업 완료시 _SUCCESS 파일을 두 폴더에 모두 작성해야합니다. 이는 필수 사항은 아니지만 다른 사람이 해당 폴더의 출력이 완료되었는지 여부를 확인할 수있는 마카니즘입니다. 오류로 인해 '잘 렸습니다'.

  4. ==============================

    4.네, 그렇게 할 수 있습니다. 감속기에서 나오는 특정 키 / 값 쌍에 대한 파일 이름을 생성하기 만하면됩니다.

    네, 그렇게 할 수 있습니다. 감속기에서 나오는 특정 키 / 값 쌍에 대한 파일 이름을 생성하기 만하면됩니다.

    메서드를 재정의하면 가져온 키 / 값 쌍에 따라 파일 이름을 반환 할 수 있습니다. 그 방법을 보여주는 링크가 있습니다.

    https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFMQFjAA&url=https%3A%2F%2Fsites.google.com%2Fsite%2Fhadoopandhive%2Fhome%2Fhow-to-write-output-to-multiple-named-files-in-hadoop-using-multipletextoutputformat&ei=y7YBULarN8iIrAf4iPSOBg&usg=AFQjCNHbd8sRwlY1-My2gNYI0yqw4254YQ

  5. from https://stackoverflow.com/questions/11480858/writing-output-to-different-folders-hadoop by cc-by-sa and MIT license