감소 단계 후 출력 파일 병합
mapreduce에서 각 축소 작업은 part-r-nnnnn 이라는 파일에 출력을 작성합니다. 여기서 nnnnn 은 축소 작업과 관련된 파티션 ID입니다. 않는 지도 축소 / 다음 파일을 병합? 그렇다면 어떻게?
파일 병합을 직접 수행하는 대신 다음을 호출하여 축소 출력 파일의 전체 병합을 위임 할 수 있습니다.
hadoop fs -getmerge /output/dir/on/hdfs/ /desired/local/output/file.txt
참고 이것은 HDFS 파일을 로컬로 결합합니다. 실행하기 전에 충분한 디스크 공간이 있는지 확인하십시오.
아니요, 이러한 파일은 Hadoop에 의해 병합되지 않습니다. 가져 오는 파일 수는 감소 작업 수와 동일합니다.
다음 작업을위한 입력으로 필요한 경우 별도의 파일을 갖는 것에 대해 걱정하지 마십시오. 다음 작업에 대한 입력으로 전체 디렉토리를 지정하기 만하면됩니다.
클러스터 외부의 데이터가 필요한 경우 일반적으로 클러스터에서 데이터를 가져올 때 수신 측에서 병합합니다.
예를 들면 다음과 같습니다.
hadoop fs -cat /some/where/on/hdfs/job-output/part-r-* > TheCombinedResultOfTheJob.txt
이것이 HDFS에서 파일을 병합하는 데 사용할 수있는 기능입니다.
public boolean getMergeInHdfs(String src, String dest) throws IllegalArgumentException, IOException {
FileSystem fs = FileSystem.get(config);
Path srcPath = new Path(src);
Path dstPath = new Path(dest);
// Check if the path already exists
if (!(fs.exists(srcPath))) {
logger.info("Path " + src + " does not exists!");
return false;
}
if (!(fs.exists(dstPath))) {
logger.info("Path " + dest + " does not exists!");
return false;
}
return FileUtil.copyMerge(fs, srcPath, fs, dstPath, false, config, null);
}
원본 및 대상으로 텍스트 파일 전용 및 HDFS의 경우 아래 명령을 사용하십시오.
hadoop fs -cat /input_hdfs_dir/* | hadoop fs -put - /output_hdfs_file
이렇게하면의 모든 파일이 연결 input_hdfs_dir
되고 output_hdfs_file
. 임시 파일이 생성되지 않고 UNIX pe를 사용하여 즉석에서 발생하더라도 모든 데이터는 로컬 시스템으로 다시 가져온 다음 hdfs에 다시 업로드됩니다.
또한 Avro, ORC 등과 같은 텍스트가 아닌 파일에서는 작동하지 않습니다.
바이너리 파일의 경우 다음과 같이 할 수 있습니다 (디렉토리에 Hive 테이블이 매핑 된 경우).
insert overwrite table tbl select * from tbl
구성에 따라 파일을 더 많이 만들 수도 있습니다. 단일 파일을 만들려면 명시 적으로 사용하여 감속기 수를 1로 mapreduce.job.reduces=1
설정하거나 hive 속성을 hive.merge.mapredfiles=true
.
part-r-nnnnn 파일은 중간에 'r'로 지정된 축소 단계 후에 생성됩니다. 이제 하나의 감속기가 실행 중이면 part-r-00000과 같은 출력 파일이 생깁니다. 감속기의 수가 2 개이면 part-r-00000과 part-r-00001 등을 갖게됩니다. Hadoop 프레임 워크가 Commodity Machines 에서 실행되도록 설계 되었기 때문에 출력 파일이 너무 커서 시스템 메모리에 맞지 않으면 파일이 분할됩니다. MRv1에 따라 로직에서 작동하는 감속기는 20 개로 제한됩니다. 구성 파일 mapred-site.xml 에서 사용자 정의해야 할 사항이 더 많지만 동일해야 할 수도 있습니다 . 귀하의 질문에 대해 말하기; getmerge를 사용하거나 드라이버 코드에 다음 문을 포함하여 감속기 수를 1로 설정할 수 있습니다.
job.setNumReduceTasks(1);
이것이 귀하의 질문에 답하기를 바랍니다.
추가 map / reduce 작업을 실행할 수 있습니다. 여기서 map and reduce는 데이터를 변경하지 않고 파티 셔 너는 모든 데이터를 단일 감속기에 할당합니다.
이전 답변 외에도 몇 분 전에 시도한 답변이 하나 더 있습니다. 아래에 주어진 코드와 같은 CustomOutputFormat 을 사용할 수 있습니다.
public class VictorOutputFormat extends FileOutputFormat<StudentKey,PassValue> {
@Override
public RecordWriter<StudentKey,PassValue> getRecordWriter(
TaskAttemptContext tac) throws IOException, InterruptedException {
//step 1: GET THE CURRENT PATH
Path currPath=FileOutputFormat.getOutputPath(tac);
//Create the full path
Path fullPath=new Path(currPath,"Aniruddha.txt");
//create the file in the file system
FileSystem fs=currPath.getFileSystem(tac.getConfiguration());
FSDataOutputStream fileOut=fs.create(fullPath,tac);
return new VictorRecordWriter(fileOut);
}
}
마지막에서 네 번째 줄을보세요. 출력 파일 이름으로 내 이름을 사용했으며 15 개의 감속기로 프로그램을 테스트했습니다. 여전히 파일은 동일하게 유지됩니다. 따라서 두 개 이상의 파일이 아닌 단일 출력 파일을 얻는 것이 가능하지만 출력 파일의 크기가 기본 메모리의 크기를 초과해서는 안됩니다. 즉, 출력 파일이 상용 기계의 메모리에 맞아야합니다. 출력 파일 분할에 문제가 있습니다. 감사!!
Why not use a pig script like this one for merging partition files:
stuff = load "/path/to/dir/*"
store stuff into "/path/to/mergedir"
If the files have header, you can get rid of it of by doing this:
hadoop fs -cat /path/to/hdfs/job-output/part-* | grep -v "header" > output.csv
then add the header manually for output.csv
. Does map/reduce merge these files?
No. It does not merge.
You can use IdentityReducer to achieve your goal.
Performs no reduction, writing all input values directly to the output.
public void reduce(K key,
Iterator<V> values,
OutputCollector<K,V> output,
Reporter reporter)
throws IOException
Writes all keys and values directly to output.
Have a look at related SE posts:
hadoop: difference between 0 reducer and identity reducer?
참고URL : https://stackoverflow.com/questions/5700068/merge-output-files-after-reduce-phase
'Programing' 카테고리의 다른 글
LaTeX로 타임 라인을 만드는 방법은 무엇입니까? (0) | 2020.10.21 |
---|---|
RoR-MD5 세대 (0) | 2020.10.21 |
iPhone에서 UIViewController를 팝업으로 표시 (0) | 2020.10.21 |
JQ : 여러 조건 선택 (0) | 2020.10.21 |
Firefox 4 : 필수 양식 입력에서 빨간색 테두리를 제거하는 방법이 있습니까? (0) | 2020.10.21 |